Geant4 Cross Reference |
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: G4LossTableManager.cc 95476 2016-02-12 09:39:50Z gcosmo $ >> 27 // 26 // ------------------------------------------- 28 // ------------------------------------------------------------------- 27 // 29 // 28 // GEANT4 Class file 30 // GEANT4 Class file 29 // 31 // 30 // 32 // 31 // File name: G4LossTableManager 33 // File name: G4LossTableManager 32 // 34 // 33 // Author: Vladimir Ivanchenko 35 // Author: Vladimir Ivanchenko 34 // 36 // 35 // Creation date: 03.01.2002 37 // Creation date: 03.01.2002 36 // 38 // 37 // Modifications: by V.Ivanchenko << 39 // Modifications: 38 // 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 PreparePhysicsTables and BuildPhysicsTables entries (V.Ivanchenko) >> 73 // 04-06-13 (V.Ivanchenko) Adaptation for MT mode; new method LocalPhysicsTables; >> 74 // ions expect G4GenericIon are not included in the map of energy loss >> 75 // processes for performnc reasons 39 // 76 // 40 // Class Description: 77 // Class Description: 41 // 78 // 42 // ------------------------------------------- 79 // ------------------------------------------------------------------- 43 // 80 // 44 //....oooOO0OOooo........oooOO0OOooo........oo 81 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 45 //....oooOO0OOooo........oooOO0OOooo........oo 82 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 46 83 47 #include "G4LossTableManager.hh" 84 #include "G4LossTableManager.hh" 48 #include "G4SystemOfUnits.hh" 85 #include "G4SystemOfUnits.hh" >> 86 #include "G4EnergyLossMessenger.hh" 49 87 50 #include "G4VMultipleScattering.hh" 88 #include "G4VMultipleScattering.hh" 51 #include "G4VEmProcess.hh" 89 #include "G4VEmProcess.hh" 52 90 53 #include "G4EmParameters.hh" << 54 #include "G4EmSaturation.hh" 91 #include "G4EmSaturation.hh" 55 #include "G4EmConfigurator.hh" 92 #include "G4EmConfigurator.hh" 56 #include "G4ElectronIonPair.hh" 93 #include "G4ElectronIonPair.hh" 57 #include "G4NIELCalculator.hh" << 58 #include "G4EmCorrections.hh" << 59 #include "G4LossTableBuilder.hh" << 60 #include "G4VAtomDeexcitation.hh" << 61 #include "G4VSubCutProducer.hh" << 62 94 63 #include "G4PhysicsTable.hh" 95 #include "G4PhysicsTable.hh" 64 #include "G4ParticleDefinition.hh" 96 #include "G4ParticleDefinition.hh" 65 #include "G4MaterialCutsCouple.hh" 97 #include "G4MaterialCutsCouple.hh" 66 #include "G4ProcessManager.hh" 98 #include "G4ProcessManager.hh" 67 #include "G4Electron.hh" 99 #include "G4Electron.hh" 68 #include "G4Proton.hh" 100 #include "G4Proton.hh" 69 #include "G4ProductionCutsTable.hh" 101 #include "G4ProductionCutsTable.hh" 70 #include "G4PhysicsTableHelper.hh" 102 #include "G4PhysicsTableHelper.hh" 71 #include "G4EmTableType.hh" 103 #include "G4EmTableType.hh" 72 #include "G4Region.hh" 104 #include "G4Region.hh" 73 #include "G4PhysicalConstants.hh" 105 #include "G4PhysicalConstants.hh" 74 << 106 #include "G4Threading.hh" 75 #include "G4Gamma.hh" << 76 #include "G4Positron.hh" << 77 #include "G4OpticalPhoton.hh" << 78 #include "G4Neutron.hh" << 79 #include "G4MuonPlus.hh" << 80 #include "G4MuonMinus.hh" << 81 #include "G4GenericIon.hh" << 82 107 83 //....oooOO0OOooo........oooOO0OOooo........oo 108 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 84 109 85 static std::once_flag applyOnce; << 110 G4ThreadLocal G4LossTableManager* G4LossTableManager::instance = 0; 86 G4ThreadLocal G4LossTableManager* G4LossTableM << 87 111 88 G4LossTableManager* G4LossTableManager::Instan 112 G4LossTableManager* G4LossTableManager::Instance() 89 { 113 { 90 if(nullptr == instance) { << 114 if(!instance) { 91 static G4ThreadLocalSingleton<G4LossTableM 115 static G4ThreadLocalSingleton<G4LossTableManager> inst; 92 instance = inst.Instance(); 116 instance = inst.Instance(); 93 } 117 } 94 return instance; 118 return instance; 95 } 119 } 96 120 97 //....oooOO0OOooo........oooOO0OOooo........oo 121 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 98 122 99 G4LossTableManager::~G4LossTableManager() 123 G4LossTableManager::~G4LossTableManager() 100 { 124 { 101 for (auto const & p : loss_vector) { delete << 125 //G4cout << "### G4LossTableManager::~G4LossTableManager()" << G4endl; 102 for (auto const & p : msc_vector) { delete p << 126 for (G4int i=0; i<n_loss; ++i) { 103 for (auto const & p : emp_vector) { delete p << 127 //G4cout << "### eloss #" << i << G4endl; 104 for (auto const & p : p_vector) { delete p; << 128 if( loss_vector[i] ) { 105 << 129 delete loss_vector[i]; 106 std::size_t mod = mod_vector.size(); << 130 } 107 std::size_t fmod = fmod_vector.size(); << 131 } 108 for (std::size_t a=0; a<mod; ++a) { << 132 size_t msc = msc_vector.size(); 109 if( nullptr != mod_vector[a] ) { << 133 for (size_t j=0; j<msc; ++j) { 110 for (std::size_t b=0; b<fmod; ++b) { << 134 if( msc_vector[j] ) { delete msc_vector[j]; } >> 135 } >> 136 size_t emp = emp_vector.size(); >> 137 for (size_t k=0; k<emp; ++k) { >> 138 if( emp_vector[k] ) { delete emp_vector[k]; } >> 139 } >> 140 size_t mod = mod_vector.size(); >> 141 size_t fmod = fmod_vector.size(); >> 142 for (size_t a=0; a<mod; ++a) { >> 143 if( mod_vector[a] ) { >> 144 for (size_t b=0; b<fmod; ++b) { 111 if((G4VEmModel*)(fmod_vector[b]) == mo 145 if((G4VEmModel*)(fmod_vector[b]) == mod_vector[a]) { 112 fmod_vector[b] = nullptr; << 146 fmod_vector[b] = 0; 113 } 147 } 114 } 148 } 115 delete mod_vector[a]; 149 delete mod_vector[a]; 116 mod_vector[a] = nullptr; << 117 } 150 } 118 } 151 } 119 for (auto const & p : fmod_vector) { delete << 152 for (size_t b=0; b<fmod; ++b) { 120 << 153 if( fmod_vector[b] ) { delete fmod_vector[b]; } >> 154 } 121 Clear(); 155 Clear(); >> 156 delete theMessenger; 122 delete tableBuilder; 157 delete tableBuilder; 123 delete emCorrections; 158 delete emCorrections; >> 159 delete emSaturation; 124 delete emConfigurator; 160 delete emConfigurator; 125 delete emElectronIonPair; 161 delete emElectronIonPair; 126 delete nielCalculator; << 127 delete atomDeexcitation; 162 delete atomDeexcitation; 128 delete subcutProducer; 163 delete subcutProducer; 129 } 164 } 130 165 131 //....oooOO0OOooo........oooOO0OOooo........oo 166 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 132 167 133 G4LossTableManager::G4LossTableManager() 168 G4LossTableManager::G4LossTableManager() 134 { 169 { 135 theParameters = G4EmParameters::Instance(); 170 theParameters = G4EmParameters::Instance(); 136 theElectron = G4Electron::Electron(); << 171 n_loss = 0; 137 << 172 run = -1; 138 // only one thread is the master << 173 startInitialisation = false; 139 std::call_once(applyOnce, [this]() { isMaste << 174 all_tables_are_built = false; 140 verbose = isMaster ? theParameters->Verbose( << 175 currentLoss = nullptr; 141 << 176 currentParticle = nullptr; 142 tableBuilder = new G4LossTableBuilder(isMast << 177 firstParticle = nullptr; 143 emCorrections = new G4EmCorrections(verbose) << 178 subCutoffFlag = false; 144 << 179 maxRangeVariation = 0.2; 145 std::size_t n = 70; << 180 maxFinalStep = CLHEP::mm; 146 loss_vector.reserve(n); << 181 integral = true; 147 part_vector.reserve(n); << 182 integralActive = false; 148 base_part_vector.reserve(n); << 183 stepFunctionActive = false; 149 dedx_vector.reserve(n); << 184 isMaster = true; 150 range_vector.reserve(n); << 185 verbose = theParameters->Verbose(); 151 inv_range_vector.reserve(n); << 186 theMessenger = new G4EnergyLossMessenger(); 152 tables_are_built.reserve(n); << 187 theElectron = G4Electron::Electron(); 153 isActive.reserve(n); << 188 theGenericIon= nullptr; 154 msc_vector.reserve(10); << 189 if(G4Threading::IsWorkerThread()) { 155 emp_vector.reserve(16); << 190 verbose = theParameters->WorkerVerbose(); 156 mod_vector.reserve(150); << 191 isMaster = false; 157 fmod_vector.reserve(60); << 192 } >> 193 tableBuilder = new G4LossTableBuilder(); >> 194 emCorrections= new G4EmCorrections(verbose); >> 195 emSaturation = nullptr; >> 196 emConfigurator = nullptr; >> 197 emElectronIonPair = nullptr; >> 198 atomDeexcitation = nullptr; >> 199 subcutProducer = nullptr; 158 } 200 } 159 201 160 //....oooOO0OOooo........oooOO0OOooo........oo 202 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 161 203 162 void G4LossTableManager::Clear() 204 void G4LossTableManager::Clear() 163 { 205 { 164 all_tables_are_built = false; 206 all_tables_are_built = false; 165 currentLoss = nullptr; 207 currentLoss = nullptr; 166 currentParticle = nullptr; 208 currentParticle = nullptr; 167 if(n_loss) { << 209 if(n_loss) 168 dedx_vector.clear(); << 210 { 169 range_vector.clear(); << 211 dedx_vector.clear(); 170 inv_range_vector.clear(); << 212 range_vector.clear(); 171 loss_map.clear(); << 213 inv_range_vector.clear(); 172 loss_vector.clear(); << 214 loss_map.clear(); 173 part_vector.clear(); << 215 loss_vector.clear(); 174 base_part_vector.clear(); << 216 part_vector.clear(); 175 tables_are_built.clear(); << 217 base_part_vector.clear(); 176 isActive.clear(); << 218 tables_are_built.clear(); 177 n_loss = 0; << 219 isActive.clear(); 178 } << 220 n_loss = 0; >> 221 } 179 } 222 } 180 223 181 //....oooOO0OOooo........oooOO0OOooo........oo 224 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 182 225 183 void G4LossTableManager::Register(G4VEnergyLos 226 void G4LossTableManager::Register(G4VEnergyLossProcess* p) 184 { 227 { 185 if (nullptr == p) { return; } << 228 if(!p) { return; } 186 for (G4int i=0; i<n_loss; ++i) { 229 for (G4int i=0; i<n_loss; ++i) { 187 if(loss_vector[i] == p) { return; } 230 if(loss_vector[i] == p) { return; } 188 } 231 } 189 if(verbose > 1) { 232 if(verbose > 1) { 190 G4cout << "G4LossTableManager::Register G4 233 G4cout << "G4LossTableManager::Register G4VEnergyLossProcess : " 191 << p->GetProcessName() << " idx= " 234 << p->GetProcessName() << " idx= " << n_loss << G4endl; 192 } 235 } 193 ++n_loss; 236 ++n_loss; 194 loss_vector.push_back(p); 237 loss_vector.push_back(p); 195 part_vector.push_back(nullptr); 238 part_vector.push_back(nullptr); 196 base_part_vector.push_back(nullptr); 239 base_part_vector.push_back(nullptr); 197 dedx_vector.push_back(nullptr); 240 dedx_vector.push_back(nullptr); 198 range_vector.push_back(nullptr); 241 range_vector.push_back(nullptr); 199 inv_range_vector.push_back(nullptr); 242 inv_range_vector.push_back(nullptr); 200 tables_are_built.push_back(false); 243 tables_are_built.push_back(false); 201 isActive.push_back(true); 244 isActive.push_back(true); 202 all_tables_are_built = false; 245 all_tables_are_built = false; >> 246 if(subCutoffFlag) { p->ActivateSubCutoff(true); } >> 247 if(stepFunctionActive) { p->SetStepFunction(maxRangeVariation, >> 248 maxFinalStep); } >> 249 if(integralActive) { p->SetIntegral(integral); } 203 } 250 } 204 251 205 //....oooOO0OOooo........oooOO0OOooo........oo 252 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 206 253 207 void G4LossTableManager::ResetParameters() 254 void G4LossTableManager::ResetParameters() 208 { 255 { 209 // initialisation once per run << 210 if (!resetParam) { return; } << 211 resetParam = false; << 212 startInitialisation = true; << 213 verbose = theParameters->Verbose(); 256 verbose = theParameters->Verbose(); 214 if(!isMaster) { 257 if(!isMaster) { 215 verbose = theParameters->WorkerVerbose(); 258 verbose = theParameters->WorkerVerbose(); 216 } else { << 217 if(verbose > 0) { theParameters->Dump(); } << 218 } 259 } 219 << 260 tableBuilder->SetSplineFlag(theParameters->Spline()); 220 tableBuilder->InitialiseBaseMaterials(); << 261 tableBuilder->SetInitialisationFlag(false); 221 if (nullptr != nielCalculator) { nielCalcula << 222 << 223 emCorrections->SetVerbose(verbose); 262 emCorrections->SetVerbose(verbose); 224 if(nullptr != emConfigurator) { emConfigurat << 263 if(emSaturation) { emSaturation->SetVerbose(verbose); } 225 if(nullptr != emElectronIonPair) { emElectro << 264 if(emConfigurator) { emConfigurator->SetVerbose(verbose); }; 226 if(nullptr != atomDeexcitation) { << 265 if(emElectronIonPair) { emElectronIonPair->SetVerbose(verbose); }; >> 266 if(atomDeexcitation) { 227 atomDeexcitation->SetVerboseLevel(verbose) 267 atomDeexcitation->SetVerboseLevel(verbose); 228 atomDeexcitation->InitialiseAtomicDeexcita 268 atomDeexcitation->InitialiseAtomicDeexcitation(); 229 } 269 } 230 if (1 < verbose) { << 231 G4cout << "====== G4LossTableManager::Rese << 232 << " Nloss=" << loss_vector.size() << 233 << " run=" << run << " master=" << isMast << 234 << G4endl; << 235 } << 236 } 270 } 237 271 238 //....oooOO0OOooo........oooOO0OOooo........oo 272 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 239 273 240 void G4LossTableManager::DeRegister(G4VEnergyL 274 void G4LossTableManager::DeRegister(G4VEnergyLossProcess* p) 241 { 275 { 242 if (nullptr == p) { return; } << 276 if(!p) { return; } 243 for (G4int i=0; i<n_loss; ++i) { 277 for (G4int i=0; i<n_loss; ++i) { 244 if(loss_vector[i] == p) { << 278 if(loss_vector[i] == p) { loss_vector[i] = nullptr; } 245 loss_vector[i] = nullptr; << 246 break; << 247 } << 248 } 279 } 249 } 280 } 250 281 251 //....oooOO0OOooo........oooOO0OOooo........oo 282 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 252 283 253 void G4LossTableManager::Register(G4VMultipleS 284 void G4LossTableManager::Register(G4VMultipleScattering* p) 254 { 285 { 255 if (nullptr == p) { return; } << 286 if(!p) { return; } 256 std::size_t n = msc_vector.size(); << 287 G4int n = msc_vector.size(); 257 for (std::size_t i=0; i<n; ++i) { << 288 for (G4int i=0; i<n; ++i) { 258 if(msc_vector[i] == p) { return; } 289 if(msc_vector[i] == p) { return; } 259 } 290 } 260 if(verbose > 1) { 291 if(verbose > 1) { 261 G4cout << "G4LossTableManager::Register G4 292 G4cout << "G4LossTableManager::Register G4VMultipleScattering : " 262 << p->GetProcessName() << " idx= " 293 << p->GetProcessName() << " idx= " << msc_vector.size() << G4endl; 263 } 294 } 264 msc_vector.push_back(p); 295 msc_vector.push_back(p); 265 } 296 } 266 297 267 //....oooOO0OOooo........oooOO0OOooo........oo 298 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 268 299 269 void G4LossTableManager::DeRegister(G4VMultipl 300 void G4LossTableManager::DeRegister(G4VMultipleScattering* p) 270 { 301 { 271 if (nullptr == p) { return; } << 302 if(!p) { return; } 272 std::size_t msc = msc_vector.size(); << 303 size_t msc = msc_vector.size(); 273 for (std::size_t i=0; i<msc; ++i) { << 304 for (size_t i=0; i<msc; ++i) { 274 if(msc_vector[i] == p) { << 305 if(msc_vector[i] == p) { msc_vector[i] = nullptr; } 275 msc_vector[i] = nullptr; << 276 break; << 277 } << 278 } 306 } 279 } 307 } 280 308 281 //....oooOO0OOooo........oooOO0OOooo........oo 309 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 282 310 283 void G4LossTableManager::Register(G4VEmProcess 311 void G4LossTableManager::Register(G4VEmProcess* p) 284 { 312 { 285 if (nullptr == p) { return; } << 313 if(!p) { return; } 286 std::size_t n = emp_vector.size(); << 314 G4int n = emp_vector.size(); 287 for (std::size_t i=0; i<n; ++i) { << 315 for (G4int i=0; i<n; ++i) { 288 if(emp_vector[i] == p) { return; } 316 if(emp_vector[i] == p) { return; } 289 } 317 } 290 if(verbose > 1) { 318 if(verbose > 1) { 291 G4cout << "G4LossTableManager::Register G4 319 G4cout << "G4LossTableManager::Register G4VEmProcess : " 292 << p->GetProcessName() << " idx= " 320 << p->GetProcessName() << " idx= " << emp_vector.size() << G4endl; 293 } 321 } 294 emp_vector.push_back(p); 322 emp_vector.push_back(p); 295 } 323 } 296 324 297 //....oooOO0OOooo........oooOO0OOooo........oo 325 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 298 326 299 void G4LossTableManager::DeRegister(G4VEmProce 327 void G4LossTableManager::DeRegister(G4VEmProcess* p) 300 { 328 { 301 if (nullptr == p) { return; } << 329 if(!p) { return; } 302 std::size_t emp = emp_vector.size(); << 330 size_t emp = emp_vector.size(); 303 for (std::size_t i=0; i<emp; ++i) { << 331 for (size_t i=0; i<emp; ++i) { 304 if(emp_vector[i] == p) { << 332 if(emp_vector[i] == p) { emp_vector[i] = nullptr; } 305 emp_vector[i] = nullptr; << 306 break; << 307 } << 308 } << 309 } << 310 << 311 //....oooOO0OOooo........oooOO0OOooo........oo << 312 << 313 void G4LossTableManager::Register(G4VProcess* << 314 { << 315 if (nullptr == p) { return; } << 316 std::size_t n = p_vector.size(); << 317 for (std::size_t i=0; i<n; ++i) { << 318 if(p_vector[i] == p) { return; } << 319 } << 320 if(verbose > 1) { << 321 G4cout << "G4LossTableManager::Register G4 << 322 << p->GetProcessName() << " idx= " << 323 } << 324 p_vector.push_back(p); << 325 } << 326 << 327 //....oooOO0OOooo........oooOO0OOooo........oo << 328 << 329 void G4LossTableManager::DeRegister(G4VProcess << 330 { << 331 if (nullptr == p) { return; } << 332 std::size_t emp = p_vector.size(); << 333 for (std::size_t i=0; i<emp; ++i) { << 334 if(p_vector[i] == p) { << 335 p_vector[i] = nullptr; << 336 break; << 337 } << 338 } 333 } 339 } 334 } 340 335 341 //....oooOO0OOooo........oooOO0OOooo........oo 336 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 342 337 343 void G4LossTableManager::Register(G4VEmModel* 338 void G4LossTableManager::Register(G4VEmModel* p) 344 { 339 { 345 mod_vector.push_back(p); 340 mod_vector.push_back(p); 346 if(verbose > 1) { 341 if(verbose > 1) { 347 G4cout << "G4LossTableManager::Register G4 342 G4cout << "G4LossTableManager::Register G4VEmModel : " 348 << p->GetName() << " " << p << " << 343 << p->GetName() << G4endl; 349 } 344 } 350 } 345 } 351 346 352 //....oooOO0OOooo........oooOO0OOooo........oo 347 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 353 348 354 void G4LossTableManager::DeRegister(G4VEmModel 349 void G4LossTableManager::DeRegister(G4VEmModel* p) 355 { 350 { 356 //G4cout << "G4LossTableManager::DeRegister << 351 size_t n = mod_vector.size(); 357 std::size_t n = mod_vector.size(); << 352 for (size_t i=0; i<n; ++i) { 358 for (std::size_t i=0; i<n; ++i) { << 353 if(mod_vector[i] == p) { mod_vector[i] = nullptr; } 359 if(mod_vector[i] == p) { << 360 mod_vector[i] = nullptr; << 361 break; << 362 } << 363 } 354 } 364 } 355 } 365 356 366 //....oooOO0OOooo........oooOO0OOooo........oo 357 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 367 358 368 void G4LossTableManager::Register(G4VEmFluctua 359 void G4LossTableManager::Register(G4VEmFluctuationModel* p) 369 { 360 { 370 fmod_vector.push_back(p); 361 fmod_vector.push_back(p); 371 if(verbose > 1) { 362 if(verbose > 1) { 372 G4cout << "G4LossTableManager::Register G4 363 G4cout << "G4LossTableManager::Register G4VEmFluctuationModel : " 373 << p->GetName() << " " << fmod_vec << 364 << p->GetName() << G4endl; 374 } 365 } 375 } 366 } 376 367 377 //....oooOO0OOooo........oooOO0OOooo........oo 368 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 378 369 379 void G4LossTableManager::DeRegister(G4VEmFluct 370 void G4LossTableManager::DeRegister(G4VEmFluctuationModel* p) 380 { 371 { 381 std::size_t n = fmod_vector.size(); << 372 size_t n = fmod_vector.size(); 382 for (std::size_t i=0; i<n; ++i) { << 373 for (size_t i=0; i<n; ++i) { 383 if(fmod_vector[i] == p) { fmod_vector[i] = 374 if(fmod_vector[i] == p) { fmod_vector[i] = nullptr; } 384 } 375 } 385 } 376 } 386 377 387 //....oooOO0OOooo........oooOO0OOooo........oo 378 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 388 379 389 void G4LossTableManager::RegisterExtraParticle 380 void G4LossTableManager::RegisterExtraParticle( 390 const G4ParticleDefinition* part, 381 const G4ParticleDefinition* part, 391 G4VEnergyLossProcess* p) 382 G4VEnergyLossProcess* p) 392 { 383 { 393 if (nullptr == p || nullptr == part) { retur << 384 if(!p || !part) { return; } 394 for (G4int i=0; i<n_loss; ++i) { 385 for (G4int i=0; i<n_loss; ++i) { 395 if(loss_vector[i] == p) { return; } 386 if(loss_vector[i] == p) { return; } 396 } 387 } 397 if(verbose > 1) { 388 if(verbose > 1) { 398 G4cout << "G4LossTableManager::RegisterExt 389 G4cout << "G4LossTableManager::RegisterExtraParticle " 399 << part->GetParticleName() << " G4 390 << part->GetParticleName() << " G4VEnergyLossProcess : " 400 << p->GetProcessName() << " idx= " 391 << p->GetProcessName() << " idx= " << n_loss << G4endl; 401 } 392 } 402 ++n_loss; 393 ++n_loss; 403 loss_vector.push_back(p); 394 loss_vector.push_back(p); 404 part_vector.push_back(part); 395 part_vector.push_back(part); 405 base_part_vector.push_back(p->BaseParticle() 396 base_part_vector.push_back(p->BaseParticle()); 406 dedx_vector.push_back(nullptr); 397 dedx_vector.push_back(nullptr); 407 range_vector.push_back(nullptr); 398 range_vector.push_back(nullptr); 408 inv_range_vector.push_back(nullptr); 399 inv_range_vector.push_back(nullptr); 409 tables_are_built.push_back(false); 400 tables_are_built.push_back(false); 410 all_tables_are_built = false; 401 all_tables_are_built = false; 411 } 402 } 412 403 413 //....oooOO0OOooo........oooOO0OOooo........oo << 414 << 415 G4VEnergyLossProcess* << 416 G4LossTableManager::GetEnergyLossProcess(const << 417 { << 418 if(aParticle != currentParticle) { << 419 currentParticle = aParticle; << 420 std::map<PD,G4VEnergyLossProcess*,std::les << 421 if ((pos = loss_map.find(aParticle)) != lo << 422 currentLoss = (*pos).second; << 423 } else { << 424 currentLoss = nullptr; << 425 if(0.0 != aParticle->GetPDGCharge() && << 426 (pos = loss_map.find(theGenericIon)) != los << 427 currentLoss = (*pos).second; << 428 } << 429 } << 430 } << 431 return currentLoss; << 432 } << 433 << 434 //....oooOO0OOooo........oooOO0OOooo........oo 404 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 435 405 436 void 406 void 437 G4LossTableManager::PreparePhysicsTable(const 407 G4LossTableManager::PreparePhysicsTable(const G4ParticleDefinition* particle, 438 G4VEne << 408 G4VEnergyLossProcess* p, >> 409 G4bool theMaster) 439 { 410 { 440 if (1 < verbose) { 411 if (1 < verbose) { 441 G4cout << "G4LossTableManager::PreparePhys 412 G4cout << "G4LossTableManager::PreparePhysicsTable for " 442 << particle->GetParticleName() 413 << particle->GetParticleName() 443 << " and " << p->GetProcessName() < 414 << " and " << p->GetProcessName() << " run= " << run 444 << " loss_vector " << loss_vector << 415 << " loss_vector " << loss_vector.size() << G4endl; 445 << " run=" << run << " master=" << isMast << 416 } 446 << G4endl; << 417 >> 418 isMaster = theMaster; >> 419 >> 420 if(!startInitialisation) { >> 421 ResetParameters(); >> 422 if (1 < verbose) { >> 423 G4cout << "====== G4LossTableManager::PreparePhysicsTable start =====" >> 424 << G4endl; >> 425 } 447 } 426 } 448 427 449 // start initialisation for the first run 428 // start initialisation for the first run 450 if( -1 == run ) { 429 if( -1 == run ) { 451 if (nullptr != emConfigurator) { emConfigu << 430 if(emConfigurator) { emConfigurator->PrepareModels(particle, p); } 452 431 453 // initialise particles for given process 432 // initialise particles for given process 454 for (G4int j=0; j<n_loss; ++j) { 433 for (G4int j=0; j<n_loss; ++j) { 455 if (p == loss_vector[j] && nullptr == pa << 434 if (p == loss_vector[j] && !part_vector[j]) { 456 part_vector[j] = particle; 435 part_vector[j] = particle; 457 if (particle->GetParticleName() == "Ge << 436 if(particle->GetParticleName() == "GenericIon") { 458 theGenericIon = particle; 437 theGenericIon = particle; 459 } 438 } 460 } 439 } 461 } 440 } 462 } 441 } 463 ResetParameters(); << 442 startInitialisation = true; 464 } 443 } 465 444 466 //....oooOO0OOooo........oooOO0OOooo........oo 445 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 467 446 468 void 447 void 469 G4LossTableManager::PreparePhysicsTable(const 448 G4LossTableManager::PreparePhysicsTable(const G4ParticleDefinition* particle, 470 G4VEmP << 449 G4VEmProcess* p, G4bool theMaster) 471 { 450 { 472 if (1 < verbose) { 451 if (1 < verbose) { 473 G4cout << "G4LossTableManager::PreparePhys 452 G4cout << "G4LossTableManager::PreparePhysicsTable for " 474 << particle->GetParticleName() 453 << particle->GetParticleName() 475 << " and " << p->GetProcessName() << 454 << " and " << p->GetProcessName() << G4endl; 476 << " run=" << run << " master=" << isMast << 455 } 477 << G4endl; << 456 isMaster = theMaster; >> 457 >> 458 if(!startInitialisation) { >> 459 ResetParameters(); >> 460 if (1 < verbose) { >> 461 G4cout << "====== G4LossTableManager::PreparePhysicsTable start =====" >> 462 << G4endl; >> 463 } 478 } 464 } 479 465 480 // start initialisation for the first run 466 // start initialisation for the first run 481 if( -1 == run ) { 467 if( -1 == run ) { 482 if (nullptr != emConfigurator) { emConfigu << 468 if(emConfigurator) { emConfigurator->PrepareModels(particle, p); } 483 } 469 } 484 << 470 startInitialisation = true; 485 ResetParameters(); << 486 } 471 } 487 472 488 //....oooOO0OOooo........oooOO0OOooo........oo 473 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 489 474 490 void 475 void 491 G4LossTableManager::PreparePhysicsTable(const 476 G4LossTableManager::PreparePhysicsTable(const G4ParticleDefinition* particle, 492 G4VMul << 477 G4VMultipleScattering* p, >> 478 G4bool theMaster) 493 { 479 { 494 if (1 < verbose) { 480 if (1 < verbose) { 495 G4cout << "G4LossTableManager::PreparePhys 481 G4cout << "G4LossTableManager::PreparePhysicsTable for " 496 << particle->GetParticleName() 482 << particle->GetParticleName() 497 << " and " << p->GetProcessName() << 483 << " and " << p->GetProcessName() << G4endl; 498 << " run=" << run << " master=" << isMast << 484 } 499 << G4endl; << 485 >> 486 isMaster = theMaster; >> 487 >> 488 if(!startInitialisation) { >> 489 ResetParameters(); >> 490 if (1 < verbose) { >> 491 G4cout << "====== G4LossTableManager::PreparePhysicsTable start =====" >> 492 << G4endl; >> 493 } 500 } 494 } 501 495 502 // start initialisation for the first run 496 // start initialisation for the first run 503 if ( -1 == run ) { << 497 if( -1 == run ) { 504 if (nullptr != emConfigurator) { emConfigu << 498 if(emConfigurator) { emConfigurator->PrepareModels(particle, p); } 505 } 499 } 506 << 500 startInitialisation = true; 507 ResetParameters(); << 508 } 501 } 509 502 510 //....oooOO0OOooo........oooOO0OOooo........oo 503 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 511 504 512 void 505 void 513 G4LossTableManager::BuildPhysicsTable(const G4 506 G4LossTableManager::BuildPhysicsTable(const G4ParticleDefinition*) 514 { 507 { 515 if(-1 == run && startInitialisation) { 508 if(-1 == run && startInitialisation) { 516 if (nullptr != emConfigurator) { emConfigu << 509 if(emConfigurator) { emConfigurator->Clear(); } 517 } 510 } 518 if (startInitialisation) { resetParam = true << 519 } 511 } 520 512 521 //....oooOO0OOooo........oooOO0OOooo........oo 513 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 522 514 523 void G4LossTableManager::LocalPhysicsTables( 515 void G4LossTableManager::LocalPhysicsTables( 524 const G4ParticleDefinition* aParticle, 516 const G4ParticleDefinition* aParticle, 525 G4VEnergyLossProcess* p) 517 G4VEnergyLossProcess* p) 526 { 518 { 527 if (1 < verbose) { << 519 if(1 < verbose) { 528 G4cout << "### G4LossTableManager::LocalPh 520 G4cout << "### G4LossTableManager::LocalPhysicsTable() for " 529 << aParticle->GetParticleName() 521 << aParticle->GetParticleName() 530 << " and process " << p->GetProcess << 522 << " and process " << p->GetProcessName() 531 << G4endl; 523 << G4endl; 532 } 524 } 533 525 534 if(-1 == run && startInitialisation) { 526 if(-1 == run && startInitialisation) { 535 if (nullptr != emConfigurator) { emConfigu << 527 if(emConfigurator) { emConfigurator->Clear(); } 536 firstParticle = aParticle; 528 firstParticle = aParticle; 537 } 529 } 538 530 539 if (startInitialisation) { << 531 if(startInitialisation) { 540 ++run; 532 ++run; 541 if (1 < verbose) { << 533 SetVerbose(verbose); >> 534 if(1 < verbose) { 542 G4cout << "===== G4LossTableManager::Loc 535 G4cout << "===== G4LossTableManager::LocalPhysicsTable() for run " 543 << run << " =====" << G4endl; 536 << run << " =====" << G4endl; 544 } 537 } >> 538 if(0 < verbose) { emSaturation->DumpG4BirksCoefficients(); } 545 currentParticle = nullptr; 539 currentParticle = nullptr; 546 startInitialisation = false; 540 startInitialisation = false; 547 resetParam = true; << 548 for (G4int i=0; i<n_loss; ++i) { 541 for (G4int i=0; i<n_loss; ++i) { 549 if (nullptr != loss_vector[i]) { << 542 if(loss_vector[i]) { 550 tables_are_built[i] = false; 543 tables_are_built[i] = false; 551 } else { 544 } else { 552 tables_are_built[i] = true; 545 tables_are_built[i] = true; 553 part_vector[i] = nullptr; 546 part_vector[i] = nullptr; 554 } 547 } 555 } 548 } 556 } 549 } 557 550 558 all_tables_are_built= true; 551 all_tables_are_built= true; 559 for (G4int i=0; i<n_loss; ++i) { 552 for (G4int i=0; i<n_loss; ++i) { 560 if(p == loss_vector[i]) { 553 if(p == loss_vector[i]) { 561 tables_are_built[i] = true; 554 tables_are_built[i] = true; 562 isActive[i] = true; 555 isActive[i] = true; 563 part_vector[i] = p->Particle(); 556 part_vector[i] = p->Particle(); 564 base_part_vector[i] = p->BaseParticle(); 557 base_part_vector[i] = p->BaseParticle(); 565 dedx_vector[i] = p->DEDXTable(); 558 dedx_vector[i] = p->DEDXTable(); 566 range_vector[i] = p->RangeTableForLoss() 559 range_vector[i] = p->RangeTableForLoss(); 567 inv_range_vector[i] = p->InverseRangeTab 560 inv_range_vector[i] = p->InverseRangeTable(); 568 if(0 == run && p->IsIonisationProcess()) 561 if(0 == run && p->IsIonisationProcess()) { 569 loss_map[part_vector[i]] = p; 562 loss_map[part_vector[i]] = p; >> 563 //G4cout << "G4LossTableManager::LocalPhysicsTable " << part_vector[i]->GetParticleName() >> 564 // << " added to map " << p << G4endl; 570 } 565 } 571 566 572 if(1 < verbose) { 567 if(1 < verbose) { 573 G4cout << i <<". "<< p->GetProcessNa 568 G4cout << i <<". "<< p->GetProcessName(); 574 if(part_vector[i]) { 569 if(part_vector[i]) { 575 G4cout << " for " << part_vector[i 570 G4cout << " for " << part_vector[i]->GetParticleName(); 576 } 571 } 577 G4cout << " active= " << isActive[i] 572 G4cout << " active= " << isActive[i] 578 << " table= " << tables_are_bu 573 << " table= " << tables_are_built[i] 579 << " isIonisation= " << p->IsI 574 << " isIonisation= " << p->IsIonisationProcess() 580 << G4endl; 575 << G4endl; 581 } 576 } 582 break; 577 break; 583 } else if(!tables_are_built[i]) { 578 } else if(!tables_are_built[i]) { 584 all_tables_are_built = false; 579 all_tables_are_built = false; 585 } 580 } 586 } 581 } 587 582 >> 583 // Set run time parameters >> 584 SetParameters(aParticle, p); >> 585 588 if(1 < verbose) { 586 if(1 < verbose) { 589 G4cout << "### G4LossTableManager::LocalPh 587 G4cout << "### G4LossTableManager::LocalPhysicsTable end" 590 << G4endl; 588 << G4endl; 591 } 589 } 592 if(all_tables_are_built) { 590 if(all_tables_are_built) { 593 if(1 < verbose) { 591 if(1 < verbose) { 594 G4cout << "%%%%% All dEdx and Range tabl 592 G4cout << "%%%%% All dEdx and Range tables for worker are ready for run " 595 << run << " %%%%%" << G4endl; 593 << run << " %%%%%" << G4endl; 596 } 594 } 597 } 595 } 598 } 596 } 599 597 600 //....oooOO0OOooo........oooOO0OOooo........oo 598 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 601 599 602 void G4LossTableManager::BuildPhysicsTable( 600 void G4LossTableManager::BuildPhysicsTable( 603 const G4ParticleDefinition* aParticle, 601 const G4ParticleDefinition* aParticle, 604 G4VEnergyLossProcess* p) 602 G4VEnergyLossProcess* p) 605 { 603 { 606 if(1 < verbose) { 604 if(1 < verbose) { 607 G4cout << "### G4LossTableManager::BuildPh 605 G4cout << "### G4LossTableManager::BuildPhysicsTable() for " 608 << aParticle->GetParticleName() 606 << aParticle->GetParticleName() 609 << " and process " << p->GetProcess 607 << " and process " << p->GetProcessName() << G4endl; 610 } 608 } 611 // clear configurator 609 // clear configurator 612 if(-1 == run && startInitialisation) { 610 if(-1 == run && startInitialisation) { 613 if( nullptr != emConfigurator) { emConfigu << 611 if(emConfigurator) { emConfigurator->Clear(); } 614 firstParticle = aParticle; 612 firstParticle = aParticle; 615 } 613 } 616 if(startInitialisation) { 614 if(startInitialisation) { 617 ++run; 615 ++run; 618 resetParam = true; << 619 startInitialisation = false; << 620 if(1 < verbose) { 616 if(1 < verbose) { 621 G4cout << "===== G4LossTableManager::Bui 617 G4cout << "===== G4LossTableManager::BuildPhysicsTable() for run " 622 << run << " ===== " << atomDeexci 618 << run << " ===== " << atomDeexcitation << G4endl; 623 } 619 } 624 currentParticle = nullptr; 620 currentParticle = nullptr; 625 all_tables_are_built = false; << 621 all_tables_are_built= true; >> 622 } 626 623 >> 624 // initialisation before any table is built >> 625 if ( startInitialisation && aParticle == firstParticle ) { >> 626 >> 627 startInitialisation = false; >> 628 if(1 < verbose) { >> 629 G4cout << "### G4LossTableManager start initilisation for first particle " >> 630 << firstParticle->GetParticleName() >> 631 << G4endl; >> 632 } 627 for (G4int i=0; i<n_loss; ++i) { 633 for (G4int i=0; i<n_loss; ++i) { 628 G4VEnergyLossProcess* el = loss_vector[i 634 G4VEnergyLossProcess* el = loss_vector[i]; 629 635 630 if(nullptr != el) { << 636 if(el) { 631 isActive[i] = true; 637 isActive[i] = true; 632 part_vector[i] = el->Particle(); << 633 base_part_vector[i] = el->BaseParticle 638 base_part_vector[i] = el->BaseParticle(); 634 tables_are_built[i] = false; << 639 tables_are_built[i] = false; >> 640 all_tables_are_built= false; >> 641 if(!isActive[i]) { >> 642 el->SetIonisation(false); >> 643 tables_are_built[i] = true; >> 644 } >> 645 635 if(1 < verbose) { 646 if(1 < verbose) { 636 G4cout << i <<". "<< el->GetProces 647 G4cout << i <<". "<< el->GetProcessName(); 637 if(el->Particle()) { 648 if(el->Particle()) { 638 G4cout << " for " << el->Particl 649 G4cout << " for " << el->Particle()->GetParticleName(); 639 } 650 } 640 G4cout << " active= " << isActive[i 651 G4cout << " active= " << isActive[i] 641 << " table= " << tables_are_ 652 << " table= " << tables_are_built[i] 642 << " isIonisation= " << el-> 653 << " isIonisation= " << el->IsIonisationProcess(); 643 if(base_part_vector[i]) { 654 if(base_part_vector[i]) { 644 G4cout << " base particle " 655 G4cout << " base particle " 645 << base_part_vector[i]->Get 656 << base_part_vector[i]->GetParticleName(); 646 } 657 } 647 G4cout << G4endl; 658 G4cout << G4endl; 648 } 659 } 649 } else { 660 } else { 650 tables_are_built[i] = true; 661 tables_are_built[i] = true; 651 part_vector[i] = nullptr; 662 part_vector[i] = nullptr; 652 isActive[i] = false; 663 isActive[i] = false; 653 } 664 } 654 } 665 } 655 } 666 } 656 667 657 if (all_tables_are_built) { << 668 // Set run time parameters 658 theParameters->SetIsPrintedFlag(true); << 669 SetParameters(aParticle, p); 659 return; << 670 660 } << 671 if (all_tables_are_built) { return; } 661 672 662 // Build tables for given particle 673 // Build tables for given particle 663 all_tables_are_built = true; 674 all_tables_are_built = true; 664 675 665 for(G4int i=0; i<n_loss; ++i) { 676 for(G4int i=0; i<n_loss; ++i) { 666 if(p == loss_vector[i] && !tables_are_buil << 677 if(p == loss_vector[i] && !tables_are_built[i] && !base_part_vector[i]) { 667 const G4ParticleDefinition* curr_part = 678 const G4ParticleDefinition* curr_part = part_vector[i]; 668 if(1 < verbose) { 679 if(1 < verbose) { 669 G4cout << "### Build Table for " << p- 680 G4cout << "### Build Table for " << p->GetProcessName() 670 << " and " << curr_part->GetPar 681 << " and " << curr_part->GetParticleName() 671 << " " << tables_are_built[i] << 682 << " " << tables_are_built[i] << " " << base_part_vector[i] << G4endl; 672 << G4endl; << 673 } 683 } 674 G4VEnergyLossProcess* curr_proc = BuildT 684 G4VEnergyLossProcess* curr_proc = BuildTables(curr_part); 675 if(curr_proc) { 685 if(curr_proc) { 676 CopyTables(curr_part, curr_proc); << 686 CopyTables(curr_part, curr_proc); 677 if(p == curr_proc && 0 == run && p->Is << 687 if(p == curr_proc && 0 == run && p->IsIonisationProcess()) { 678 loss_map[aParticle] = p; << 688 loss_map[aParticle] = p; 679 //G4cout << "G4LossTableManager::Bui << 689 //G4cout << "G4LossTableManager::BuildPhysicsTable: " << aParticle->GetParticleName() 680 // << aParticle->GetParticleName << 690 // << " added to map " << p << G4endl; 681 // << " added to map " << p << 691 } 682 } << 683 } 692 } 684 } 693 } 685 if ( !tables_are_built[i] ) { all_tables_a 694 if ( !tables_are_built[i] ) { all_tables_are_built = false; } 686 } 695 } 687 if(1 < verbose) { 696 if(1 < verbose) { 688 G4cout << "### G4LossTableManager::BuildPh 697 G4cout << "### G4LossTableManager::BuildPhysicsTable end: " 689 << "all_tables_are_built= " << all_ 698 << "all_tables_are_built= " << all_tables_are_built << " " 690 << aParticle->GetParticleName() << 699 << aParticle->GetParticleName() << " proc: " << p << G4endl; 691 } 700 } >> 701 if(all_tables_are_built) { >> 702 if(1 < verbose) { >> 703 G4cout << "%%%%% All dEdx and Range tables are built for master run= " >> 704 << run << " %%%%%" << G4endl; >> 705 } >> 706 } 692 } 707 } 693 708 694 //....oooOO0OOooo........oooOO0OOooo........oo 709 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 695 710 696 void G4LossTableManager::CopyTables(const G4Pa 711 void G4LossTableManager::CopyTables(const G4ParticleDefinition* part, 697 G4VEnergyL 712 G4VEnergyLossProcess* base_proc) 698 { 713 { 699 for (G4int j=0; j<n_loss; ++j) { 714 for (G4int j=0; j<n_loss; ++j) { 700 715 701 G4VEnergyLossProcess* proc = loss_vector[j 716 G4VEnergyLossProcess* proc = loss_vector[j]; 702 717 703 if (!tables_are_built[j] && part == base_p 718 if (!tables_are_built[j] && part == base_part_vector[j]) { 704 tables_are_built[j] = true; 719 tables_are_built[j] = true; 705 // for base particle approach only ionis << 706 proc->SetDEDXTable(base_proc->Ionisation 720 proc->SetDEDXTable(base_proc->IonisationTable(),fRestricted); >> 721 proc->SetDEDXTable(base_proc->DEDXTableForSubsec(),fSubRestricted); 707 proc->SetDEDXTable(base_proc->DEDXunRest 722 proc->SetDEDXTable(base_proc->DEDXunRestrictedTable(),fTotal); 708 proc->SetCSDARangeTable(base_proc->CSDAR 723 proc->SetCSDARangeTable(base_proc->CSDARangeTable()); 709 proc->SetRangeTableForLoss(base_proc->Ra 724 proc->SetRangeTableForLoss(base_proc->RangeTableForLoss()); 710 proc->SetInverseRangeTable(base_proc->In 725 proc->SetInverseRangeTable(base_proc->InverseRangeTable()); 711 proc->SetLambdaTable(base_proc->LambdaTa 726 proc->SetLambdaTable(base_proc->LambdaTable()); >> 727 proc->SetSubLambdaTable(base_proc->SubLambdaTable()); >> 728 proc->SetIonisation(base_proc->IsIonisationProcess()); 712 if(proc->IsIonisationProcess()) { 729 if(proc->IsIonisationProcess()) { 713 range_vector[j] = base_proc->RangeTabl 730 range_vector[j] = base_proc->RangeTableForLoss(); 714 inv_range_vector[j] = base_proc->Inver 731 inv_range_vector[j] = base_proc->InverseRangeTable(); 715 loss_map[part_vector[j]] = proc; 732 loss_map[part_vector[j]] = proc; 716 //G4cout << "G4LossTableManager::CopyT << 733 //G4cout << "G4LossTableManager::CopyTable " << part_vector[j]->GetParticleName() 717 // << part_vector[j]->GetParticl << 734 // << " added to map " << proc << G4endl; 718 // << " added to map " << proc < << 719 } 735 } 720 if (1 < verbose) { 736 if (1 < verbose) { 721 G4cout << " CopyTables for " << pro << 737 G4cout << "For " << proc->GetProcessName() 722 << " for " << part_vector[j]-> 738 << " for " << part_vector[j]->GetParticleName() 723 << " base_part= " << part->Get 739 << " base_part= " << part->GetParticleName() 724 << " tables are assigned" 740 << " tables are assigned" 725 << G4endl; 741 << G4endl; 726 } 742 } 727 } 743 } >> 744 >> 745 if (theElectron == part && theElectron == proc->SecondaryParticle() ) { >> 746 proc->SetSecondaryRangeTable(base_proc->RangeTableForLoss()); >> 747 } 728 } 748 } 729 } 749 } 730 750 731 //....oooOO0OOooo........oooOO0OOooo........oo 751 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 732 752 733 G4VEnergyLossProcess* G4LossTableManager::Buil 753 G4VEnergyLossProcess* G4LossTableManager::BuildTables( 734 const G4ParticleDefiniti 754 const G4ParticleDefinition* aParticle) 735 { 755 { 736 if(1 < verbose) { 756 if(1 < verbose) { 737 G4cout << " G4LossTableManager::BuildTab << 757 G4cout << "G4LossTableManager::BuildTables() for " 738 << aParticle->GetParticleName() << 758 << aParticle->GetParticleName() << G4endl; 739 } 759 } 740 760 741 std::vector<G4PhysicsTable*> t_list; 761 std::vector<G4PhysicsTable*> t_list; 742 std::vector<G4VEnergyLossProcess*> loss_list 762 std::vector<G4VEnergyLossProcess*> loss_list; 743 std::vector<G4bool> build_flags; 763 std::vector<G4bool> build_flags; 744 G4VEnergyLossProcess* em = nullptr; 764 G4VEnergyLossProcess* em = nullptr; 745 G4VEnergyLossProcess* p = nullptr; 765 G4VEnergyLossProcess* p = nullptr; 746 G4int iem = 0; 766 G4int iem = 0; 747 G4PhysicsTable* dedx = nullptr; << 767 G4PhysicsTable* dedx = 0; 748 G4int i; 768 G4int i; 749 769 750 G4ProcessVector* pvec = 770 G4ProcessVector* pvec = 751 aParticle->GetProcessManager()->GetProcess 771 aParticle->GetProcessManager()->GetProcessList(); 752 G4int nvec = (G4int)pvec->size(); << 772 G4int nvec = pvec->size(); 753 773 754 for (i=0; i<n_loss; ++i) { 774 for (i=0; i<n_loss; ++i) { 755 p = loss_vector[i]; 775 p = loss_vector[i]; 756 if (nullptr != p) { << 776 if (p) { 757 G4bool yes = (aParticle == part_vector[i 777 G4bool yes = (aParticle == part_vector[i]); 758 778 759 // possible case of process sharing betw 779 // possible case of process sharing between particle/anti-particle 760 if(!yes) { 780 if(!yes) { 761 auto ptr = static_cast<G4VProcess*>(p) << 781 G4VProcess* ptr = static_cast<G4VProcess*>(p); 762 for(G4int j=0; j<nvec; ++j) { 782 for(G4int j=0; j<nvec; ++j) { 763 //G4cout << "j= " << j << " " << (*p 783 //G4cout << "j= " << j << " " << (*pvec)[j] << " " << ptr << G4endl; 764 if(ptr == (*pvec)[j]) { 784 if(ptr == (*pvec)[j]) { 765 yes = true; 785 yes = true; 766 break; 786 break; 767 } 787 } 768 } 788 } 769 } 789 } 770 // process belong to this particle 790 // process belong to this particle 771 if(yes && isActive[i]) { 791 if(yes && isActive[i]) { 772 if (p->IsIonisationProcess() || !em) { 792 if (p->IsIonisationProcess() || !em) { 773 em = p; 793 em = p; 774 iem= i; 794 iem= i; 775 } 795 } 776 // tables may be shared between partic 796 // tables may be shared between particle/anti-particle 777 G4bool val = false; 797 G4bool val = false; 778 if (!tables_are_built[i]) { 798 if (!tables_are_built[i]) { 779 val = true; 799 val = true; 780 dedx = p->BuildDEDXTable(fRestricted 800 dedx = p->BuildDEDXTable(fRestricted); 781 //G4cout << "===Build DEDX table for << 801 //G4cout << "Build DEDX table for " << p->GetProcessName() 782 // << " idx= " << i << " dedx:" << d << 802 // << " idx= " << i << dedx << " " << dedx->length() << G4endl; 783 p->SetDEDXTable(dedx,fRestricted); 803 p->SetDEDXTable(dedx,fRestricted); 784 tables_are_built[i] = true; 804 tables_are_built[i] = true; 785 } else { 805 } else { 786 dedx = p->DEDXTable(); 806 dedx = p->DEDXTable(); 787 } 807 } 788 t_list.push_back(dedx); 808 t_list.push_back(dedx); 789 loss_list.push_back(p); 809 loss_list.push_back(p); 790 build_flags.push_back(val); 810 build_flags.push_back(val); 791 } 811 } 792 } 812 } 793 } 813 } 794 814 795 G4int n_dedx = (G4int)t_list.size(); << 815 G4int n_dedx = t_list.size(); 796 if (0 == n_dedx || !em) { 816 if (0 == n_dedx || !em) { 797 G4cout << "G4LossTableManager WARNING: no 817 G4cout << "G4LossTableManager WARNING: no DEDX processes for " 798 << aParticle->GetParticleName() << 818 << aParticle->GetParticleName() << G4endl; 799 return nullptr; << 819 return 0; 800 } 820 } 801 G4int nSubRegions = em->NumberOfSubCutoffReg 821 G4int nSubRegions = em->NumberOfSubCutoffRegions(); 802 822 803 if (1 < verbose) { 823 if (1 < verbose) { 804 G4cout << " Start to build the sum of << 824 G4cout << "G4LossTableManager::BuildTables() start to build range tables" >> 825 << " and the sum of " << n_dedx << " processes" 805 << " iem= " << iem << " em= " << em 826 << " iem= " << iem << " em= " << em->GetProcessName() 806 << " buildCSDARange= " << theParame 827 << " buildCSDARange= " << theParameters->BuildCSDARange() 807 << " nSubRegions= " << nSubRegions; 828 << " nSubRegions= " << nSubRegions; 808 if(subcutProducer) { 829 if(subcutProducer) { 809 G4cout << " SubCutProducer " << subcutPr 830 G4cout << " SubCutProducer " << subcutProducer->GetName(); 810 } 831 } 811 G4cout << G4endl; 832 G4cout << G4endl; 812 } 833 } 813 // do not build tables if producer class is 834 // do not build tables if producer class is defined 814 if(subcutProducer) { nSubRegions = 0; } 835 if(subcutProducer) { nSubRegions = 0; } 815 836 816 dedx = em->DEDXTable(); << 837 dedx = em->DEDXTable(); >> 838 em->SetIonisation(true); 817 em->SetDEDXTable(dedx, fIsIonisation); 839 em->SetDEDXTable(dedx, fIsIonisation); 818 840 819 if (1 < n_dedx) { 841 if (1 < n_dedx) { 820 dedx = nullptr; << 842 dedx = 0; 821 dedx = G4PhysicsTableHelper::PreparePhysic 843 dedx = G4PhysicsTableHelper::PreparePhysicsTable(dedx); 822 tableBuilder->BuildDEDXTable(dedx, t_list) 844 tableBuilder->BuildDEDXTable(dedx, t_list); 823 em->SetDEDXTable(dedx, fRestricted); 845 em->SetDEDXTable(dedx, fRestricted); 824 } 846 } 825 847 >> 848 /* >> 849 if(2==run && "e-" == aParticle->GetParticleName()) { >> 850 G4cout << "G4LossTableManager::BuildTables for e- " << dedx << G4endl; >> 851 G4cout << (*dedx) << G4endl; >> 852 G4cout << "%%%%% Instance ID= " << (*dedx)[0]->GetInstanceID() << G4endl; >> 853 G4cout << "%%%%% LastValue= " << (*dedx)[0]->GetLastValue() << G4endl; >> 854 G4cout << "%%%%% 1.2 " << (*(dedx))[0]->Value(1.2) << G4endl; >> 855 } >> 856 */ 826 dedx_vector[iem] = dedx; 857 dedx_vector[iem] = dedx; 827 858 828 G4PhysicsTable* range = em->RangeTableForLos 859 G4PhysicsTable* range = em->RangeTableForLoss(); 829 if(!range) range = G4PhysicsTableHelper::Pr 860 if(!range) range = G4PhysicsTableHelper::PreparePhysicsTable(range); 830 range_vector[iem] = range; 861 range_vector[iem] = range; 831 862 832 G4PhysicsTable* invrange = em->InverseRangeT 863 G4PhysicsTable* invrange = em->InverseRangeTable(); 833 if(!invrange) invrange = G4PhysicsTableHelpe 864 if(!invrange) invrange = G4PhysicsTableHelper::PreparePhysicsTable(invrange); 834 inv_range_vector[iem] = invrange; 865 inv_range_vector[iem] = invrange; 835 866 836 tableBuilder->BuildRangeTable(dedx, range); << 867 tableBuilder->BuildRangeTable(dedx, range, true); 837 tableBuilder->BuildInverseRangeTable(range, << 868 tableBuilder->BuildInverseRangeTable(range, invrange, true); >> 869 >> 870 // if(1<verbose) G4cout << *dedx << G4endl; 838 871 839 em->SetRangeTableForLoss(range); 872 em->SetRangeTableForLoss(range); 840 em->SetInverseRangeTable(invrange); 873 em->SetInverseRangeTable(invrange); 841 874 >> 875 // if(1<verbose) G4cout << *range << G4endl; >> 876 >> 877 std::vector<G4PhysicsTable*> listSub; 842 std::vector<G4PhysicsTable*> listCSDA; 878 std::vector<G4PhysicsTable*> listCSDA; 843 879 844 for (i=0; i<n_dedx; ++i) { 880 for (i=0; i<n_dedx; ++i) { 845 p = loss_list[i]; 881 p = loss_list[i]; >> 882 if(p != em) { p->SetIonisation(false); } 846 if(build_flags[i]) { 883 if(build_flags[i]) { 847 p->SetLambdaTable(p->BuildLambdaTable(fR 884 p->SetLambdaTable(p->BuildLambdaTable(fRestricted)); 848 } 885 } >> 886 if (0 < nSubRegions) { >> 887 dedx = p->BuildDEDXTable(fSubRestricted); >> 888 p->SetDEDXTable(dedx,fSubRestricted); >> 889 listSub.push_back(dedx); >> 890 if(build_flags[i]) { >> 891 p->SetSubLambdaTable(p->BuildLambdaTable(fSubRestricted)); >> 892 if(p != em) { em->AddCollaborativeProcess(p); } >> 893 } >> 894 } 849 if(theParameters->BuildCSDARange()) { 895 if(theParameters->BuildCSDARange()) { 850 dedx = p->BuildDEDXTable(fTotal); 896 dedx = p->BuildDEDXTable(fTotal); 851 p->SetDEDXTable(dedx,fTotal); 897 p->SetDEDXTable(dedx,fTotal); 852 listCSDA.push_back(dedx); 898 listCSDA.push_back(dedx); 853 } 899 } 854 } 900 } 855 901 >> 902 if (0 < nSubRegions) { >> 903 G4PhysicsTable* dedxSub = em->IonisationTableForSubsec(); >> 904 if (1 < listSub.size()) { >> 905 em->SetDEDXTable(dedxSub, fIsSubIonisation); >> 906 dedxSub = 0; >> 907 dedxSub = G4PhysicsTableHelper::PreparePhysicsTable(dedxSub); >> 908 tableBuilder->BuildDEDXTable(dedxSub, listSub); >> 909 em->SetDEDXTable(dedxSub, fSubRestricted); >> 910 } >> 911 } 856 if(theParameters->BuildCSDARange()) { 912 if(theParameters->BuildCSDARange()) { 857 G4PhysicsTable* dedxCSDA = em->DEDXunRestr 913 G4PhysicsTable* dedxCSDA = em->DEDXunRestrictedTable(); 858 if (1 < n_dedx) { 914 if (1 < n_dedx) { >> 915 dedxCSDA = nullptr; 859 dedxCSDA = G4PhysicsTableHelper::Prepare 916 dedxCSDA = G4PhysicsTableHelper::PreparePhysicsTable(dedxCSDA); 860 tableBuilder->BuildDEDXTable(dedxCSDA, l 917 tableBuilder->BuildDEDXTable(dedxCSDA, listCSDA); 861 em->SetDEDXTable(dedxCSDA,fTotal); 918 em->SetDEDXTable(dedxCSDA,fTotal); 862 } 919 } 863 G4PhysicsTable* rCSDA = em->CSDARangeTable 920 G4PhysicsTable* rCSDA = em->CSDARangeTable(); 864 if(!rCSDA) { rCSDA = G4PhysicsTableHelper: 921 if(!rCSDA) { rCSDA = G4PhysicsTableHelper::PreparePhysicsTable(rCSDA); } 865 tableBuilder->BuildRangeTable(dedxCSDA, rC << 922 tableBuilder->BuildRangeTable(dedxCSDA, rCSDA, true); 866 em->SetCSDARangeTable(rCSDA); 923 em->SetCSDARangeTable(rCSDA); 867 } 924 } 868 925 869 if (1 < verbose) { 926 if (1 < verbose) { 870 G4cout << "G4LossTableManager::BuildTables 927 G4cout << "G4LossTableManager::BuildTables: Tables are built for " 871 << aParticle->GetParticleName() 928 << aParticle->GetParticleName() 872 << "; ionisation process: " << em-> 929 << "; ionisation process: " << em->GetProcessName() 873 << " " << em 930 << " " << em 874 << G4endl; 931 << G4endl; 875 } 932 } 876 return em; 933 return em; 877 } 934 } 878 935 879 //....oooOO0OOooo........oooOO0OOooo........oo 936 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 880 937 >> 938 G4EnergyLossMessenger* G4LossTableManager::GetMessenger() >> 939 { >> 940 return theMessenger; >> 941 } >> 942 >> 943 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 944 881 void G4LossTableManager::ParticleHaveNoLoss( 945 void G4LossTableManager::ParticleHaveNoLoss( 882 const G4ParticleDefinition* aParticle) 946 const G4ParticleDefinition* aParticle) 883 { 947 { 884 G4ExceptionDescription ed; 948 G4ExceptionDescription ed; 885 ed << "Energy loss process not found for " < 949 ed << "Energy loss process not found for " << aParticle->GetParticleName() 886 << " !"; 950 << " !"; 887 G4Exception("G4LossTableManager::ParticleHav 951 G4Exception("G4LossTableManager::ParticleHaveNoLoss", "em0001", 888 FatalException, ed); 952 FatalException, ed); 889 } 953 } 890 954 891 //....oooOO0OOooo........oooOO0OOooo........oo 955 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 892 956 893 void G4LossTableManager::SetVerbose(G4int val) << 957 void G4LossTableManager::SetLossFluctuations(G4bool /*val*/) >> 958 { >> 959 } >> 960 >> 961 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 962 >> 963 void G4LossTableManager::SetSubCutoff(G4bool val, const G4Region* r) 894 { 964 { 895 verbose = val; << 965 subCutoffFlag = val; >> 966 for(G4int i=0; i<n_loss; ++i) { >> 967 if(loss_vector[i]) { loss_vector[i]->ActivateSubCutoff(val, r); } >> 968 } 896 } 969 } 897 970 898 //....oooOO0OOooo........oooOO0OOooo........oo 971 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 899 972 >> 973 void G4LossTableManager::SetIntegral(G4bool val) >> 974 { >> 975 integral = val; >> 976 integralActive = true; >> 977 for(G4int i=0; i<n_loss; ++i) { >> 978 if(loss_vector[i]) { loss_vector[i]->SetIntegral(val); } >> 979 } >> 980 size_t emp = emp_vector.size(); >> 981 for (size_t k=0; k<emp; ++k) { >> 982 if(emp_vector[k]) { emp_vector[k]->SetIntegral(val); } >> 983 } >> 984 } >> 985 >> 986 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 987 >> 988 void G4LossTableManager::SetMinSubRange(G4double /*val*/) >> 989 { >> 990 } >> 991 >> 992 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 993 >> 994 void G4LossTableManager::SetRandomStep(G4bool /*val*/) >> 995 { >> 996 } >> 997 >> 998 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 999 >> 1000 void G4LossTableManager::SetMinEnergy(G4double val) >> 1001 { >> 1002 theParameters->SetMinEnergy(val); >> 1003 } >> 1004 >> 1005 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1006 >> 1007 void G4LossTableManager::SetMaxEnergy(G4double val) >> 1008 { >> 1009 theParameters->SetMaxEnergy(val); >> 1010 } >> 1011 >> 1012 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1013 >> 1014 void G4LossTableManager::SetMaxEnergyForCSDARange(G4double val) >> 1015 { >> 1016 theParameters->SetMaxEnergyForCSDARange(val); >> 1017 } >> 1018 >> 1019 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1020 >> 1021 void G4LossTableManager::SetMaxEnergyForMuons(G4double val) >> 1022 { >> 1023 theParameters->SetMaxEnergy(val); >> 1024 } >> 1025 >> 1026 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1027 >> 1028 void G4LossTableManager::SetDEDXBinning(G4int val) >> 1029 { >> 1030 theParameters->SetNumberOfBins(val); >> 1031 } >> 1032 >> 1033 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1034 >> 1035 void G4LossTableManager::SetDEDXBinningForCSDARange(G4int /*n*/) >> 1036 { >> 1037 } >> 1038 >> 1039 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1040 >> 1041 void G4LossTableManager::SetLambdaBinning(G4int val) >> 1042 { >> 1043 theParameters->SetNumberOfBins(val); >> 1044 } >> 1045 >> 1046 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1047 >> 1048 void G4LossTableManager::SetVerbose(G4int /*val*/) >> 1049 { >> 1050 } >> 1051 >> 1052 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1053 >> 1054 void G4LossTableManager::SetStepFunction(G4double v1, G4double v2) >> 1055 { >> 1056 if(0.0 < v1 && 0.0 < v2 && v2 < 1.e+50) { >> 1057 stepFunctionActive = true; >> 1058 maxRangeVariation = v1; >> 1059 maxFinalStep = v2; >> 1060 for(G4int i=0; i<n_loss; ++i) { >> 1061 if(loss_vector[i]) { loss_vector[i]->SetStepFunction(v1, v2); } >> 1062 } >> 1063 } else if(v1 <= 0.0) { >> 1064 PrintEWarning("SetStepFunction", v1); >> 1065 } else { >> 1066 PrintEWarning("SetStepFunction", v2); >> 1067 } >> 1068 } >> 1069 >> 1070 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1071 >> 1072 void G4LossTableManager::SetLinearLossLimit(G4double /*val*/) >> 1073 { >> 1074 } >> 1075 >> 1076 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1077 >> 1078 void G4LossTableManager::SetBuildCSDARange(G4bool /*val*/) >> 1079 { >> 1080 } >> 1081 >> 1082 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1083 >> 1084 void >> 1085 G4LossTableManager::SetParameters(const G4ParticleDefinition* /*aParticle*/, >> 1086 G4VEnergyLossProcess* p) >> 1087 { >> 1088 if(stepFunctionActive) { >> 1089 p->SetStepFunction(maxRangeVariation, maxFinalStep); >> 1090 } >> 1091 if(integralActive) { p->SetIntegral(integral); } >> 1092 } >> 1093 >> 1094 >> 1095 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... >> 1096 900 const std::vector<G4VEnergyLossProcess*>& 1097 const std::vector<G4VEnergyLossProcess*>& 901 G4LossTableManager::GetEnergyLossProcessVector 1098 G4LossTableManager::GetEnergyLossProcessVector() 902 { 1099 { 903 return loss_vector; 1100 return loss_vector; 904 } 1101 } 905 1102 906 //....oooOO0OOooo........oooOO0OOooo........oo 1103 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 907 1104 908 const std::vector<G4VEmProcess*>& G4LossTableM 1105 const std::vector<G4VEmProcess*>& G4LossTableManager::GetEmProcessVector() 909 { 1106 { 910 return emp_vector; 1107 return emp_vector; 911 } 1108 } 912 1109 913 //....oooOO0OOooo........oooOO0OOooo........oo 1110 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 914 1111 915 const std::vector<G4VMultipleScattering*>& 1112 const std::vector<G4VMultipleScattering*>& 916 G4LossTableManager::GetMultipleScatteringVecto 1113 G4LossTableManager::GetMultipleScatteringVector() 917 { 1114 { 918 return msc_vector; 1115 return msc_vector; 919 } 1116 } 920 1117 921 //....oooOO0OOooo........oooOO0OOooo........oo 1118 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 922 1119 923 G4EmSaturation* G4LossTableManager::EmSaturati 1120 G4EmSaturation* G4LossTableManager::EmSaturation() 924 { 1121 { 925 return theParameters->GetEmSaturation(); << 1122 if(!emSaturation) { emSaturation = new G4EmSaturation(verbose); } >> 1123 return emSaturation; 926 } 1124 } 927 1125 928 //....oooOO0OOooo........oooOO0OOooo........oo 1126 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 929 1127 930 G4EmConfigurator* G4LossTableManager::EmConfig 1128 G4EmConfigurator* G4LossTableManager::EmConfigurator() 931 { 1129 { 932 if(!emConfigurator) { << 1130 if(!emConfigurator) { emConfigurator = new G4EmConfigurator(verbose); } 933 emConfigurator = new G4EmConfigurator(verb << 934 } << 935 return emConfigurator; 1131 return emConfigurator; 936 } 1132 } 937 1133 938 //....oooOO0OOooo........oooOO0OOooo........oo 1134 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 939 1135 940 G4ElectronIonPair* G4LossTableManager::Electro 1136 G4ElectronIonPair* G4LossTableManager::ElectronIonPair() 941 { 1137 { 942 if(!emElectronIonPair) { 1138 if(!emElectronIonPair) { 943 emElectronIonPair = new G4ElectronIonPair( 1139 emElectronIonPair = new G4ElectronIonPair(verbose); 944 } 1140 } 945 return emElectronIonPair; 1141 return emElectronIonPair; 946 } 1142 } 947 1143 948 //....oooOO0OOooo........oooOO0OOooo........oo << 949 << 950 void G4LossTableManager::SetNIELCalculator(G4N << 951 { << 952 if(nullptr != ptr && ptr != nielCalculator) << 953 delete nielCalculator; << 954 nielCalculator = ptr; << 955 } << 956 } << 957 << 958 //....oooOO0OOooo........oooOO0OOooo........oo << 959 << 960 G4NIELCalculator* G4LossTableManager::NIELCalc << 961 { << 962 if(!nielCalculator) { << 963 nielCalculator = new G4NIELCalculator(null << 964 } << 965 return nielCalculator; << 966 } << 967 << 968 //....oooOO0OOooo........oooOO0OOooo........oo 1144 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 969 1145 970 void G4LossTableManager::SetAtomDeexcitation(G 1146 void G4LossTableManager::SetAtomDeexcitation(G4VAtomDeexcitation* p) 971 { 1147 { 972 if(atomDeexcitation != p) { 1148 if(atomDeexcitation != p) { 973 delete atomDeexcitation; 1149 delete atomDeexcitation; 974 atomDeexcitation = p; 1150 atomDeexcitation = p; 975 } 1151 } 976 } 1152 } 977 1153 978 //....oooOO0OOooo........oooOO0OOooo........oo 1154 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 979 1155 980 void G4LossTableManager::SetSubCutProducer(G4V 1156 void G4LossTableManager::SetSubCutProducer(G4VSubCutProducer* p) 981 { 1157 { 982 if(subcutProducer != p) { 1158 if(subcutProducer != p) { 983 delete subcutProducer; 1159 delete subcutProducer; 984 subcutProducer = p; 1160 subcutProducer = p; 985 } 1161 } 986 } 1162 } 987 1163 988 //....oooOO0OOooo........oooOO0OOooo........oo 1164 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 989 1165 990 void G4LossTableManager::PrintEWarning(G4Strin 1166 void G4LossTableManager::PrintEWarning(G4String tit, G4double /*val*/) 991 { 1167 { 992 G4String ss = "G4LossTableManager::" + tit; 1168 G4String ss = "G4LossTableManager::" + tit; 993 G4ExceptionDescription ed; 1169 G4ExceptionDescription ed; 994 /* 1170 /* 995 ed << "Parameter is out of range: " << val 1171 ed << "Parameter is out of range: " << val 996 << " it will have no effect!\n" << " ## " 1172 << " it will have no effect!\n" << " ## " 997 << " nbins= " << nbinsLambda 1173 << " nbins= " << nbinsLambda 998 << " nbinsPerDecade= " << nbinsPerDecade 1174 << " nbinsPerDecade= " << nbinsPerDecade 999 << " Emin(keV)= " << minKinEnergy/keV 1175 << " Emin(keV)= " << minKinEnergy/keV 1000 << " Emax(GeV)= " << maxKinEnergy/GeV; 1176 << " Emax(GeV)= " << maxKinEnergy/GeV; 1001 */ 1177 */ 1002 G4Exception(ss, "em0044", JustWarning, ed); 1178 G4Exception(ss, "em0044", JustWarning, ed); 1003 } 1179 } 1004 1180 1005 //....oooOO0OOooo........oooOO0OOooo........o 1181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1006 << 1007 void G4LossTableManager::DumpHtml() << 1008 { << 1009 // Automatic generation of html documentati << 1010 // List processes and models for the most i << 1011 // particles in descending order of importa << 1012 // NB. for model names with length > 18 cha << 1013 // to be edited by hand. Or modify G4EmMod << 1014 << 1015 char* dirName = std::getenv("G4PhysListDocD << 1016 char* physList = std::getenv("G4PhysListNam << 1017 if (dirName && physList) { << 1018 G4String physListName = G4String(physList << 1019 G4String pathName = G4String(dirName) + " << 1020 << 1021 std::ofstream outFile; << 1022 outFile.open(pathName); << 1023 << 1024 outFile << physListName << G4endl; << 1025 outFile << std::string(physListName.lengt << 1026 << 1027 std::vector<G4ParticleDefinition*> partic << 1028 G4Gamma::Gamma(), << 1029 G4Electron::Electron(), << 1030 G4Positron::Positron(), << 1031 G4Proton::ProtonDefinition(), << 1032 G4MuonPlus::MuonPlusDefinition(), << 1033 G4MuonMinus::MuonMinusDefinition(), << 1034 }; << 1035 << 1036 std::vector<G4VEmProcess*> emproc_vector << 1037 std::vector<G4VEnergyLossProcess*> enloss << 1038 GetEnergyLossProcessVector(); << 1039 std::vector<G4VMultipleScattering*> mscat << 1040 GetMultipleScatteringVector(); << 1041 << 1042 for (auto theParticle : particles) { << 1043 outFile << G4endl << "**" << theParticl << 1044 << "**" << G4endl << G4endl << << 1045 << 1046 G4ProcessManager* pm = theParticle->Get << 1047 G4ProcessVector* pv = pm->GetProcessLi << 1048 G4int plen = pm->GetProcessListLength() << 1049 << 1050 for (auto emproc : emproc_vector) { << 1051 for (G4int i = 0; i < plen; ++i) { << 1052 G4VProcess* proc = (*pv)[i]; << 1053 if (proc == emproc) { << 1054 outFile << G4endl; << 1055 proc->ProcessDescription(outFile) << 1056 break; << 1057 } << 1058 } << 1059 } << 1060 << 1061 for (auto mscproc : mscat_vector) { << 1062 for (G4int i = 0; i < plen; ++i) { << 1063 G4VProcess* proc = (*pv)[i]; << 1064 if (proc == mscproc) { << 1065 outFile << G4endl; << 1066 proc->ProcessDescription(outFile) << 1067 break; << 1068 } << 1069 } << 1070 } << 1071 << 1072 for (auto enlossproc : enloss_vector) { << 1073 for (G4int i = 0; i < plen; ++i) { << 1074 G4VProcess* proc = (*pv)[i]; << 1075 if (proc == enlossproc) { << 1076 outFile << G4endl; << 1077 proc->ProcessDescription(outFile) << 1078 break; << 1079 } << 1080 } << 1081 } << 1082 } << 1083 outFile.close(); << 1084 } << 1085 } << 1086 << 1087 //....oooOO0OOooo........oooOO0OOooo........o << 1088 << 1089 1182