Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/utils/src/G4EmConfigurator.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/electromagnetic/utils/src/G4EmConfigurator.cc (Version 11.3.0) and /processes/electromagnetic/utils/src/G4EmConfigurator.cc (Version 10.2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
                                                   >>  26 // $Id: G4EmConfigurator.cc 91745 2015-08-04 11:51:12Z gcosmo $
 26 //                                                 27 //
 27 // -------------------------------------------     28 // -------------------------------------------------------------------
 28 //                                                 29 //
 29 // GEANT4 Class                                    30 // GEANT4 Class 
 30 //                                                 31 //
 31 // File name:     G4EmConfigurator                 32 // File name:     G4EmConfigurator
 32 //                                                 33 //
 33 // Author:        Vladimir Ivanchenko              34 // Author:        Vladimir Ivanchenko
 34 //                                                 35 //
 35 // Creation date: 14.07.2008                       36 // Creation date: 14.07.2008
 36 //                                                 37 //
 37 // Modifications:                                  38 // Modifications:
 38 //                                                 39 //
 39 // Class Description:                              40 // Class Description:
 40 //                                                 41 //
 41 // This class provides configuration EM models     42 // This class provides configuration EM models for 
 42 // particles/processes/regions                     43 // particles/processes/regions
 43 //                                                 44 //
 44                                                    45 
 45 // -------------------------------------------     46 // -------------------------------------------------------------------
 46 //                                                 47 //
 47                                                    48 
 48 #include "G4EmConfigurator.hh"                     49 #include "G4EmConfigurator.hh"
 49 #include "G4EmUtility.hh"                      << 
 50 #include "G4SystemOfUnits.hh"                      50 #include "G4SystemOfUnits.hh"
 51 #include "G4ParticleTable.hh"                      51 #include "G4ParticleTable.hh"
 52 #include "G4ParticleDefinition.hh"                 52 #include "G4ParticleDefinition.hh"
 53 #include "G4ProcessManager.hh"                     53 #include "G4ProcessManager.hh"
 54 #include "G4VProcess.hh"                           54 #include "G4VProcess.hh"
 55 #include "G4ProcessVector.hh"                      55 #include "G4ProcessVector.hh"
 56 #include "G4RegionStore.hh"                        56 #include "G4RegionStore.hh"
 57 #include "G4Region.hh"                             57 #include "G4Region.hh"
 58 #include "G4DummyModel.hh"                         58 #include "G4DummyModel.hh"
 59 #include "G4VEnergyLossProcess.hh"                 59 #include "G4VEnergyLossProcess.hh"
 60 #include "G4VEmProcess.hh"                         60 #include "G4VEmProcess.hh"
 61 #include "G4VMultipleScattering.hh"                61 #include "G4VMultipleScattering.hh"
 62 #include "G4TransportationWithMsc.hh"          << 
 63                                                    62 
 64 //....oooOO0OOooo........oooOO0OOooo........oo     63 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 65                                                    64 
 66 G4EmConfigurator::G4EmConfigurator(G4int val):     65 G4EmConfigurator::G4EmConfigurator(G4int val):verbose(val)
 67 {                                                  66 {
 68   index = -10;                                     67   index = -10;
 69 }                                                  68 }
 70                                                    69 
 71 //....oooOO0OOooo........oooOO0OOooo........oo     70 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 72                                                    71  
 73 G4EmConfigurator::~G4EmConfigurator() = defaul <<  72 G4EmConfigurator::~G4EmConfigurator()
                                                   >>  73 {}
 74                                                    74 
 75 //....oooOO0OOooo........oooOO0OOooo........oo     75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 76                                                    76 
 77 void G4EmConfigurator::SetExtraEmModel(const G     77 void G4EmConfigurator::SetExtraEmModel(const G4String& particleName,
 78                                        const G     78                                        const G4String& processName,
 79                                        G4VEmMo     79                                        G4VEmModel* mod,
 80                                        const G     80                                        const G4String& regionName,
 81                                        G4doubl     81                                        G4double emin,
 82                                        G4doubl     82                                        G4double emax,
 83                                        G4VEmFl     83                                        G4VEmFluctuationModel* fm)
 84 {                                                  84 {
 85   if(nullptr == mod) { return; }               << 
 86   if(1 < verbose) {                                85   if(1 < verbose) {
 87     G4cout << " G4EmConfigurator::SetExtraEmMo     86     G4cout << " G4EmConfigurator::SetExtraEmModel " << mod->GetName()
 88            << " for " << particleName              87            << " for " << particleName 
 89            << " and " << processName               88            << " and " << processName 
 90            << " in the region <" << regionName     89            << " in the region <" << regionName
 91            << "> Emin(MeV)= " << emin/MeV          90            << "> Emin(MeV)= " << emin/MeV
 92            << " Emax(MeV)= " << emax/MeV           91            << " Emax(MeV)= " << emax/MeV
 93            << G4endl;                              92            << G4endl;
 94   }                                                93   }
 95                                                <<  94   if(mod) {
 96   models.push_back(mod);                       <<  95     models.push_back(mod);
 97   flucModels.push_back(fm);                    <<  96     flucModels.push_back(fm);
 98   G4double emin0 = std::max(emin, mod->LowEner <<  97     emax = std::min(emax, mod->HighEnergyLimit());
 99   G4double emax0 = std::min(emax, mod->HighEne <<  98     mod->SetActivationHighEnergyLimit(emax);
100   mod->SetActivationHighEnergyLimit(emax0);    <<  99   } else {
                                                   >> 100     models.push_back(new G4DummyModel());
                                                   >> 101     flucModels.push_back(0);
                                                   >> 102   }
101                                                   103 
102   particles.push_back(particleName);              104   particles.push_back(particleName);
103   processes.push_back(processName);               105   processes.push_back(processName);
104   regions.push_back(regionName);                  106   regions.push_back(regionName);
105   lowEnergy.push_back(emin0);                  << 107   lowEnergy.push_back(emin);
106   highEnergy.push_back(emax0);                 << 108   highEnergy.push_back(emax);
107 }                                                 109 }
108                                                   110 
109 //....oooOO0OOooo........oooOO0OOooo........oo    111 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
110                                                   112 
111 void G4EmConfigurator::AddModels()                113 void G4EmConfigurator::AddModels()
112 {                                                 114 {
113   size_t n = models.size();                       115   size_t n = models.size();
114   if(1 < verbose) {                            << 116   if(0 < verbose) {
115     G4cout << "### G4EmConfigurator::AddModels    117     G4cout << "### G4EmConfigurator::AddModels n= " << n << G4endl;
116   }                                               118   }
117   if(n > 0) {                                     119   if(n > 0) {
118     for(size_t i=0; i<n; ++i) {                   120     for(size_t i=0; i<n; ++i) {
119       if(nullptr != models[i]) {               << 121       if(models[i]) {
120         const G4Region* reg = G4EmUtility::Fin << 122         G4Region* reg = FindRegion(regions[i]);
121         if(nullptr != reg) {                   << 123         if(reg) {
122           --index;                                124           --index;
123           SetModelForRegion(models[i],flucMode    125           SetModelForRegion(models[i],flucModels[i],reg,
124                             particles[i],proce    126                             particles[i],processes[i],
125                             lowEnergy[i],highE    127                             lowEnergy[i],highEnergy[i]);
126         }                                         128         }
127       }                                           129       }
128     }                                             130     }
129   }                                               131   }
130   Clear();                                        132   Clear();
131 }                                                 133 }
132                                                   134 
133 //....oooOO0OOooo........oooOO0OOooo........oo    135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
134                                                   136 
135 void G4EmConfigurator::SetModelForRegion(G4VEm    137 void G4EmConfigurator::SetModelForRegion(G4VEmModel* mod,
136                                          G4VEm    138                                          G4VEmFluctuationModel* fm,
137                                          const << 139                                          G4Region* reg,
138                                          const    140                                          const G4String& particleName,
139                                          const    141                                          const G4String& processName,
140                                          G4dou    142                                          G4double emin, G4double emax)
141 {                                                 143 {
142   if(nullptr == mod) { return; }               << 
143   if(1 < verbose) {                               144   if(1 < verbose) {
144     G4cout << " G4EmConfigurator::SetModelForR    145     G4cout << " G4EmConfigurator::SetModelForRegion: " << mod->GetName() 
145            << G4endl;                             146            << G4endl;
146     G4cout << " For " << particleName             147     G4cout << " For " << particleName 
147            << " and " << processName              148            << " and " << processName 
148            << " in the region <" << reg->GetNa    149            << " in the region <" << reg->GetName()
149            << " Emin(MeV)= " << emin/MeV          150            << " Emin(MeV)= " << emin/MeV
150            << " Emax(MeV)= " << emax/MeV;         151            << " Emax(MeV)= " << emax/MeV;
151     if(nullptr != fm) { G4cout << " FLmodel "  << 152     if(fm) { G4cout << " FLmodel " << fm->GetName(); }
152     G4cout << G4endl;                             153     G4cout << G4endl;
153   }                                               154   }
                                                   >> 155   G4ParticleTable::G4PTblDicIterator* theParticleIterator = 
                                                   >> 156     G4ParticleTable::GetParticleTable()->GetIterator(); 
154                                                   157 
155   // Loop checking, 03-Aug-2015, Vladimir Ivan    158   // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
156   auto myParticleIterator = G4ParticleTable::G << 159   theParticleIterator->reset();
157   myParticleIterator->reset();                 << 160   while( (*theParticleIterator)() ) {
158   while( (*myParticleIterator)() ) {           << 161     const G4ParticleDefinition* part = theParticleIterator->value();
159     const G4ParticleDefinition* part = myParti << 162 
                                                   >> 163     //G4cout << particleName << " " << part->GetParticleName() << G4endl;
160                                                   164 
161     if((part->GetParticleName() == particleNam    165     if((part->GetParticleName() == particleName) ||
162        (particleName == "all") ||                 166        (particleName == "all") ||
163        (particleName == "charged" && part->Get    167        (particleName == "charged" && part->GetPDGCharge() != 0.0)) {
164                                                   168 
165       // search for process                       169       // search for process
166       G4ProcessManager* pmanager = part->GetPr    170       G4ProcessManager* pmanager = part->GetProcessManager();
167       G4ProcessVector* plist = pmanager->GetPr    171       G4ProcessVector* plist = pmanager->GetProcessList();
168       G4int np = pmanager->GetProcessListLengt    172       G4int np = pmanager->GetProcessListLength();
169                                                   173   
170       if(1 < verbose) {                        << 174       //G4cout << processName << " in list of " << np << G4endl;
171         G4cout << "Check process <" << process << 175 
172                << np << " processes" << G4endl << 176       G4VProcess* proc = 0;
173       }                                        << 
174       G4VProcess* proc = nullptr;              << 
175       for(G4int i=0; i<np; ++i) {                 177       for(G4int i=0; i<np; ++i) {
176         if(processName == (*plist)[i]->GetProc    178         if(processName == (*plist)[i]->GetProcessName()) {
177           proc = (*plist)[i];                     179           proc = (*plist)[i];
178           break;                                  180           break;
179         }                                         181         }
180       }                                           182       }
181       if(nullptr == proc) {                    << 183       if(!proc) {
182         if(processName == "msc") {             << 184         G4cout << "### G4EmConfigurator WARNING: fails to find a process <"
183           for (G4int i = 0; i < np; ++i) {     << 185                << processName << "> for " << particleName << G4endl;
184             auto* trans = dynamic_cast<G4Trans << 186         return;        
185             if (nullptr != trans) {            << 187       } 
186               G4cout << "G4TransportationWithM << 
187               proc = trans;                    << 
188               break;                           << 
189             }                                  << 
190           }                                    << 
191         }                                      << 
192         if (nullptr == proc) {                 << 
193           if (0 < verbose) {                   << 
194             G4cout << "### G4EmConfigurator WA << 
195                    << "> for " << particleName << 
196           }                                    << 
197           return;                              << 
198         }                                      << 
199       }                                        << 
200                                                   188 
201       if(!UpdateModelEnergyRange(mod, emin, em << 189       if(mod) {
                                                   >> 190         if(!UpdateModelEnergyRange(mod, emin, emax)) { return; }
                                                   >> 191       }
202       // classify process                         192       // classify process
203       G4int ii = proc->GetProcessSubType();       193       G4int ii = proc->GetProcessSubType();
204       auto msc = dynamic_cast<G4VMscModel*>(mo << 194       if(10 == ii && mod) {
205       if (nullptr != msc) {                    << 195         G4VMultipleScattering* p = static_cast<G4VMultipleScattering*>(proc);
206         if (auto* trans = dynamic_cast<G4Trans << 196         p->AddEmModel(index,mod,reg);
207           trans->AddMscModel(msc, index, reg); << 197         if(1 < verbose) {
208           if (1 < verbose) {                   << 198           G4cout << "### Added msc model order= " << index << " for " 
209             G4cout << "### Added msc model ord << 199                  << particleName << " and " << processName << G4endl;
210                    << proc->GetProcessName() < << 200         }
211           }                                    << 201         return;
212         }                                      << 202       } else if(2 <= ii && 4 >= ii) {
213         else if (10 == ii) {                   << 203         G4VEnergyLossProcess* p = static_cast<G4VEnergyLossProcess*>(proc);
214           auto p = dynamic_cast<G4VMultipleSca << 204         if(!mod && fm) {
215           if (nullptr != p) {                  << 205           p->SetFluctModel(fm);
216             p->AddEmModel(index, msc, reg);    << 206         } else { 
217             if (1 < verbose) {                 << 207           p->AddEmModel(index,mod,fm,reg);
218               G4cout << "### Added msc model o << 208           if(1 < verbose) {
219                      << processName << G4endl; << 209             G4cout << "### Added eloss model order= " << index << " for " 
220             }                                  << 210                    << particleName << " and " << processName << G4endl;
221           }                                    << 
222         }                                      << 
223         else {                                 << 
224           G4cout << "### Unable to add msc mod << 
225                  << G4endl;                    << 
226         }                                      << 
227       }                                        << 
228       else if (2 <= ii && 4 >= ii) {           << 
229         auto p = dynamic_cast<G4VEnergyLossPro << 
230         if (nullptr != p) {                    << 
231           p->AddEmModel(index, mod, fm, reg);  << 
232           if (1 < verbose) {                   << 
233             G4cout << "### Added eloss model o << 
234                    << processName << G4endl;   << 
235           }                                    << 
236         }                                      << 
237       }                                        << 
238       else {                                   << 
239         auto p = dynamic_cast<G4VEmProcess*>(p << 
240         if (nullptr != p) {                    << 
241           p->AddEmModel(index, mod, reg);      << 
242           if (1 < verbose) {                   << 
243             G4cout << "### Added em model orde << 
244                    << processName << G4endl;   << 
245           }                                       211           }
246         }                                         212         }
247         else {                                 << 213         return;
248           G4cout << "### Unable to add em mode << 214       } else if(mod) {
249                  << G4endl;                    << 215         G4VEmProcess* p = static_cast<G4VEmProcess*>(proc);
250         }                                      << 216         p->AddEmModel(index,mod,reg);
                                                   >> 217         if(1 < verbose) {
                                                   >> 218           G4cout << "### Added em model order= " << index << " for " 
                                                   >> 219                  << particleName << " and " << processName << G4endl;
                                                   >> 220         }
                                                   >> 221         return;
                                                   >> 222       } else {
                                                   >> 223         return;
251       }                                           224       }
252       return;                                  << 
253     }                                             225     }
254   }                                               226   }
255 }                                                 227 }
256                                                   228 
257 //....oooOO0OOooo........oooOO0OOooo........oo    229 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
258                                                   230 
259 void                                              231 void 
260 G4EmConfigurator::PrepareModels(const G4Partic    232 G4EmConfigurator::PrepareModels(const G4ParticleDefinition* aParticle,
261                                 G4VEnergyLossP    233                                 G4VEnergyLossProcess* p)
262 {                                                 234 {
263   size_t n = particles.size();                    235   size_t n = particles.size();
264   if(1 < verbose) {                               236   if(1 < verbose) {
265     G4cout << " G4EmConfigurator::PrepareModel    237     G4cout << " G4EmConfigurator::PrepareModels for EnergyLoss n= " 
266            << n << G4endl;                        238            << n << G4endl;
267   }                                               239   }
268   if(n > 0) {                                     240   if(n > 0) {
269     G4String particleName = aParticle->GetPart    241     G4String particleName = aParticle->GetParticleName(); 
270     G4String processName  = p->GetProcessName(    242     G4String processName  = p->GetProcessName(); 
271     //G4cout <<  particleName << "  " <<  proc    243     //G4cout <<  particleName << "  " <<  processName << G4endl;
272     for(size_t i=0; i<n; ++i) {                   244     for(size_t i=0; i<n; ++i) {
273       //G4cout <<  particles[i] << "  " <<  pr    245       //G4cout <<  particles[i] << "  " <<  processes[i] << G4endl;
274       if(processName == processes[i]) {           246       if(processName == processes[i]) {
275         if((particleName == particles[i]) ||      247         if((particleName == particles[i]) ||
276            (particles[i] == "all") ||             248            (particles[i] == "all") ||
277            (particles[i] == "charged" && aPart    249            (particles[i] == "charged" && aParticle->GetPDGCharge() != 0.0)) {
278           const G4Region* reg = G4EmUtility::F << 250           G4Region* reg = FindRegion(regions[i]);
279           //G4cout << "Region " << reg << G4en    251           //G4cout << "Region " << reg << G4endl;
280           if(nullptr != reg) {                 << 252           if(reg) {
281             --index;                              253             --index;
282             G4VEmModel* mod = models[i];          254             G4VEmModel* mod = models[i];
283             G4VEmFluctuationModel* fm = flucMo    255             G4VEmFluctuationModel* fm = flucModels[i];
284             if(nullptr != mod) {               << 256             if(mod) {
285               if(UpdateModelEnergyRange(mod, l    257               if(UpdateModelEnergyRange(mod, lowEnergy[i], highEnergy[i])) {
286                 p->AddEmModel(index,mod,fm,reg    258                 p->AddEmModel(index,mod,fm,reg);
287                 if(1 < verbose) {                 259                 if(1 < verbose) {
288                   G4cout << "### Added eloss m << 260                   G4cout << "### Added eloss model order= " << index << " for " 
289                          << " and " << process << 261                          << particleName << " and " << processName << G4endl;
290                 }                                 262                 }
291               }                                   263               }
292             } else if(nullptr != fm) {         << 264             } else if(fm) {
293               p->SetFluctModel(fm);               265               p->SetFluctModel(fm);
294             }                                     266             }
295           }                                       267           }
296         }                                         268         }
297       }                                           269       }
298     }                                             270     }
299   }                                               271   }
300 }                                                 272 }
301                                                   273 
302 //....oooOO0OOooo........oooOO0OOooo........oo    274 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
303                                                   275 
304 void                                              276 void 
305 G4EmConfigurator::PrepareModels(const G4Partic    277 G4EmConfigurator::PrepareModels(const G4ParticleDefinition* aParticle,
306                                 G4VEmProcess*     278                                 G4VEmProcess* p)
307 {                                                 279 {
308   size_t n = particles.size();                    280   size_t n = particles.size();
309   if(1 < verbose) {                               281   if(1 < verbose) {
310     G4cout << " G4EmConfigurator::PrepareModel    282     G4cout << " G4EmConfigurator::PrepareModels for EM process n= " 
311            << n << G4endl;                        283            << n << G4endl;
312   }                                               284   }
313   if(n > 0) {                                     285   if(n > 0) {
314     G4String particleName = aParticle->GetPart    286     G4String particleName = aParticle->GetParticleName(); 
315     G4String processName  = p->GetProcessName(    287     G4String processName  = p->GetProcessName(); 
316     //G4cout <<  particleName << "  " <<  part    288     //G4cout <<  particleName << "  " <<  particleName << G4endl;
317     for(size_t i=0; i<n; ++i) {                   289     for(size_t i=0; i<n; ++i) {
318       if(processName == processes[i]) {           290       if(processName == processes[i]) {
319         if((particleName == particles[i]) ||      291         if((particleName == particles[i]) ||
320            (particles[i] == "all") ||             292            (particles[i] == "all") ||
321            (particles[i] == "charged" && aPart    293            (particles[i] == "charged" && aParticle->GetPDGCharge() != 0.0)) {
322           const G4Region* reg = G4EmUtility::F << 294           G4Region* reg = FindRegion(regions[i]);
323           //G4cout << "Region " << reg << G4en    295           //G4cout << "Region " << reg << G4endl;
324           if(nullptr != reg) {                 << 296           if(reg) {
325             --index;                              297             --index;
326             G4VEmModel* mod = models[i];          298             G4VEmModel* mod = models[i];
327             if(nullptr != mod) {               << 299             if(mod) {
328               if(UpdateModelEnergyRange(mod, l    300               if(UpdateModelEnergyRange(mod, lowEnergy[i], highEnergy[i])) { 
329                 p->AddEmModel(index,mod,reg);     301                 p->AddEmModel(index,mod,reg);
330                 if(1 < verbose) {                 302                 if(1 < verbose) {
331                   G4cout << "### Added em mode    303                   G4cout << "### Added em model order= " << index << " for " 
332                          << particleName << "     304                          << particleName << " and " << processName << G4endl;
333                 }                                 305                 }
334               }                                   306               }
335             }                                     307             }
336           }                                       308           }
337         }                                         309         }
338       }                                           310       }
339     }                                             311     }
340   }                                               312   }
341 }                                                 313 }
342                                                   314 
343 //....oooOO0OOooo........oooOO0OOooo........oo    315 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
344                                                   316 
345 void                                              317 void 
346 G4EmConfigurator::PrepareModels(const G4Partic    318 G4EmConfigurator::PrepareModels(const G4ParticleDefinition* aParticle,
347                                 G4VMultipleSca << 319                                 G4VMultipleScattering* p)
348                                 G4Transportati << 
349 {                                                 320 {
350   size_t n = particles.size();                    321   size_t n = particles.size();
351   if(1 < verbose) {                               322   if(1 < verbose) {
352     G4cout << " G4EmConfigurator::PrepareModel    323     G4cout << " G4EmConfigurator::PrepareModels for MSC process n= " 
353            << n << G4endl;                        324            << n << G4endl;
354   }                                               325   }
355                                                   326 
356   if(n > 0) {                                     327   if(n > 0) {
357     G4String particleName = aParticle->GetPart << 328     G4String particleName = aParticle->GetParticleName(); 
358     G4String processName = (nullptr == p) ? G4 << 329     G4String processName  = p->GetProcessName(); 
359     for(size_t i=0; i<n; ++i) {                   330     for(size_t i=0; i<n; ++i) {
360       if(processName == processes[i]) {           331       if(processName == processes[i]) {
361         if ((particleName == particles[i]) ||  << 332         if((particleName == particles[i]) ||
362             || (particles[i] == "charged" && a << 333            (particles[i] == "all") ||
363         {                                      << 334            (particles[i] == "charged" && aParticle->GetPDGCharge() != 0.0)) {
364           const G4Region* reg = G4EmUtility::F << 335           G4Region* reg = FindRegion(regions[i]);
365           if (nullptr != reg) {                << 336           if(reg) {
366             --index;                              337             --index;
367             auto mod = dynamic_cast<G4VMscMode << 338             G4VEmModel* mod = models[i];
368             if(nullptr != mod) {               << 339             if(mod) {
369               if(UpdateModelEnergyRange(mod, l << 340               if(UpdateModelEnergyRange(mod, lowEnergy[i], highEnergy[i])) { 
370                 if(nullptr != p) {             << 341                 p->AddEmModel(index,mod,reg);
371                   p->AddEmModel(index, mod, re << 
372                 }                              << 
373                 else {                         << 
374                   trans->AddMscModel(mod, inde << 
375                 }                              << 
376                 //G4cout << "### Added msc mod    342                 //G4cout << "### Added msc model order= " << index << " for " 
377                 //   << particleName << " and  << 343                 //     << particleName << " and " << processName << G4endl;
378               }                                   344               }
379             }                                     345             }
380           }                                       346           }
381         }                                         347         }
382       }                                           348       }
383     }                                             349     }
384   }                                               350   }
385 }                                                 351 }
386                                                   352 
387 //....oooOO0OOooo........oooOO0OOooo........oo    353 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
388                                                   354 
389 void G4EmConfigurator::Clear()                    355 void G4EmConfigurator::Clear()
390 {                                                 356 {
391   particles.clear();                              357   particles.clear();
392   processes.clear();                              358   processes.clear();
393   models.clear();                                 359   models.clear();
394   flucModels.clear();                             360   flucModels.clear();
395   regions.clear();                                361   regions.clear();
396   lowEnergy.clear();                              362   lowEnergy.clear();
397   highEnergy.clear();                             363   highEnergy.clear();
                                                   >> 364 }
                                                   >> 365 
                                                   >> 366 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >> 367 
                                                   >> 368 G4Region* G4EmConfigurator::FindRegion(const G4String& regionName)
                                                   >> 369 {
                                                   >> 370   // search for region
                                                   >> 371   G4Region* reg = 0;
                                                   >> 372   G4RegionStore* regStore = G4RegionStore::GetInstance();
                                                   >> 373   G4String r = regionName;
                                                   >> 374   if(r == "" || r == "world" || r == "World") { 
                                                   >> 375     r = "DefaultRegionForTheWorld";
                                                   >> 376   }
                                                   >> 377   reg = regStore->GetRegion(r, true); 
                                                   >> 378   if(!reg) {
                                                   >> 379     G4cout << "### G4EmConfigurator WARNING: fails to find a region <"
                                                   >> 380            << r << G4endl;
                                                   >> 381   } else if(verbose > 1) {
                                                   >> 382     G4cout << "### G4EmConfigurator finds out G4Region <" << r << ">" 
                                                   >> 383            << G4endl;
                                                   >> 384   } 
                                                   >> 385   return reg;  
398 }                                                 386 }
399                                                   387 
400 //....oooOO0OOooo........oooOO0OOooo........oo    388 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
401                                                   389 
402 G4bool G4EmConfigurator::UpdateModelEnergyRang    390 G4bool G4EmConfigurator::UpdateModelEnergyRange(G4VEmModel* mod, 
403                                                   391                                                 G4double emin, G4double emax)
404 {                                                 392 {
405   // energy limits                                393   // energy limits
406   G4double e1 = std::max(emin,mod->LowEnergyLi    394   G4double e1 = std::max(emin,mod->LowEnergyLimit());
407   G4double e2 = std::min(emax,mod->HighEnergyL    395   G4double e2 = std::min(emax,mod->HighEnergyLimit());
408   if(e2 <= e1) {                                  396   if(e2 <= e1) {
409     G4cout << "### G4EmConfigurator WARNING: e    397     G4cout << "### G4EmConfigurator WARNING: empty energy interval"
410            << " for <" << mod->GetName()          398            << " for <" << mod->GetName() 
411            << ">  Emin(MeV)= " << e1/CLHEP::Me    399            << ">  Emin(MeV)= " << e1/CLHEP::MeV 
412            << ">  Emax(MeV)= " << e2/CLHEP::Me    400            << ">  Emax(MeV)= " << e2/CLHEP::MeV 
413            << G4endl;                             401            << G4endl;
414     return false;                                 402     return false;        
415   }                                               403   }
416   mod->SetLowEnergyLimit(e1);                     404   mod->SetLowEnergyLimit(e1);
417   mod->SetHighEnergyLimit(e2);                    405   mod->SetHighEnergyLimit(e2);
418   if(verbose > 1) {                               406   if(verbose > 1) {
419     G4cout << "### G4EmConfigurator for " << m    407     G4cout << "### G4EmConfigurator for " << mod->GetName() 
420            << " Emin(MeV)= " << e1/MeV << " Em    408            << " Emin(MeV)= " << e1/MeV << " Emax(MeV)= " << e2/MeV 
421            << G4endl;                             409            << G4endl;
422   }                                               410   } 
423   return true;                                    411   return true;
424 }                                                 412 }
425                                                   413 
426 //....oooOO0OOooo........oooOO0OOooo........oo    414 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
427                                                   415