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 // ------------------------------------------- 26 // ------------------------------------------------------------------- 27 // 27 // 28 // GEANT4 Class file 28 // GEANT4 Class file 29 // 29 // 30 // 30 // 31 // File name: G4VEmModel 31 // File name: G4VEmModel 32 // 32 // 33 // Author: Vladimir Ivanchenko 33 // Author: Vladimir Ivanchenko 34 // 34 // 35 // Creation date: 25.07.2005 35 // Creation date: 25.07.2005 36 // 36 // 37 // Modifications: 37 // Modifications: 38 // 25.10.2005 Set default highLimit=100.TeV (V 38 // 25.10.2005 Set default highLimit=100.TeV (V.Ivanchenko) 39 // 06.02.2006 add method ComputeMeanFreePath() 39 // 06.02.2006 add method ComputeMeanFreePath() (mma) 40 // 16.02.2009 Move implementations of virtual 40 // 16.02.2009 Move implementations of virtual methods to source (VI) 41 // 41 // 42 // 42 // 43 // Class Description: 43 // Class Description: 44 // 44 // 45 // Abstract interface to energy loss models 45 // Abstract interface to energy loss models 46 46 47 // ------------------------------------------- 47 // ------------------------------------------------------------------- 48 // 48 // 49 49 50 #include "G4VEmModel.hh" 50 #include "G4VEmModel.hh" 51 #include "G4ElementData.hh" 51 #include "G4ElementData.hh" 52 #include "G4LossTableManager.hh" 52 #include "G4LossTableManager.hh" 53 #include "G4LossTableBuilder.hh" 53 #include "G4LossTableBuilder.hh" 54 #include "G4ProductionCutsTable.hh" 54 #include "G4ProductionCutsTable.hh" 55 #include "G4ParticleChangeForLoss.hh" 55 #include "G4ParticleChangeForLoss.hh" 56 #include "G4ParticleChangeForGamma.hh" 56 #include "G4ParticleChangeForGamma.hh" 57 #include "G4EmParameters.hh" 57 #include "G4EmParameters.hh" 58 #include "G4SystemOfUnits.hh" 58 #include "G4SystemOfUnits.hh" 59 #include "G4EmUtility.hh" 59 #include "G4EmUtility.hh" 60 #include "G4Log.hh" 60 #include "G4Log.hh" 61 #include "Randomize.hh" 61 #include "Randomize.hh" 62 #include <iostream> 62 #include <iostream> 63 63 64 //....oooOO0OOooo........oooOO0OOooo........oo 64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 65 //....oooOO0OOooo........oooOO0OOooo........oo 65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 66 66 67 G4VEmModel::G4VEmModel(const G4String& nam): 67 G4VEmModel::G4VEmModel(const G4String& nam): 68 inveplus(1.0/CLHEP::eplus), 68 inveplus(1.0/CLHEP::eplus), 69 lowLimit(0.1*CLHEP::keV), 69 lowLimit(0.1*CLHEP::keV), 70 highLimit(100.0*CLHEP::TeV), 70 highLimit(100.0*CLHEP::TeV), 71 polarAngleLimit(CLHEP::pi), 71 polarAngleLimit(CLHEP::pi), 72 name(nam) 72 name(nam) 73 { 73 { 74 xsec.resize(nsec); 74 xsec.resize(nsec); 75 fEmManager = G4LossTableManager::Instance(); 75 fEmManager = G4LossTableManager::Instance(); 76 fEmManager->Register(this); 76 fEmManager->Register(this); 77 isMaster = fEmManager->IsMaster(); << 77 78 << 79 G4LossTableBuilder* bld = fEmManager->GetTab 78 G4LossTableBuilder* bld = fEmManager->GetTableBuilder(); 80 theDensityFactor = bld->GetDensityFactors(); 79 theDensityFactor = bld->GetDensityFactors(); 81 theDensityIdx = bld->GetCoupleIndexes(); 80 theDensityIdx = bld->GetCoupleIndexes(); 82 } 81 } 83 82 84 //....oooOO0OOooo........oooOO0OOooo........oo 83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 85 84 86 G4VEmModel::~G4VEmModel() 85 G4VEmModel::~G4VEmModel() 87 { 86 { 88 if(localElmSelectors) { 87 if(localElmSelectors) { 89 for(G4int i=0; i<nSelectors; ++i) { 88 for(G4int i=0; i<nSelectors; ++i) { 90 delete (*elmSelectors)[i]; 89 delete (*elmSelectors)[i]; 91 } 90 } 92 delete elmSelectors; 91 delete elmSelectors; 93 } 92 } 94 delete anglModel; 93 delete anglModel; 95 94 96 if(localTable && xSectionTable != nullptr) { 95 if(localTable && xSectionTable != nullptr) { 97 xSectionTable->clearAndDestroy(); 96 xSectionTable->clearAndDestroy(); 98 delete xSectionTable; 97 delete xSectionTable; 99 xSectionTable = nullptr; 98 xSectionTable = nullptr; 100 } 99 } 101 fEmManager->DeRegister(this); 100 fEmManager->DeRegister(this); 102 } 101 } 103 102 104 //....oooOO0OOooo........oooOO0OOooo........oo 103 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 105 104 106 G4ParticleChangeForLoss* G4VEmModel::GetPartic 105 G4ParticleChangeForLoss* G4VEmModel::GetParticleChangeForLoss() 107 { 106 { 108 G4ParticleChangeForLoss* p = nullptr; 107 G4ParticleChangeForLoss* p = nullptr; 109 if (pParticleChange != nullptr) { 108 if (pParticleChange != nullptr) { 110 p = static_cast<G4ParticleChangeForLoss*>( 109 p = static_cast<G4ParticleChangeForLoss*>(pParticleChange); 111 } else { 110 } else { 112 p = new G4ParticleChangeForLoss(); 111 p = new G4ParticleChangeForLoss(); 113 pParticleChange = p; 112 pParticleChange = p; 114 } 113 } 115 if(fTripletModel != nullptr) { fTripletModel 114 if(fTripletModel != nullptr) { fTripletModel->SetParticleChange(p); } 116 return p; 115 return p; 117 } 116 } 118 117 119 //....oooOO0OOooo........oooOO0OOooo........oo 118 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 120 119 121 G4ParticleChangeForGamma* G4VEmModel::GetParti 120 G4ParticleChangeForGamma* G4VEmModel::GetParticleChangeForGamma() 122 { 121 { 123 G4ParticleChangeForGamma* p = nullptr; 122 G4ParticleChangeForGamma* p = nullptr; 124 if (pParticleChange != nullptr) { 123 if (pParticleChange != nullptr) { 125 p = static_cast<G4ParticleChangeForGamma*> 124 p = static_cast<G4ParticleChangeForGamma*>(pParticleChange); 126 } else { 125 } else { 127 p = new G4ParticleChangeForGamma(); 126 p = new G4ParticleChangeForGamma(); 128 pParticleChange = p; 127 pParticleChange = p; 129 } 128 } 130 if(fTripletModel != nullptr) { fTripletModel 129 if(fTripletModel != nullptr) { fTripletModel->SetParticleChange(p); } 131 return p; 130 return p; 132 } 131 } 133 132 134 //....oooOO0OOooo........oooOO0OOooo........oo 133 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 135 134 136 void G4VEmModel::InitialiseElementSelectors(co 135 void G4VEmModel::InitialiseElementSelectors(const G4ParticleDefinition* part, 137 co 136 const G4DataVector& cuts) 138 { 137 { 139 if(highLimit <= lowLimit) { return; } 138 if(highLimit <= lowLimit) { return; } 140 G4EmUtility::InitialiseElementSelectors(this 139 G4EmUtility::InitialiseElementSelectors(this,part,cuts,lowLimit,highLimit); 141 localElmSelectors = true; 140 localElmSelectors = true; 142 } 141 } 143 142 144 //....oooOO0OOooo........oooOO0OOooo........oo 143 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 145 144 146 void G4VEmModel::InitialiseLocal(const G4Parti 145 void G4VEmModel::InitialiseLocal(const G4ParticleDefinition*, G4VEmModel*) 147 {} 146 {} 148 147 149 //....oooOO0OOooo........oooOO0OOooo........oo 148 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 150 149 151 void G4VEmModel::InitialiseForMaterial(const G 150 void G4VEmModel::InitialiseForMaterial(const G4ParticleDefinition* part, 152 const G 151 const G4Material* material) 153 { 152 { 154 if(material != nullptr) { 153 if(material != nullptr) { 155 G4int n = (G4int)material->GetNumberOfElem 154 G4int n = (G4int)material->GetNumberOfElements(); 156 for(G4int i=0; i<n; ++i) { 155 for(G4int i=0; i<n; ++i) { 157 G4int Z = material->GetElement(i)->GetZa 156 G4int Z = material->GetElement(i)->GetZasInt(); 158 InitialiseForElement(part, Z); 157 InitialiseForElement(part, Z); 159 } 158 } 160 } 159 } 161 } 160 } 162 161 163 //....oooOO0OOooo........oooOO0OOooo........oo 162 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 164 163 165 void G4VEmModel::InitialiseForElement(const G4 164 void G4VEmModel::InitialiseForElement(const G4ParticleDefinition*, G4int) 166 {} 165 {} 167 166 168 //....oooOO0OOooo........oooOO0OOooo........oo 167 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 169 168 170 G4double G4VEmModel::ComputeDEDXPerVolume(cons 169 G4double G4VEmModel::ComputeDEDXPerVolume(const G4Material*, 171 cons 170 const G4ParticleDefinition*, 172 G4do 171 G4double,G4double) 173 { 172 { 174 return 0.0; 173 return 0.0; 175 } 174 } 176 175 177 //....oooOO0OOooo........oooOO0OOooo........oo 176 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 178 177 179 G4double G4VEmModel::CrossSectionPerVolume(con 178 G4double G4VEmModel::CrossSectionPerVolume(const G4Material* mat, 180 con 179 const G4ParticleDefinition* p, 181 G4d 180 G4double ekin, 182 G4d 181 G4double emin, 183 G4d 182 G4double emax) 184 { 183 { 185 SetupForMaterial(p, mat, ekin); 184 SetupForMaterial(p, mat, ekin); 186 const G4double* theAtomNumDensityVector = ma 185 const G4double* theAtomNumDensityVector = mat->GetVecNbOfAtomsPerVolume(); 187 G4int nelm = (G4int)mat->GetNumberOfElements 186 G4int nelm = (G4int)mat->GetNumberOfElements(); 188 if(nelm > nsec) { 187 if(nelm > nsec) { 189 xsec.resize(nelm); 188 xsec.resize(nelm); 190 nsec = nelm; 189 nsec = nelm; 191 } 190 } 192 G4double cross = 0.0; 191 G4double cross = 0.0; 193 for (G4int i=0; i<nelm; ++i) { 192 for (G4int i=0; i<nelm; ++i) { 194 cross += theAtomNumDensityVector[i]* 193 cross += theAtomNumDensityVector[i]* 195 ComputeCrossSectionPerAtom(p,mat->GetEle 194 ComputeCrossSectionPerAtom(p,mat->GetElement(i),ekin,emin,emax); 196 xsec[i] = cross; 195 xsec[i] = cross; 197 } 196 } 198 return cross; 197 return cross; 199 } 198 } 200 199 201 //....oooOO0OOooo........oooOO0OOooo........oo 200 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 202 201 203 G4double G4VEmModel::GetPartialCrossSection(co 202 G4double G4VEmModel::GetPartialCrossSection(const G4Material*, G4int, 204 co 203 const G4ParticleDefinition*, 205 G4 204 G4double) 206 { 205 { 207 return 0.0; 206 return 0.0; 208 } 207 } 209 208 210 //....oooOO0OOooo........oooOO0OOooo........oo 209 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 211 210 212 void G4VEmModel::StartTracking(G4Track*) 211 void G4VEmModel::StartTracking(G4Track*) 213 {} 212 {} 214 213 215 //....oooOO0OOooo........oooOO0OOooo........oo 214 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 216 215 217 const G4Element* G4VEmModel::SelectRandomAtom( 216 const G4Element* G4VEmModel::SelectRandomAtom(const G4Material* mat, 218 217 const G4ParticleDefinition* pd, 219 218 G4double kinEnergy, 220 219 G4double tcut, 221 220 G4double tmax) 222 { 221 { 223 G4int n = (G4int)mat->GetNumberOfElements(); 222 G4int n = (G4int)mat->GetNumberOfElements(); 224 fCurrentElement = mat->GetElement(0); 223 fCurrentElement = mat->GetElement(0); 225 if (n > 1) { 224 if (n > 1) { 226 const G4double x = G4UniformRand()* 225 const G4double x = G4UniformRand()* 227 G4VEmModel::CrossSectionPerVolume(mat,pd 226 G4VEmModel::CrossSectionPerVolume(mat,pd,kinEnergy,tcut,tmax); 228 for(G4int i=0; i<n; ++i) { 227 for(G4int i=0; i<n; ++i) { 229 if (x <= xsec[i]) { 228 if (x <= xsec[i]) { 230 fCurrentElement = mat->GetElement(i); 229 fCurrentElement = mat->GetElement(i); 231 break; 230 break; 232 } 231 } 233 } 232 } 234 } 233 } 235 return fCurrentElement; 234 return fCurrentElement; 236 } 235 } 237 236 238 //....oooOO0OOooo........oooOO0OOooo........oo 237 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 239 238 240 const G4Element* G4VEmModel::GetCurrentElement 239 const G4Element* G4VEmModel::GetCurrentElement(const G4Material* mat) const 241 { 240 { 242 const G4Element* elm = fCurrentElement; 241 const G4Element* elm = fCurrentElement; 243 if(nullptr == elm && nullptr != mat) { 242 if(nullptr == elm && nullptr != mat) { 244 elm = G4EmUtility::SampleRandomElement(mat 243 elm = G4EmUtility::SampleRandomElement(mat); 245 } 244 } 246 return elm; 245 return elm; 247 } 246 } 248 247 249 //....oooOO0OOooo........oooOO0OOooo........oo 248 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 250 249 251 G4int G4VEmModel::SelectRandomAtomNumber(const 250 G4int G4VEmModel::SelectRandomAtomNumber(const G4Material* mat) const 252 { 251 { 253 const G4Element* elm = GetCurrentElement(mat 252 const G4Element* elm = GetCurrentElement(mat); 254 return (nullptr == elm) ? 0 : elm->GetZasInt 253 return (nullptr == elm) ? 0 : elm->GetZasInt(); 255 } 254 } 256 255 257 //....oooOO0OOooo........oooOO0OOooo........oo 256 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 258 257 259 const G4Isotope* G4VEmModel::GetCurrentIsotope 258 const G4Isotope* G4VEmModel::GetCurrentIsotope(const G4Element* elm) const 260 { 259 { 261 const G4Isotope* iso = nullptr; 260 const G4Isotope* iso = nullptr; 262 const G4Element* el = elm; 261 const G4Element* el = elm; 263 if(nullptr == el && nullptr != fCurrentCoupl 262 if(nullptr == el && nullptr != fCurrentCouple) { 264 el = GetCurrentElement(fCurrentCouple->Get 263 el = GetCurrentElement(fCurrentCouple->GetMaterial()); 265 } 264 } 266 if(nullptr != el) { 265 if(nullptr != el) { 267 iso = G4EmUtility::SampleRandomIsotope(el) 266 iso = G4EmUtility::SampleRandomIsotope(el); 268 } 267 } 269 return iso; 268 return iso; 270 } 269 } 271 270 272 //....oooOO0OOooo........oooOO0OOooo........oo 271 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 273 272 274 G4int G4VEmModel::SelectIsotopeNumber(const G4 273 G4int G4VEmModel::SelectIsotopeNumber(const G4Element* elm) const 275 { 274 { 276 auto iso = GetCurrentIsotope(elm); 275 auto iso = GetCurrentIsotope(elm); 277 return (nullptr != iso) ? iso->GetN() : 0; 276 return (nullptr != iso) ? iso->GetN() : 0; 278 } 277 } 279 278 280 //....oooOO0OOooo........oooOO0OOooo........oo 279 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 281 280 282 G4double G4VEmModel::ComputeCrossSectionPerAto 281 G4double G4VEmModel::ComputeCrossSectionPerAtom(const G4ParticleDefinition*, 283 282 G4double, G4double, G4double, 284 283 G4double, G4double) 285 { 284 { 286 return 0.0; 285 return 0.0; 287 } 286 } 288 287 289 //....oooOO0OOooo........oooOO0OOooo........oo 288 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 290 289 291 G4double 290 G4double 292 G4VEmModel::ComputeCrossSectionPerShell(const 291 G4VEmModel::ComputeCrossSectionPerShell(const G4ParticleDefinition*, 293 G4int, 292 G4int, G4int, 294 G4doub 293 G4double, G4double, G4double) 295 { 294 { 296 return 0.0; 295 return 0.0; 297 } 296 } 298 297 299 //....oooOO0OOooo........oooOO0OOooo........oo 298 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 300 299 301 void G4VEmModel::DefineForRegion(const G4Regio 300 void G4VEmModel::DefineForRegion(const G4Region*) 302 {} 301 {} 303 302 304 //....oooOO0OOooo........oooOO0OOooo........oo 303 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 305 304 306 void G4VEmModel::FillNumberOfSecondaries(G4int 305 void G4VEmModel::FillNumberOfSecondaries(G4int& numberOfTriplets, 307 G4int 306 G4int& numberOfRecoil) 308 { 307 { 309 numberOfTriplets = 0; 308 numberOfTriplets = 0; 310 numberOfRecoil = 0; 309 numberOfRecoil = 0; 311 } 310 } 312 311 313 //....oooOO0OOooo........oooOO0OOooo........oo 312 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 314 313 315 G4double G4VEmModel::ChargeSquareRatio(const G 314 G4double G4VEmModel::ChargeSquareRatio(const G4Track& track) 316 { 315 { 317 return GetChargeSquareRatio(track.GetParticl 316 return GetChargeSquareRatio(track.GetParticleDefinition(), 318 track.GetMateria 317 track.GetMaterial(), track.GetKineticEnergy()); 319 } 318 } 320 319 321 //....oooOO0OOooo........oooOO0OOooo........oo 320 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 322 321 323 G4double G4VEmModel::GetChargeSquareRatio(cons 322 G4double G4VEmModel::GetChargeSquareRatio(const G4ParticleDefinition* p, 324 cons 323 const G4Material*, G4double) 325 { 324 { 326 const G4double q = p->GetPDGCharge()*inveplu 325 const G4double q = p->GetPDGCharge()*inveplus; 327 return q*q; 326 return q*q; 328 } 327 } 329 328 330 //....oooOO0OOooo........oooOO0OOooo........oo 329 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 331 330 332 G4double G4VEmModel::GetParticleCharge(const G 331 G4double G4VEmModel::GetParticleCharge(const G4ParticleDefinition* p, 333 const G 332 const G4Material*, G4double) 334 { 333 { 335 return p->GetPDGCharge(); 334 return p->GetPDGCharge(); 336 } 335 } 337 336 338 //....oooOO0OOooo........oooOO0OOooo........oo 337 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 339 338 340 void G4VEmModel::CorrectionsAlongStep(const G4 339 void G4VEmModel::CorrectionsAlongStep(const G4MaterialCutsCouple*, 341 const G4 340 const G4DynamicParticle*, 342 const G4 341 const G4double&,G4double&) 343 {} 342 {} 344 343 345 //....oooOO0OOooo........oooOO0OOooo........oo 344 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 346 345 347 G4double G4VEmModel::Value(const G4MaterialCut 346 G4double G4VEmModel::Value(const G4MaterialCutsCouple* couple, 348 const G4ParticleDef 347 const G4ParticleDefinition* p, G4double e) 349 { 348 { 350 SetCurrentCouple(couple); 349 SetCurrentCouple(couple); 351 return pFactor*e*e*CrossSectionPerVolume(pBa 350 return pFactor*e*e*CrossSectionPerVolume(pBaseMaterial,p,e,0.0,DBL_MAX); 352 } 351 } 353 352 354 //....oooOO0OOooo........oooOO0OOooo........oo 353 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 355 354 356 G4double G4VEmModel::MinPrimaryEnergy(const G4 355 G4double G4VEmModel::MinPrimaryEnergy(const G4Material*, 357 const G4 356 const G4ParticleDefinition*, 358 G4double 357 G4double) 359 { 358 { 360 return 0.0; 359 return 0.0; 361 } 360 } 362 361 363 //....oooOO0OOooo........oooOO0OOooo........oo 362 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 364 363 365 G4double G4VEmModel::MinEnergyCut(const G4Part 364 G4double G4VEmModel::MinEnergyCut(const G4ParticleDefinition*, 366 const G4Mate 365 const G4MaterialCutsCouple*) 367 { 366 { 368 return 0.0; 367 return 0.0; 369 } 368 } 370 369 371 //....oooOO0OOooo........oooOO0OOooo........oo 370 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 372 371 373 G4double G4VEmModel::MaxSecondaryEnergy(const 372 G4double G4VEmModel::MaxSecondaryEnergy(const G4ParticleDefinition*, 374 G4doub 373 G4double kineticEnergy) 375 { 374 { 376 return kineticEnergy; 375 return kineticEnergy; 377 } 376 } 378 377 379 //....oooOO0OOooo........oooOO0OOooo........oo 378 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 380 379 381 void G4VEmModel::SetupForMaterial(const G4Part 380 void G4VEmModel::SetupForMaterial(const G4ParticleDefinition* p, 382 const G4Mate 381 const G4Material* mat, G4double ekin) 383 { 382 { 384 GetChargeSquareRatio(p, mat, ekin); 383 GetChargeSquareRatio(p, mat, ekin); 385 } 384 } 386 385 387 //....oooOO0OOooo........oooOO0OOooo........oo 386 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 388 387 389 void 388 void 390 G4VEmModel::SetParticleChange(G4VParticleChang 389 G4VEmModel::SetParticleChange(G4VParticleChange* p, G4VEmFluctuationModel* f) 391 { 390 { 392 if(p != nullptr && pParticleChange != p) { p 391 if(p != nullptr && pParticleChange != p) { pParticleChange = p; } 393 if(flucModel != f) { flucModel = f; } 392 if(flucModel != f) { flucModel = f; } 394 } 393 } 395 394 396 //....oooOO0OOooo........oooOO0OOooo........oo 395 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 397 396 398 void G4VEmModel::SetCrossSectionTable(G4Physic 397 void G4VEmModel::SetCrossSectionTable(G4PhysicsTable* p, G4bool isLocal) 399 { 398 { 400 xSectionTable = p; << 399 if(p != xSectionTable) { >> 400 if(xSectionTable != nullptr && localTable) { >> 401 xSectionTable->clearAndDestroy(); >> 402 delete xSectionTable; >> 403 } >> 404 xSectionTable = p; >> 405 } 401 localTable = isLocal; 406 localTable = isLocal; 402 } 407 } 403 408 404 //....oooOO0OOooo........oooOO0OOooo........oo 409 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 405 410 406 void G4VEmModel::SetLPMFlag(G4bool) 411 void G4VEmModel::SetLPMFlag(G4bool) 407 { 412 { 408 if (G4EmParameters::Instance()->Verbose() > 413 if (G4EmParameters::Instance()->Verbose() > 0) { 409 G4ExceptionDescription ed; 414 G4ExceptionDescription ed; 410 ed << "The obsolete method SetLPMFlag(..) 415 ed << "The obsolete method SetLPMFlag(..) of the model class " << GetName() 411 << " is called. Please, use G4EmParamet 416 << " is called. Please, use G4EmParameters::Instance()->SetLPM(..)" 412 << " instead"; 417 << " instead"; 413 G4Exception("G4VEmModel::SetLPMFlag", "em0 418 G4Exception("G4VEmModel::SetLPMFlag", "em0001", JustWarning, ed); 414 } 419 } 415 } 420 } 416 << 417 //....oooOO0OOooo........oooOO0OOooo........oo << 418 << 419 void G4VEmModel::SetMasterThread(G4bool) << 420 {} << 421 421 422 //....oooOO0OOooo........oooOO0OOooo........oo 422 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 423 423 424 void G4VEmModel::ModelDescription(std::ostrea 424 void G4VEmModel::ModelDescription(std::ostream& outFile) const 425 { 425 { 426 outFile << "The description for this model h 426 outFile << "The description for this model has not been written yet.\n"; 427 } 427 } 428 428 429 //....oooOO0OOooo........oooOO0OOooo........oo 429 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 430 430