Changeset 1055 for trunk/source/processes/electromagnetic/utils/include
- Timestamp:
- May 28, 2009, 4:26:57 PM (15 years ago)
- Location:
- trunk/source/processes/electromagnetic/utils/include
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/electromagnetic/utils/include/G4DummyModel.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4DummyModel.hh,v 1. 3 2007/05/22 17:31:57 vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4DummyModel.hh,v 1.4 2009/04/07 18:39:47 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 51 51 52 52 #include "globals.hh" 53 #include "G4V EmModel.hh"53 #include "G4VMscModel.hh" 54 54 55 class G4DummyModel : public G4V EmModel55 class G4DummyModel : public G4VMscModel 56 56 { 57 57 -
trunk/source/processes/electromagnetic/utils/include/G4EmElementSelector.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4EmElementSelector.hh,v 1. 2 2008/07/22 15:55:15vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4EmElementSelector.hh,v 1.4 2009/05/10 18:26:43 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 89 89 G4VEmModel* model; 90 90 const G4Material* material; 91 const G4Element* element; 91 92 const G4ElementVector* theElementVector; 92 93 … … 107 108 inline const G4Element* G4EmElementSelector::SelectRandomAtom(G4double e) 108 109 { 109 const G4Element* elm = (*theElementVector)[nElmMinusOne];110 110 if (nElmMinusOne > 0) { 111 111 G4bool b; … … 113 113 for(G4int i=0; i<nElmMinusOne; i++) { 114 114 if (x <= (xSections[i])->GetValue(e,b)) { 115 el m= (*theElementVector)[i];115 element = (*theElementVector)[i]; 116 116 break; 117 117 } 118 118 } 119 119 } 120 return el m;120 return element; 121 121 } 122 122 -
trunk/source/processes/electromagnetic/utils/include/G4EmModelManager.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4EmModelManager.hh,v 1.2 5 2008/10/13 14:56:56vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4EmModelManager.hh,v 1.28 2009/04/09 15:53:17 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 53 53 // 13-05-06 Add GetModel by index method (VI) 54 54 // 15-03-07 Add maxCutInRange (V.Ivanchenko) 55 // 08-04-08 Simplify Select method for only one G4RegionModel (VI) 55 56 // 56 57 // Class Description: … … 91 92 ~G4RegionModels(); 92 93 93 G4int SelectIndex(G4double e) const {94 inline G4int SelectIndex(G4double e) const { 94 95 G4int idx = 0; 95 96 if (nModelsForRegion>1) { … … 100 101 }; 101 102 102 G4int ModelIndex(G4int n) const {103 inline G4int ModelIndex(G4int n) const { 103 104 return theListOfModelIndexes[n]; 104 105 }; 105 106 106 G4int NumberOfModels() const {107 inline G4int NumberOfModels() const { 107 108 return nModelsForRegion; 108 109 }; 109 110 110 G4double LowEdgeEnergy(G4int n) const {111 inline G4double LowEdgeEnergy(G4int n) const { 111 112 return lowKineticEnergy[n]; 112 113 }; 113 114 114 const G4Region* Region() const {115 inline const G4Region* Region() const { 115 116 return theRegion; 116 117 }; … … 150 151 G4int); 151 152 152 const G4DataVector* Cuts() const;153 154 const G4DataVector* SubCutoff() const;155 156 153 void FillDEDXVector(G4PhysicsVector*, const G4MaterialCutsCouple*, 157 154 G4EmTableType t = fRestricted); … … 160 157 G4bool startFromNull = true, G4EmTableType t = fRestricted); 161 158 162 G4VEmModel* SelectModel(G4double& energy, size_t& index);163 164 159 G4VEmModel* GetModel(G4int, G4bool ver = false); 165 166 G4int NumberOfModels() const;167 160 168 161 void AddEmModel(G4int, G4VEmModel*, G4VEmFluctuationModel*, const G4Region*); … … 171 164 172 165 void DumpModelList(G4int verb); 166 167 inline G4VEmModel* SelectModel(G4double& energy, size_t& index); 168 169 inline const G4DataVector* Cuts() const; 170 171 inline const G4DataVector* SubCutoff() const; 172 173 inline G4int NumberOfModels() const; 173 174 174 175 private: … … 190 191 std::vector<const G4Region*> regions; 191 192 std::vector<G4int> orderOfModels; 193 std::vector<G4int> isUsed; 192 194 193 195 G4int nEmModels; … … 209 211 G4int verboseLevel; 210 212 211 // cash 212 G4int currentIdx; 213 213 // may be changed in run time 214 G4RegionModels* currRegionModel; 214 215 }; 215 216 … … 220 221 size_t& index) 221 222 { 222 currentIdx = 223 (setOfRegionModels[idxOfRegionModels[index]])->SelectIndex(kinEnergy); 224 return models[currentIdx]; 223 if(nRegions > 1) currRegionModel = setOfRegionModels[idxOfRegionModels[index]]; 224 return models[currRegionModel->SelectIndex(kinEnergy)]; 225 225 } 226 226 -
trunk/source/processes/electromagnetic/utils/include/G4EmProcessOptions.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4EmProcessOptions.hh,v 1.1 4 2008/04/17 10:33:26vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4EmProcessOptions.hh,v 1.15 2009/02/18 14:40:10 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // … … 107 107 void SetLinearLossLimit(G4double val); 108 108 109 void ActivateDeexcitation(G4bool val, const G4Region* r = 0); 109 void ActivateDeexcitation(const G4String& proc, G4bool val, 110 const G4String& reg = ""); 110 111 111 112 void SetMscStepLimitation(G4MscStepLimitType val); -
trunk/source/processes/electromagnetic/utils/include/G4EnergyLossMessenger.hh
r1007 r1055 25 25 // 26 26 // 27 // $Id: G4EnergyLossMessenger.hh,v 1.2 2 2008/10/20 13:27:45vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 2$27 // $Id: G4EnergyLossMessenger.hh,v 1.23 2009/02/18 14:40:10 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 29 29 // 30 30 // ------------------------------------------------------------------- … … 107 107 G4UIcmdWithADouble* MinSubSecCmd; 108 108 G4UIcommand* StepFuncCmd; 109 G4UIcommand* deexCmd; 109 110 G4UIcmdWithAString* mscCmd; 110 111 G4UIcmdWithADoubleAndUnit* MinEnCmd; -
trunk/source/processes/electromagnetic/utils/include/G4LossTableManager.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4LossTableManager.hh,v 1.5 3 2008/07/15 16:56:38vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4LossTableManager.hh,v 1.54 2009/04/09 16:10:57 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // … … 91 91 class G4EmCorrections; 92 92 class G4EmSaturation; 93 class G4EmConfigurator; 93 94 class G4LossTableBuilder; 94 95 … … 232 233 233 234 G4EmSaturation* EmSaturation(); 235 236 G4EmConfigurator* EmConfigurator(); 234 237 235 238 private: … … 304 307 G4EmCorrections* emCorrections; 305 308 G4EmSaturation* emSaturation; 309 G4EmConfigurator* emConfigurator; 306 310 307 311 const G4ParticleDefinition* firstParticle; -
trunk/source/processes/electromagnetic/utils/include/G4VEmFluctuationModel.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VEmFluctuationModel.hh,v 1.1 1 2008/09/12 14:47:38vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4VEmFluctuationModel.hh,v 1.12 2009/02/19 11:25:50 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 101 101 //------------------------------------------------------------------------ 102 102 103 G4String GetName() const;103 inline G4String GetName() const; 104 104 105 105 private: … … 115 115 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 116 116 117 inline void G4VEmFluctuationModel::InitialiseMe(const G4ParticleDefinition*)118 {}119 120 inline121 void G4VEmFluctuationModel::SetParticleAndCharge(const G4ParticleDefinition*,122 G4double)123 {}124 125 117 inline G4String G4VEmFluctuationModel::GetName() const 126 118 { -
trunk/source/processes/electromagnetic/utils/include/G4VEmModel.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VEmModel.hh,v 1. 59 2008/11/13 19:29:41vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4VEmModel.hh,v 1.69 2009/05/26 15:00:49 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 65 65 // 12-09-08 Added methods GetParticleCharge, GetChargeSquareRatio, 66 66 // CorrectionsAlongStep, ActivateNuclearStopping (VI) 67 // 16-02-09 Moved implementations of virtual methods to source (VI) 68 // 07-04-09 Moved msc methods from G4VEmModel to G4VMscModel (VI) 67 69 // 68 70 // Class Description: … … 92 94 class G4Region; 93 95 class G4VParticleChange; 96 class G4ParticleChangeForLoss; 97 class G4ParticleChangeForGamma; 94 98 class G4Track; 95 99 … … 120 124 //------------------------------------------------------------------------ 121 125 122 // dEdx per unit length123 virtual G4double ComputeDEDX(const G4MaterialCutsCouple*,124 const G4ParticleDefinition*,125 G4double kineticEnergy,126 G4double cutEnergy = DBL_MAX);127 128 126 // main method to compute dEdx 129 127 virtual G4double ComputeDEDXPerVolume(const G4Material*, … … 131 129 G4double kineticEnergy, 132 130 G4double cutEnergy = DBL_MAX); 133 134 // cross section per volume135 virtual G4double CrossSection(const G4MaterialCutsCouple*,136 const G4ParticleDefinition*,137 G4double kineticEnergy,138 G4double cutEnergy = 0.0,139 G4double maxEnergy = DBL_MAX);140 131 141 132 // main method to compute cross section per Volume … … 175 166 G4double length); 176 167 168 // sample PIXE deexcitation 169 virtual void SampleDeexcitationAlongStep(const G4Material*, 170 const G4Track&, 171 G4double& eloss); 172 173 // add region for the model 174 virtual void DefineForRegion(const G4Region*); 175 176 // initilisation at run time for given material 177 virtual void SetupForMaterial(const G4ParticleDefinition*, 178 const G4Material*, 179 G4double kineticEnergy); 180 177 181 protected: 182 183 // initialisation of the ParticleChange for the model 184 G4ParticleChangeForLoss* GetParticleChangeForLoss(); 185 186 // initialisation of the ParticleChange for the model 187 G4ParticleChangeForGamma* GetParticleChangeForGamma(); 178 188 179 189 // kinematically allowed max kinetic energy of a secondary 180 190 virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*, 181 191 G4double kineticEnergy); 182 183 //------------------------------------------------------------------------184 // Methods for msc simulation which needs to be overwritten185 //------------------------------------------------------------------------186 192 187 193 public: 188 189 virtual void SampleScattering(const G4DynamicParticle*,190 G4double safety);191 192 virtual G4double ComputeTruePathLengthLimit(const G4Track& track,193 G4PhysicsTable* theLambdaTable,194 G4double currentMinimalStep);195 196 virtual G4double ComputeGeomPathLength(G4double truePathLength);197 198 virtual G4double ComputeTrueStepLength(G4double geomPathLength);199 200 virtual void DefineForRegion(const G4Region*);201 202 virtual void SetupForMaterial(const G4ParticleDefinition*,203 const G4Material*,204 G4double kineticEnergy);205 194 206 195 //------------------------------------------------------------------------ … … 212 201 const G4DataVector&); 213 202 203 // dEdx per unit length 204 inline G4double ComputeDEDX(const G4MaterialCutsCouple*, 205 const G4ParticleDefinition*, 206 G4double kineticEnergy, 207 G4double cutEnergy = DBL_MAX); 208 209 // cross section per volume 210 inline G4double CrossSection(const G4MaterialCutsCouple*, 211 const G4ParticleDefinition*, 212 G4double kineticEnergy, 213 G4double cutEnergy = 0.0, 214 G4double maxEnergy = DBL_MAX); 215 214 216 // compute mean free path via cross section per volume 215 G4double ComputeMeanFreePath(const G4ParticleDefinition*,216 217 218 219 217 inline G4double ComputeMeanFreePath(const G4ParticleDefinition*, 218 G4double kineticEnergy, 219 const G4Material*, 220 G4double cutEnergy = 0.0, 221 G4double maxEnergy = DBL_MAX); 220 222 221 223 // generic cross section per element … … 233 235 G4double maxEnergy = DBL_MAX); 234 236 235 // this method can be used only in the case if generic method to compute 236 // cross section per volume is used and not overwritten in derived class 237 // to select atom cross section per volume is recomputed for each element 237 238 inline const G4Element* SelectRandomAtom(const G4Material*, 238 239 const G4ParticleDefinition*, … … 260 261 inline G4bool LPMFlag() const; 261 262 263 inline G4bool DeexcitationFlag() const; 264 262 265 inline void SetHighEnergyLimit(G4double); 263 266 … … 270 273 inline void SetLPMFlag(G4bool val); 271 274 275 inline void SetDeexcitationFlag(G4bool val); 276 272 277 inline void ActivateNuclearStopping(G4bool); 273 278 … … 278 283 inline void SetParticleChange(G4VParticleChange*, G4VEmFluctuationModel*); 279 284 285 inline void SetCurrentCouple(const G4MaterialCutsCouple*); 286 280 287 protected: 281 288 289 inline const G4MaterialCutsCouple* CurrentCouple() const; 290 291 inline void SetCurrentElement(const G4Element*); 292 282 293 inline const G4Element* GetCurrentElement() const; 283 284 inline void SetCurrentElement(const G4Element*);285 294 286 295 private: … … 315 324 private: 316 325 317 const G4Element* currentElement; 326 const G4MaterialCutsCouple* currentCouple; 327 const G4Element* currentElement; 328 318 329 G4int nsec; 330 G4bool flagDeexcitation; 319 331 std::vector<G4double> xsec; 320 332 … … 324 336 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 325 337 326 inline G4double G4VEmModel::HighEnergyLimit() const 327 { 328 return highLimit; 329 } 330 331 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 332 333 inline G4double G4VEmModel::LowEnergyLimit() const 334 { 335 return lowLimit; 336 } 337 338 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 339 340 inline G4double G4VEmModel::PolarAngleLimit() const 341 { 342 return polarAngleLimit; 343 } 344 345 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 346 347 inline G4double G4VEmModel::SecondaryThreshold() const 348 { 349 return secondaryThreshold; 350 } 351 352 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 353 354 inline G4bool G4VEmModel::LPMFlag() const 355 { 356 return theLPMflag; 357 } 358 359 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 360 361 inline void G4VEmModel::SetHighEnergyLimit(G4double val) 362 { 363 highLimit = val; 364 } 365 366 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 367 368 inline void G4VEmModel::SetLowEnergyLimit(G4double val) 369 { 370 lowLimit = val; 371 } 372 373 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 374 375 inline void G4VEmModel::SetPolarAngleLimit(G4double val) 376 { 377 polarAngleLimit = val; 378 } 379 380 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 381 382 inline void G4VEmModel::SetSecondaryThreshold(G4double val) 383 { 384 secondaryThreshold = val; 385 } 386 387 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 388 389 inline void G4VEmModel::SetLPMFlag(G4bool val) 390 { 391 theLPMflag = val; 392 } 393 394 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 395 396 inline void G4VEmModel::ActivateNuclearStopping(G4bool val) 397 { 398 nuclearStopping = val; 338 inline G4double G4VEmModel::ComputeDEDX(const G4MaterialCutsCouple* c, 339 const G4ParticleDefinition* p, 340 G4double kinEnergy, 341 G4double cutEnergy) 342 { 343 currentCouple = c; 344 return ComputeDEDXPerVolume(c->GetMaterial(),p,kinEnergy,cutEnergy); 345 } 346 347 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 348 349 inline G4double G4VEmModel::CrossSection(const G4MaterialCutsCouple* c, 350 const G4ParticleDefinition* p, 351 G4double kinEnergy, 352 G4double cutEnergy, 353 G4double maxEnergy) 354 { 355 currentCouple = c; 356 return CrossSectionPerVolume(c->GetMaterial(),p,kinEnergy,cutEnergy,maxEnergy); 357 } 358 359 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 360 361 inline G4double G4VEmModel::ComputeMeanFreePath(const G4ParticleDefinition* p, 362 G4double ekin, 363 const G4Material* material, 364 G4double emin, 365 G4double emax) 366 { 367 G4double mfp = DBL_MAX; 368 G4double cross = CrossSectionPerVolume(material,p,ekin,emin,emax); 369 if (cross > DBL_MIN) mfp = 1./cross; 370 return mfp; 399 371 } 400 372 … … 415 387 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 416 388 417 inline void G4VEmModel::SetParticleChange(G4VParticleChange* p,418 G4VEmFluctuationModel* f = 0)419 {420 if(p && pParticleChange != p) pParticleChange = p;421 fluc = f;422 }423 424 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......425 426 427 inline G4VEmFluctuationModel* G4VEmModel::GetModelOfFluctuations()428 {429 return fluc;430 }431 432 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......433 434 inline G4double G4VEmModel::MinEnergyCut(const G4ParticleDefinition*,435 const G4MaterialCutsCouple*)436 {437 return 0.0;438 }439 440 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......441 442 inline G4double G4VEmModel::GetChargeSquareRatio(const G4ParticleDefinition* p,443 const G4Material*, G4double)444 {445 G4double q = p->GetPDGCharge()/CLHEP::eplus;446 return q*q;447 }448 449 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......450 451 inline G4double G4VEmModel::GetParticleCharge(const G4ParticleDefinition* p,452 const G4Material*, G4double)453 {454 return p->GetPDGCharge();455 }456 457 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......458 459 inline void G4VEmModel::CorrectionsAlongStep(const G4MaterialCutsCouple*,460 const G4DynamicParticle*,461 G4double&,G4double&,G4double)462 {}463 464 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......465 466 inline G4double G4VEmModel::ComputeDEDXPerVolume(const G4Material*,467 const G4ParticleDefinition*,468 G4double,G4double)469 {470 return 0.0;471 }472 473 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......474 475 inline G4double G4VEmModel::ComputeDEDX(const G4MaterialCutsCouple* c,476 const G4ParticleDefinition* p,477 G4double kinEnergy,478 G4double cutEnergy)479 {480 return ComputeDEDXPerVolume(c->GetMaterial(),p,kinEnergy,cutEnergy);481 }482 483 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......484 485 inline G4double G4VEmModel::CrossSection(const G4MaterialCutsCouple* c,486 const G4ParticleDefinition* p,487 G4double kinEnergy,488 G4double cutEnergy,489 G4double maxEnergy)490 {491 return CrossSectionPerVolume(c->GetMaterial(),p,492 kinEnergy,cutEnergy,maxEnergy);493 }494 495 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......496 497 inline G4double G4VEmModel::ComputeCrossSectionPerAtom(498 const G4ParticleDefinition*,499 G4double, G4double, G4double,500 G4double, G4double)501 {502 return 0.0;503 }504 505 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......506 507 389 inline 508 390 const G4Element* G4VEmModel::SelectRandomAtom(const G4MaterialCutsCouple* couple, … … 512 394 G4double maxEnergy) 513 395 { 396 currentCouple = couple; 514 397 if(nSelectors > 0) { 515 398 currentElement = … … 571 454 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 572 455 573 inline const G4Element* G4VEmModel::GetCurrentElement() const 574 { 575 return currentElement; 576 } 577 578 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 579 580 inline void G4VEmModel::SetCurrentElement(const G4Element* elm) 581 { 582 currentElement = elm; 456 inline G4VEmFluctuationModel* G4VEmModel::GetModelOfFluctuations() 457 { 458 return fluc; 459 } 460 461 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 462 463 inline G4double G4VEmModel::HighEnergyLimit() const 464 { 465 return highLimit; 466 } 467 468 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 469 470 inline G4double G4VEmModel::LowEnergyLimit() const 471 { 472 return lowLimit; 473 } 474 475 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 476 477 inline G4double G4VEmModel::PolarAngleLimit() const 478 { 479 return polarAngleLimit; 480 } 481 482 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 483 484 inline G4double G4VEmModel::SecondaryThreshold() const 485 { 486 return secondaryThreshold; 487 } 488 489 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 490 491 inline G4bool G4VEmModel::LPMFlag() const 492 { 493 return theLPMflag; 494 } 495 496 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 497 498 inline G4bool G4VEmModel::DeexcitationFlag() const 499 { 500 return flagDeexcitation; 501 } 502 503 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 504 505 inline void G4VEmModel::SetHighEnergyLimit(G4double val) 506 { 507 highLimit = val; 508 } 509 510 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 511 512 inline void G4VEmModel::SetLowEnergyLimit(G4double val) 513 { 514 lowLimit = val; 515 } 516 517 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 518 519 inline void G4VEmModel::SetPolarAngleLimit(G4double val) 520 { 521 polarAngleLimit = val; 522 } 523 524 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 525 526 inline void G4VEmModel::SetSecondaryThreshold(G4double val) 527 { 528 secondaryThreshold = val; 529 } 530 531 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 532 533 inline void G4VEmModel::SetLPMFlag(G4bool val) 534 { 535 theLPMflag = val; 536 } 537 538 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 539 540 inline void G4VEmModel::SetDeexcitationFlag(G4bool val) 541 { 542 flagDeexcitation = val; 543 } 544 545 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 546 547 inline void G4VEmModel::ActivateNuclearStopping(G4bool val) 548 { 549 nuclearStopping = val; 583 550 } 584 551 … … 594 561 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 595 562 596 inline G4double G4VEmModel::MaxSecondaryEnergy(const G4ParticleDefinition*,597 G4double kineticEnergy)598 {599 return kineticEnergy;600 }601 602 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......603 604 563 inline const G4String& G4VEmModel::GetName() const 605 564 { … … 608 567 609 568 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 610 // Methods for msc simulation 611 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 612 613 inline void G4VEmModel::SampleScattering(const G4DynamicParticle*, G4double) 614 {} 615 616 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 617 618 inline G4double G4VEmModel::ComputeTruePathLengthLimit( 619 const G4Track&, 620 G4PhysicsTable*, 621 G4double) 622 { 623 return DBL_MAX; 624 } 625 626 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 627 628 inline G4double G4VEmModel::ComputeGeomPathLength(G4double truePathLength) 629 { 630 return truePathLength; 631 } 632 633 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 634 635 inline G4double G4VEmModel::ComputeTrueStepLength(G4double geomPathLength) 636 { 637 return geomPathLength; 638 } 639 640 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 641 642 inline void G4VEmModel::DefineForRegion(const G4Region*) 643 {} 644 645 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 646 647 inline void G4VEmModel::SetupForMaterial(const G4ParticleDefinition*, 648 const G4Material*, G4double) 649 {} 569 570 inline void G4VEmModel::SetParticleChange(G4VParticleChange* p, 571 G4VEmFluctuationModel* f = 0) 572 { 573 if(p && pParticleChange != p) pParticleChange = p; 574 fluc = f; 575 } 576 577 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 578 579 inline void G4VEmModel::SetCurrentCouple(const G4MaterialCutsCouple* p) 580 { 581 currentCouple = p; 582 } 583 584 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 585 586 inline const G4MaterialCutsCouple* G4VEmModel::CurrentCouple() const 587 { 588 return currentCouple; 589 } 590 591 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 592 593 inline void G4VEmModel::SetCurrentElement(const G4Element* elm) 594 { 595 currentElement = elm; 596 } 597 598 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 599 600 inline const G4Element* G4VEmModel::GetCurrentElement() const 601 { 602 return currentElement; 603 } 650 604 651 605 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -
trunk/source/processes/electromagnetic/utils/include/G4VEmProcess.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VEmProcess.hh,v 1. 47 2008/07/31 13:01:26vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4VEmProcess.hh,v 1.51 2009/04/07 18:39:47 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 108 108 109 109 //------------------------------------------------------------------------ 110 // Methods with standard implementation; may be overwritten if needed 111 //------------------------------------------------------------------------ 112 113 inline G4double RecalculateLambda(G4double kinEnergy, 114 const G4MaterialCutsCouple* couple); 115 116 //------------------------------------------------------------------------ 117 // Generic methods common to all Discrete processes 110 // Implementation of virtual methods common to all Discrete processes 118 111 //------------------------------------------------------------------------ 119 112 120 113 public: 121 122 void PrintInfoDefinition();123 124 G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);125 114 126 115 // Initialise for build of tables … … 129 118 // Build physics table during initialisation 130 119 void BuildPhysicsTable(const G4ParticleDefinition&); 120 121 void PrintInfoDefinition(); 122 123 // implementation of virtual method, specific for G4VEmProcess 124 G4double PostStepGetPhysicalInteractionLength( 125 const G4Track& track, 126 G4double previousStepSize, 127 G4ForceCondition* condition 128 ); 129 130 // implementation of virtual method, specific for G4VEmProcess 131 G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&); 131 132 132 133 // Store PhysicsTable in a file. … … 145 146 G4bool ascii); 146 147 148 // deexcitation activated per G4Region 149 void ActivateDeexcitation(G4bool, const G4Region* r = 0); 150 147 151 //------------------------------------------------------------------------ 148 152 // Specific methods for Discrete EM post step simulation … … 152 156 G4double CrossSectionPerVolume(G4double kineticEnergy, 153 157 const G4MaterialCutsCouple* couple); 154 155 // implementation of virtual method156 virtual G4double PostStepGetPhysicalInteractionLength(157 const G4Track& track,158 G4double previousStepSize,159 G4ForceCondition* condition160 );161 158 162 159 // It returns the cross section of the process per atom … … 167 164 inline G4double MeanFreePath(const G4Track& track); 168 165 169 inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy,170 size_t& idxRegion) const;171 172 166 // It returns cross section per volume 173 167 inline G4double GetLambda(G4double& kinEnergy, … … 203 197 204 198 //------------------------------------------------------------------------ 205 // Specific methods to set, access, modify models 206 //------------------------------------------------------------------------ 207 208 // Add EM model coupled for the region 209 inline void AddEmModel(G4int, G4VEmModel*, const G4Region* region = 0); 199 // Specific methods to set, access, modify models and basic parameters 200 //------------------------------------------------------------------------ 201 202 protected: 203 // Select model in run time 204 inline void SelectModel(G4double& kinEnergy); 205 206 public: 207 // Select model by energy and region index 208 inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy, 209 size_t& idxRegion) const; 210 210 211 // Add model for region, smaller value of order defines which 212 // model will be selected for a given energy interval 213 void AddEmModel(G4int, G4VEmModel*, const G4Region* region = 0); 214 211 215 // Assign a model to a process 212 inline void SetModel(G4VEmModel*);216 void SetModel(G4VEmModel*, G4int index = 1); 213 217 214 218 // return the assigned model 215 inline G4VEmModel* Model();219 G4VEmModel* Model(G4int index = 1); 216 220 217 221 // Define new energy range for the model identified by the name 218 inlinevoid UpdateEmModel(const G4String&, G4double, G4double);222 void UpdateEmModel(const G4String&, G4double, G4double); 219 223 220 224 // Access to models 221 inline G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false); 222 223 //------------------------------------------------------------------------ 224 // Get/set parameters used for simulation of energy loss 225 //------------------------------------------------------------------------ 226 227 inline void ActivateDeexcitation(G4bool, const G4Region* r = 0); 225 G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false); 228 226 229 227 inline void SetLambdaFactor(G4double val); … … 233 231 234 232 inline void SetApplyCuts(G4bool val); 233 234 //------------------------------------------------------------------------ 235 // Other generic methods 236 //------------------------------------------------------------------------ 235 237 236 238 protected: … … 242 244 G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*); 243 245 246 inline G4double RecalculateLambda(G4double kinEnergy, 247 const G4MaterialCutsCouple* couple); 248 244 249 inline G4ParticleChangeForGamma* GetParticleChange(); 245 250 … … 248 253 inline void SetSecondaryParticle(const G4ParticleDefinition* p); 249 254 250 inline G4VEmModel* SelectModel(G4double& kinEnergy);251 252 255 inline size_t CurrentMaterialCutsCoupleIndex() const; 253 256 … … 280 283 inline G4double ComputeCurrentLambda(G4double kinEnergy); 281 284 282 // hide assignment operator 283 285 // copy constructor and hide assignment operator 284 286 G4VEmProcess(G4VEmProcess &); 285 287 G4VEmProcess & operator=(const G4VEmProcess &right); … … 297 299 // ======== Parameters of the class fixed at initialisation ======= 298 300 301 std::vector<G4VEmModel*> emModels; 302 299 303 // tables and vectors 300 304 G4PhysicsTable* theLambdaTable; … … 317 321 G4bool applyCuts; 318 322 G4bool startFromNull; 319 320 G4int nRegions; 321 std::vector<G4Region*> regions; 322 std::vector<G4bool> flagsDeexcitation; 323 G4bool useDeexcitation; 324 325 G4int nDERegions; 326 std::vector<const G4Region*> deRegions; 327 G4bool* idxDERegions; 323 328 324 329 // ======== Cashed values - may be state dependent ================ … … 332 337 std::vector<G4DynamicParticle*> secParticles; 333 338 334 G4VEmModel* selectedModel;339 G4VEmModel* currentModel; 335 340 336 341 const G4ParticleDefinition* particle; … … 348 353 349 354 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 355 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 356 357 inline G4double G4VEmProcess::ComputeCrossSectionPerAtom( 358 G4double kineticEnergy, G4double Z, G4double A, G4double cut) 359 { 360 SelectModel(kineticEnergy); 361 G4double x = 0.0; 362 if(currentModel) { 363 x = currentModel->ComputeCrossSectionPerAtom(particle,kineticEnergy, 364 Z,A,cut); 365 } 366 return x; 367 } 368 369 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 370 371 inline G4double G4VEmProcess::MeanFreePath(const G4Track& track) 372 { 373 DefineMaterial(track.GetMaterialCutsCouple()); 374 preStepLambda = GetCurrentLambda(track.GetKineticEnergy()); 375 G4double x = DBL_MAX; 376 if(DBL_MIN < preStepLambda) x = 1.0/preStepLambda; 377 return x; 378 } 379 380 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 381 382 inline G4double G4VEmProcess::GetLambda(G4double& kineticEnergy, 383 const G4MaterialCutsCouple* couple) 384 { 385 DefineMaterial(couple); 386 return GetCurrentLambda(kineticEnergy); 387 } 388 389 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 390 391 inline void G4VEmProcess::SetLambdaBinning(G4int nbins) 392 { 393 nLambdaBins = nbins; 394 } 395 396 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 397 398 inline G4int G4VEmProcess::LambdaBinning() const 399 { 400 return nLambdaBins; 401 } 402 403 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 404 405 inline void G4VEmProcess::SetMinKinEnergy(G4double e) 406 { 407 minKinEnergy = e; 408 } 409 410 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 411 412 inline G4double G4VEmProcess::MinKinEnergy() const 413 { 414 return minKinEnergy; 415 } 416 417 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 418 419 inline void G4VEmProcess::SetMaxKinEnergy(G4double e) 420 { 421 maxKinEnergy = e; 422 } 423 424 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 425 426 inline G4double G4VEmProcess::MaxKinEnergy() const 427 { 428 return maxKinEnergy; 429 } 430 431 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 432 433 inline void G4VEmProcess::SetPolarAngleLimit(G4double val) 434 { 435 if(val < 0.0) polarAngleLimit = 0.0; 436 else if(val > pi) polarAngleLimit = pi; 437 else polarAngleLimit = val; 438 } 439 440 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 441 442 inline G4double G4VEmProcess::PolarAngleLimit() const 443 { 444 return polarAngleLimit; 445 } 446 447 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 448 449 inline const G4PhysicsTable* G4VEmProcess::LambdaTable() const 450 { 451 return theLambdaTable; 452 } 453 454 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 455 456 inline const G4ParticleDefinition* G4VEmProcess::Particle() const 457 { 458 return particle; 459 } 460 461 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 462 463 inline const G4ParticleDefinition* G4VEmProcess::SecondaryParticle() const 464 { 465 return secondaryParticle; 466 } 467 468 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 469 470 inline void G4VEmProcess::SelectModel(G4double& kinEnergy) 471 { 472 currentModel = modelManager->SelectModel(kinEnergy, currentMaterialIndex); 473 currentModel->SetCurrentCouple(currentCouple); 474 } 475 476 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 477 478 inline G4VEmModel* G4VEmProcess::SelectModelForMaterial( 479 G4double kinEnergy, size_t& idxRegion) const 480 { 481 return modelManager->SelectModel(kinEnergy, idxRegion); 482 } 483 484 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 485 486 inline void G4VEmProcess::SetLambdaFactor(G4double val) 487 { 488 if(val > 0.0 && val <= 1.0) lambdaFactor = val; 489 } 490 491 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 492 493 inline void G4VEmProcess::SetIntegral(G4bool val) 494 { 495 if(particle && particle != theGamma) integral = val; 496 if(integral) buildLambdaTable = true; 497 } 498 499 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 500 501 inline G4bool G4VEmProcess::IsIntegral() const 502 { 503 return integral; 504 } 505 506 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 507 508 inline void G4VEmProcess::SetApplyCuts(G4bool val) 509 { 510 applyCuts = val; 511 } 512 513 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 514 515 inline G4double G4VEmProcess::RecalculateLambda(G4double e, 516 const G4MaterialCutsCouple* couple) 517 { 518 DefineMaterial(couple); 519 return ComputeCurrentLambda(e); 520 } 521 522 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 523 524 inline G4ParticleChangeForGamma* G4VEmProcess::GetParticleChange() 525 { 526 return &fParticleChange; 527 } 528 529 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 530 531 inline void G4VEmProcess::SetParticle(const G4ParticleDefinition* p) 532 { 533 particle = p; 534 } 535 536 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 537 538 inline void G4VEmProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 539 { 540 secondaryParticle = p; 541 } 542 543 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 544 545 inline size_t G4VEmProcess::CurrentMaterialCutsCoupleIndex() const 546 { 547 return currentMaterialIndex; 548 } 549 550 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 551 552 inline G4double G4VEmProcess::GetGammaEnergyCut() 553 { 554 return (*theCutsGamma)[currentMaterialIndex]; 555 } 556 557 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 558 559 inline G4double G4VEmProcess::GetElectronEnergyCut() 560 { 561 return (*theCutsElectron)[currentMaterialIndex]; 562 } 563 564 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 565 566 inline void G4VEmProcess::SetBuildTableFlag(G4bool val) 567 { 568 buildLambdaTable = val; 569 if(!val) integral = false; 570 } 571 572 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 573 574 inline void G4VEmProcess::SetStartFromNullFlag(G4bool val) 575 { 576 startFromNull = val; 577 } 578 579 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 580 581 inline void G4VEmProcess::InitialiseStep(const G4Track& track) 582 { 583 preStepKinEnergy = track.GetKineticEnergy(); 584 DefineMaterial(track.GetMaterialCutsCouple()); 585 if (theNumberOfInteractionLengthLeft < 0.0) mfpKinEnergy = DBL_MAX; 586 } 587 350 588 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 351 589 … … 358 596 mfpKinEnergy = DBL_MAX; 359 597 } 360 }361 362 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....363 364 inline void G4VEmProcess::InitialiseStep(const G4Track& track)365 {366 preStepKinEnergy = track.GetKineticEnergy();367 DefineMaterial(track.GetMaterialCutsCouple());368 if (theNumberOfInteractionLengthLeft < 0.0) mfpKinEnergy = DBL_MAX;369 }370 371 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....372 373 inline G4double G4VEmProcess::GetLambda(G4double& kineticEnergy,374 const G4MaterialCutsCouple* couple)375 {376 DefineMaterial(couple);377 return GetCurrentLambda(kineticEnergy);378 }379 380 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....381 382 inline G4double G4VEmProcess::GetCurrentLambda(G4double e)383 {384 G4double x = 0.0;385 if(theLambdaTable) x = GetLambdaFromTable(e);386 else x = ComputeCurrentLambda(e);387 return x;388 }389 390 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....391 392 inline G4double G4VEmProcess::RecalculateLambda(G4double e,393 const G4MaterialCutsCouple* couple)394 {395 DefineMaterial(couple);396 return ComputeCurrentLambda(e);397 }398 399 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....400 401 inline G4double G4VEmProcess::ComputeCurrentLambda(G4double e)402 {403 G4VEmModel* currentModel = SelectModel(e);404 G4double x = 0.0;405 if(currentModel)406 x = currentModel->CrossSectionPerVolume(currentMaterial,particle,407 e,(*theCuts)[currentMaterialIndex]);408 return x;409 }410 411 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....412 413 inline G4double G4VEmProcess::GetLambdaFromTable(G4double e)414 {415 G4bool b;416 return (((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b));417 598 } 418 599 … … 442 623 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 443 624 444 inline G4double G4VEmProcess::MeanFreePath(const G4Track& track) 445 { 446 DefineMaterial(track.GetMaterialCutsCouple()); 447 preStepLambda = GetCurrentLambda(track.GetKineticEnergy()); 448 G4double x = DBL_MAX; 449 if(DBL_MIN < preStepLambda) x = 1.0/preStepLambda; 625 inline G4double G4VEmProcess::GetLambdaFromTable(G4double e) 626 { 627 G4bool b; 628 return (((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b)); 629 } 630 631 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 632 633 inline G4double G4VEmProcess::GetCurrentLambda(G4double e) 634 { 635 G4double x = 0.0; 636 if(theLambdaTable) x = GetLambdaFromTable(e); 637 else x = ComputeCurrentLambda(e); 450 638 return x; 451 639 } … … 453 641 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 454 642 455 inline G4VEmModel* G4VEmProcess::SelectModel(G4double& kinEnergy) 456 { 457 return modelManager->SelectModel(kinEnergy, currentMaterialIndex); 458 } 459 460 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 461 462 inline G4VEmModel* G4VEmProcess::SelectModelForMaterial( 463 G4double kinEnergy, size_t& idxRegion) const 464 { 465 return modelManager->SelectModel(kinEnergy, idxRegion); 466 } 467 468 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 469 470 inline const G4ParticleDefinition* G4VEmProcess::Particle() const 471 { 472 return particle; 473 } 474 475 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 476 477 inline const G4ParticleDefinition* G4VEmProcess::SecondaryParticle() const 478 { 479 return secondaryParticle; 480 } 481 482 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 483 484 inline G4double G4VEmProcess::GetGammaEnergyCut() 485 { 486 return (*theCutsGamma)[currentMaterialIndex]; 487 } 488 489 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 490 491 inline G4double G4VEmProcess::GetElectronEnergyCut() 492 { 493 return (*theCutsElectron)[currentMaterialIndex]; 494 } 495 496 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 497 498 inline void G4VEmProcess::SetLambdaFactor(G4double val) 499 { 500 if(val > 0.0 && val <= 1.0) lambdaFactor = val; 501 } 502 503 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 504 505 inline G4VEmModel* G4VEmProcess::GetModelByIndex(G4int idx, G4bool ver) 506 { 507 return modelManager->GetModel(idx, ver); 508 } 509 510 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 511 512 inline G4ParticleChangeForGamma* G4VEmProcess::GetParticleChange() 513 { 514 return &fParticleChange; 515 } 516 517 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 518 519 inline void G4VEmProcess::SetParticle(const G4ParticleDefinition* p) 520 { 521 particle = p; 522 } 523 524 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 525 526 inline void G4VEmProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 527 { 528 secondaryParticle = p; 529 } 530 531 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 532 533 inline void G4VEmProcess::AddEmModel(G4int order, G4VEmModel* p, 534 const G4Region* region) 535 { 536 G4VEmFluctuationModel* fm = 0; 537 modelManager->AddEmModel(order, p, fm, region); 538 if(p) p->SetParticleChange(pParticleChange); 539 } 540 541 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 542 543 inline void G4VEmProcess::SetModel(G4VEmModel* model) 544 { 545 selectedModel = model; 546 } 547 548 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 549 550 inline G4VEmModel* G4VEmProcess::Model() 551 { 552 return selectedModel; 553 } 554 555 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 556 557 inline void G4VEmProcess::UpdateEmModel(const G4String& nam, 558 G4double emin, G4double emax) 559 { 560 modelManager->UpdateEmModel(nam, emin, emax); 561 } 562 563 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 564 565 inline G4double G4VEmProcess::ComputeCrossSectionPerAtom( 566 G4double kineticEnergy, G4double Z, G4double A, G4double cut) 567 { 568 G4VEmModel* model = SelectModel(kineticEnergy); 569 return model->ComputeCrossSectionPerAtom(particle,kineticEnergy,Z,A,cut); 570 } 571 572 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 573 574 inline void G4VEmProcess::SetLambdaBinning(G4int nbins) 575 { 576 nLambdaBins = nbins; 577 } 578 579 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 580 581 inline G4int G4VEmProcess::LambdaBinning() const 582 { 583 return nLambdaBins; 584 } 585 586 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 587 588 inline void G4VEmProcess::SetMinKinEnergy(G4double e) 589 { 590 minKinEnergy = e; 591 } 592 593 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 594 595 inline G4double G4VEmProcess::MinKinEnergy() const 596 { 597 return minKinEnergy; 598 } 599 600 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 601 602 inline void G4VEmProcess::SetMaxKinEnergy(G4double e) 603 { 604 maxKinEnergy = e; 605 } 606 607 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 608 609 inline G4double G4VEmProcess::MaxKinEnergy() const 610 { 611 return maxKinEnergy; 612 } 613 614 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 615 616 inline void G4VEmProcess::SetPolarAngleLimit(G4double val) 617 { 618 if(val < 0.0) polarAngleLimit = 0.0; 619 else if(val > pi) polarAngleLimit = pi; 620 else polarAngleLimit = val; 621 } 622 623 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 624 625 inline G4double G4VEmProcess::PolarAngleLimit() const 626 { 627 return polarAngleLimit; 628 } 629 630 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 631 632 inline void G4VEmProcess::ActivateDeexcitation(G4bool, const G4Region*) 633 {} 634 635 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 636 637 inline const G4PhysicsTable* G4VEmProcess::LambdaTable() const 638 { 639 return theLambdaTable; 640 } 641 642 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 643 644 inline void G4VEmProcess::SetIntegral(G4bool val) 645 { 646 if(particle && particle != theGamma) integral = val; 647 if(integral) buildLambdaTable = true; 648 } 649 650 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 651 652 inline G4bool G4VEmProcess::IsIntegral() const 653 { 654 return integral; 655 } 656 657 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 658 659 inline void G4VEmProcess::SetBuildTableFlag(G4bool val) 660 { 661 buildLambdaTable = val; 662 if(!val) integral = false; 663 } 664 665 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 666 667 inline void G4VEmProcess::SetStartFromNullFlag(G4bool val) 668 { 669 startFromNull = val; 670 } 671 672 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 673 674 inline void G4VEmProcess::SetApplyCuts(G4bool val) 675 { 676 applyCuts = val; 677 } 678 679 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 680 681 inline size_t G4VEmProcess::CurrentMaterialCutsCoupleIndex() const 682 { 683 return currentMaterialIndex; 643 inline G4double G4VEmProcess::ComputeCurrentLambda(G4double e) 644 { 645 SelectModel(e); 646 G4double x = 0.0; 647 if(currentModel) { 648 x = currentModel->CrossSectionPerVolume(currentMaterial,particle, 649 e,(*theCuts)[currentMaterialIndex]); 650 } 651 return x; 684 652 } 685 653 -
trunk/source/processes/electromagnetic/utils/include/G4VEnergyLossProcess.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VEnergyLossProcess.hh,v 1.8 3 2008/09/12 16:19:01vnivanch Exp $26 // $Id: G4VEnergyLossProcess.hh,v 1.87 2009/04/07 18:39:47 vnivanch Exp $ 27 27 // GEANT4 tag $Name: 28 28 // … … 126 126 virtual ~G4VEnergyLossProcess(); 127 127 128 private: 129 // clean vectors and arrays 130 void Clean(); 131 128 132 //------------------------------------------------------------------------ 129 133 // Virtual methods to be implemented in concrete processes 130 134 //------------------------------------------------------------------------ 131 135 136 public: 132 137 virtual G4bool IsApplicable(const G4ParticleDefinition& p) = 0; 133 138 … … 143 148 //------------------------------------------------------------------------ 144 149 145 protected:146 147 150 virtual G4double MinPrimaryEnergy(const G4ParticleDefinition*, 148 151 const G4Material*, G4double cut); 149 152 150 153 //------------------------------------------------------------------------ 151 // Virtual methods common to all EM ContinuousDiscrete processes152 // Further inheritance is not assumed154 // Virtual methods implementation common to all EM ContinuousDiscrete 155 // processes. Further inheritance is not assumed 153 156 //------------------------------------------------------------------------ 154 157 155 158 public: 156 159 160 // prepare all tables 161 void PreparePhysicsTable(const G4ParticleDefinition&); 162 163 // build all tables 164 void BuildPhysicsTable(const G4ParticleDefinition&); 165 166 // build a table 167 G4PhysicsTable* BuildDEDXTable(G4EmTableType tType = fRestricted); 168 169 // build a table 170 G4PhysicsTable* BuildLambdaTable(G4EmTableType tType = fRestricted); 171 172 // summary printout after initialisation 157 173 void PrintInfoDefinition(); 158 174 159 void PreparePhysicsTable(const G4ParticleDefinition&); 160 161 void BuildPhysicsTable(const G4ParticleDefinition&); 162 175 // Add subcutoff option for the region 176 void ActivateSubCutoff(G4bool val, const G4Region* region = 0); 177 178 // Activate deexcitation code for region 179 void ActivateDeexcitation(G4bool, const G4Region* region = 0); 180 181 // Step limit from AlongStep 163 182 G4double AlongStepGetPhysicalInteractionLength(const G4Track&, 164 183 G4double previousStepSize, … … 167 186 G4GPILSelection* selection); 168 187 188 // Step limit from cross section 169 189 G4double PostStepGetPhysicalInteractionLength(const G4Track& track, 170 190 G4double previousStepSize, 171 191 G4ForceCondition* condition); 172 192 193 // AlongStep computations 173 194 G4VParticleChange* AlongStepDoIt(const G4Track&, const G4Step&); 174 195 196 // Sampling of secondaries in vicinity of geometrical boundary 197 void SampleSubCutSecondaries(std::vector<G4Track*>&, const G4Step&, 198 G4VEmModel* model, G4int matIdx, 199 G4double& extraEdep); 200 201 // PostStep sampling of secondaries 175 202 G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&); 176 203 177 // Store PhysicsTable in a file.178 // Return false in case of failure at I/O204 // Store all PhysicsTable in files. 205 // Return false in case of any fatal failure at I/O 179 206 G4bool StorePhysicsTable(const G4ParticleDefinition*, 180 207 const G4String& directory, 181 208 G4bool ascii = false); 182 209 183 // Retrieve Physics from a file. 184 // (return true if the Physics Table can be build by using file) 185 // (return false if the process has no functionality or in case of failure) 186 // File name should is constructed as processName+particleName and the 187 // should be placed under the directory specifed by the argument. 210 // Retrieve all Physics from a files. 211 // Return true if all the Physics Table are built. 212 // Return false if any fatal failure. 188 213 G4bool RetrievePhysicsTable(const G4ParticleDefinition*, 189 214 const G4String& directory, 190 215 G4bool ascii); 191 216 217 private: 218 // store a table 219 G4bool StoreTable(const G4ParticleDefinition* p, 220 G4PhysicsTable*, G4bool ascii, 221 const G4String& directory, 222 const G4String& tname); 223 224 // retrieve a table 225 G4bool RetrieveTable(const G4ParticleDefinition* p, 226 G4PhysicsTable*, G4bool ascii, 227 const G4String& directory, 228 const G4String& tname, 229 G4bool mandatory); 230 231 //------------------------------------------------------------------------ 232 // Public interface to cross section, mfp and sampling of fluctuations 233 // These methods are not used in run time 234 //------------------------------------------------------------------------ 235 236 public: 237 // access to dispersion of restricted energy loss 238 G4double GetDEDXDispersion(const G4MaterialCutsCouple *couple, 239 const G4DynamicParticle* dp, 240 G4double length); 241 242 // Access to cross section table 243 G4double CrossSectionPerVolume(G4double kineticEnergy, 244 const G4MaterialCutsCouple* couple); 245 246 // access to cross section 247 G4double MeanFreePath(const G4Track& track); 248 249 // access to step limit 250 G4double ContinuousStepLimit(const G4Track& track, 251 G4double previousStepSize, 252 G4double currentMinimumStep, 253 G4double& currentSafety); 254 192 255 protected: 193 256 257 // implementation of the pure virtual method 194 258 G4double GetMeanFreePath(const G4Track& track, 195 259 G4double previousStepSize, 196 260 G4ForceCondition* condition); 197 261 262 // implementation of the pure virtual method 198 263 G4double GetContinuousStepLimit(const G4Track& track, 199 264 G4double previousStepSize, … … 202 267 203 268 //------------------------------------------------------------------------ 204 // Specific methods for along/post step EM processes 205 //------------------------------------------------------------------------ 269 // Run time method which may be also used by derived processes 270 //------------------------------------------------------------------------ 271 272 // creeation of an empty vector for cross section 273 G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*, 274 G4double cut); 275 276 inline size_t CurrentMaterialCutsCoupleIndex() const; 277 278 inline G4double GetCurrentRange() const; 279 280 //------------------------------------------------------------------------ 281 // Specific methods to set, access, modify models 282 //------------------------------------------------------------------------ 283 284 // Select model in run time 285 inline void SelectModel(G4double kinEnergy); 206 286 207 287 public: 208 288 // Select model by energy and region index 289 inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy, 290 size_t& idx) const; 291 292 // Add EM model coupled with fluctuation model for region, smaller value 293 // of order defines which pair of models will be selected for a given 294 // energy interval 295 void AddEmModel(G4int, G4VEmModel*, 296 G4VEmFluctuationModel* fluc = 0, 297 const G4Region* region = 0); 298 299 // Define new energy range for the model identified by the name 300 void UpdateEmModel(const G4String&, G4double, G4double); 301 302 // Assign a model to a process 303 void SetEmModel(G4VEmModel*, G4int index=1); 304 305 // return the assigned model 306 G4VEmModel* EmModel(G4int index=1); 307 308 // Access to models 309 G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false); 310 311 G4int NumberOfModels(); 312 313 // Assign a fluctuation model to a process 314 void SetFluctModel(G4VEmFluctuationModel*); 315 316 // return the assigned fluctuation model 317 inline G4VEmFluctuationModel* FluctModel(); 318 319 //------------------------------------------------------------------------ 320 // Define and access particle type 321 //------------------------------------------------------------------------ 322 323 protected: 324 inline void SetParticle(const G4ParticleDefinition* p); 325 inline void SetSecondaryParticle(const G4ParticleDefinition* p); 326 327 public: 328 inline void SetBaseParticle(const G4ParticleDefinition* p); 329 inline const G4ParticleDefinition* Particle() const; 330 inline const G4ParticleDefinition* BaseParticle() const; 331 inline const G4ParticleDefinition* SecondaryParticle() const; 332 333 //------------------------------------------------------------------------ 334 // Get/set parameters to configure the process at initialisation time 335 //------------------------------------------------------------------------ 336 337 // Add subcutoff process (bremsstrahlung) to sample secondary 338 // particle production in vicinity of the geometry boundary 209 339 void AddCollaborativeProcess(G4VEnergyLossProcess*); 210 340 211 void SampleSubCutSecondaries(std::vector<G4Track*>&, const G4Step&, 212 G4VEmModel* model, G4int matIdx, 213 G4double& extraEdep); 214 215 G4double GetDEDXDispersion(const G4MaterialCutsCouple *couple, 216 const G4DynamicParticle* dp, 217 G4double length); 218 219 //------------------------------------------------------------------------ 220 // Specific methods to build and access Physics Tables 221 //------------------------------------------------------------------------ 222 223 G4PhysicsTable* BuildDEDXTable(G4EmTableType tType = fRestricted); 224 225 G4PhysicsTable* BuildLambdaTable(G4EmTableType tType = fRestricted); 341 inline void SetLossFluctuations(G4bool val); 342 inline void SetRandomStep(G4bool val); 343 344 inline void SetIntegral(G4bool val); 345 inline G4bool IsIntegral() const; 346 347 // Set/Get flag "isIonisation" 348 inline void SetIonisation(G4bool val); 349 inline G4bool IsIonisationProcess() const; 350 351 // Redefine parameteters for stepping control 352 // 353 inline void SetLinearLossLimit(G4double val); 354 inline void SetMinSubRange(G4double val); 355 inline void SetLambdaFactor(G4double val); 356 inline void SetStepFunction(G4double v1, G4double v2); 357 358 inline G4int NumberOfSubCutoffRegions() const; 359 inline G4int NumberOfDERegions() const; 360 361 //------------------------------------------------------------------------ 362 // Specific methods to path Physics Tables to the process 363 //------------------------------------------------------------------------ 226 364 227 365 void SetDEDXTable(G4PhysicsTable* p, G4EmTableType tType); 228 366 void SetCSDARangeTable(G4PhysicsTable* pRange); 229 367 void SetRangeTableForLoss(G4PhysicsTable* p); 368 void SetSecondaryRangeTable(G4PhysicsTable* p); 230 369 void SetInverseRangeTable(G4PhysicsTable* p); 231 void SetSecondaryRangeTable(G4PhysicsTable* p);232 370 233 371 void SetLambdaTable(G4PhysicsTable* p); … … 251 389 // Max kinetic energy for tables 252 390 inline void SetMaxKinEnergyForCSDARange(G4double e); 391 392 // Return values for given G4MaterialCutsCouple 393 inline G4double GetDEDX(G4double& kineticEnergy, const G4MaterialCutsCouple*); 394 inline G4double GetDEDXForSubsec(G4double& kineticEnergy, 395 const G4MaterialCutsCouple*); 396 inline G4double GetRange(G4double& kineticEnergy, const G4MaterialCutsCouple*); 397 inline G4double GetCSDARange(G4double& kineticEnergy, const G4MaterialCutsCouple*); 398 inline G4double GetRangeForLoss(G4double& kineticEnergy, const G4MaterialCutsCouple*); 399 inline G4double GetKineticEnergy(G4double& range, const G4MaterialCutsCouple*); 400 inline G4double GetLambda(G4double& kineticEnergy, const G4MaterialCutsCouple*); 401 402 inline G4bool TablesAreBuilt() const; 253 403 254 404 // Access to specific tables … … 264 414 inline G4PhysicsTable* SubLambdaTable(); 265 415 266 // Return values for given G4MaterialCutsCouple267 inline G4double GetDEDX(G4double& kineticEnergy, const G4MaterialCutsCouple*);268 inline G4double GetDEDXForSubsec(G4double& kineticEnergy,269 const G4MaterialCutsCouple*);270 inline G4double GetRange(G4double& kineticEnergy, const G4MaterialCutsCouple*);271 inline G4double GetCSDARange(G4double& kineticEnergy, const G4MaterialCutsCouple*);272 inline G4double GetRangeForLoss(G4double& kineticEnergy, const G4MaterialCutsCouple*);273 inline G4double GetKineticEnergy(G4double& range, const G4MaterialCutsCouple*);274 inline G4double GetLambda(G4double& kineticEnergy, const G4MaterialCutsCouple*);275 276 inline G4bool TablesAreBuilt() const;277 278 //------------------------------------------------------------------------279 // Define and access particle type280 //------------------------------------------------------------------------281 282 inline void SetBaseParticle(const G4ParticleDefinition* p);283 inline const G4ParticleDefinition* Particle() const;284 inline const G4ParticleDefinition* BaseParticle() const;285 inline const G4ParticleDefinition* SecondaryParticle() const;286 287 //------------------------------------------------------------------------288 // Specific methods to set, access, modify models289 //------------------------------------------------------------------------290 291 // Add EM model coupled with fluctuation model for the region292 inline void AddEmModel(G4int, G4VEmModel*,293 G4VEmFluctuationModel* fluc = 0,294 const G4Region* region = 0);295 296 // Assign a model to a process297 inline void SetEmModel(G4VEmModel*, G4int index=1);298 299 // return the assigned model300 inline G4VEmModel* EmModel(G4int index=1);301 302 // Assign a fluctuation model to a process303 inline void SetFluctModel(G4VEmFluctuationModel*);304 305 // return the assigned fluctuation model306 inline G4VEmFluctuationModel* FluctModel();307 308 // Define new energy range for the model identified by the name309 inline void UpdateEmModel(const G4String&, G4double, G4double);310 311 // Access to models312 inline G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false);313 314 inline G4int NumberOfModels();315 316 //------------------------------------------------------------------------317 // Get/set parameters used for simulation of energy loss318 //------------------------------------------------------------------------319 320 inline void SetLossFluctuations(G4bool val);321 inline void SetRandomStep(G4bool val);322 inline void SetIntegral(G4bool val);323 inline G4bool IsIntegral() const;324 325 // Set/Get flag "isIonisation"326 inline void SetIonisation(G4bool val);327 inline G4bool IsIonisationProcess() const;328 329 // Redefine parameteters for stepping control330 //331 inline void SetLinearLossLimit(G4double val);332 inline void SetMinSubRange(G4double val);333 inline void SetStepFunction(G4double v1, G4double v2);334 inline void SetLambdaFactor(G4double val);335 336 337 // Add subcutoff option for the region338 void ActivateSubCutoff(G4bool val, const G4Region* region = 0);339 340 inline G4int NumberOfSubCutoffRegions() const;341 342 // Activate deexcitation code343 virtual void ActivateDeexcitation(G4bool, const G4Region* region = 0);344 345 //------------------------------------------------------------------------346 // Public interface to helper functions347 //------------------------------------------------------------------------348 349 inline350 G4VEmModel* SelectModelForMaterial(G4double kinEnergy, size_t& idx) const;351 352 inline G4double MeanFreePath(const G4Track& track);353 354 inline G4double ContinuousStepLimit(const G4Track& track,355 G4double previousStepSize,356 G4double currentMinimumStep,357 G4double& currentSafety);358 359 416 //------------------------------------------------------------------------ 360 417 // Run time method for simulation of ionisation … … 367 424 inline void SetDynamicMassCharge(G4double massratio, G4double charge2ratio); 368 425 369 // Access to cross section table370 G4double CrossSectionPerVolume(G4double kineticEnergy,371 const G4MaterialCutsCouple* couple);372 373 protected:374 375 G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*,376 G4double cut);377 378 inline G4ParticleChangeForLoss* GetParticleChange();379 380 inline void SetParticle(const G4ParticleDefinition* p);381 382 inline void SetSecondaryParticle(const G4ParticleDefinition* p);383 384 inline void SelectModel(G4double kinEnergy);385 386 inline size_t CurrentMaterialCutsCoupleIndex() const;387 388 inline G4double GetCurrentRange() const;389 390 426 private: 391 392 //------------------------------------------------------------------------393 // Management of tables394 //------------------------------------------------------------------------395 396 void Clear();397 398 G4bool StoreTable(const G4ParticleDefinition* p,399 G4PhysicsTable*, G4bool ascii,400 const G4String& directory,401 const G4String& tname);402 403 G4bool RetrieveTable(const G4ParticleDefinition* p,404 G4PhysicsTable*, G4bool ascii,405 const G4String& directory,406 const G4String& tname,407 G4bool mandatory);408 427 409 428 // define material and indexes 410 429 inline void DefineMaterial(const G4MaterialCutsCouple* couple); 411 430 412 // Returnd values for scaled energy using mass of the base particle 413 // 431 //------------------------------------------------------------------------ 432 // Compute values using scaling relation, mass and charge of based particle 433 //------------------------------------------------------------------------ 434 414 435 inline G4double GetDEDXForScaledEnergy(G4double scaledKinEnergy); 415 436 inline G4double GetSubDEDXForScaledEnergy(G4double scaledKinEnergy); … … 418 439 inline G4double GetScaledRangeForScaledEnergy(G4double scaledKinEnergy); 419 440 inline G4double GetLimitScaledRangeForScaledEnergy(G4double scaledKinEnergy); 441 inline G4double ScaledKinEnergyForLoss(G4double range); 420 442 inline G4double GetLambdaForScaledEnergy(G4double scaledKinEnergy); 421 inline G4double ScaledKinEnergyForLoss(G4double range);422 443 inline void ComputeLambdaForScaledEnergy(G4double scaledKinEnergy); 423 444 424 445 // hide assignment operator 425 426 446 G4VEnergyLossProcess(G4VEnergyLossProcess &); 427 447 G4VEnergyLossProcess & operator=(const G4VEnergyLossProcess &right); … … 444 464 G4VEmFluctuationModel* fluctModel; 445 465 std::vector<const G4Region*> scoffRegions; 466 std::vector<const G4Region*> deRegions; 446 467 G4int nSCoffRegions; 447 G4int* idxSCoffRegions; 468 G4int nDERegions; 469 G4bool* idxSCoffRegions; 470 G4bool* idxDERegions; 448 471 449 472 std::vector<G4VEnergyLossProcess*> scProcesses; … … 493 516 G4bool isIonisation; 494 517 G4bool useSubCutoff; 518 G4bool useDeexcitation; 495 519 496 520 protected: … … 531 555 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 532 556 533 inline void G4VEnergyLossProcess::DefineMaterial( 534 const G4MaterialCutsCouple* couple) 535 { 536 if(couple != currentCouple) { 537 currentCouple = couple; 538 currentMaterial = couple->GetMaterial(); 539 currentMaterialIndex = couple->GetIndex(); 540 mfpKinEnergy = DBL_MAX; 541 } 557 inline size_t G4VEnergyLossProcess::CurrentMaterialCutsCoupleIndex() const 558 { 559 return currentMaterialIndex; 560 } 561 562 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 563 564 inline G4double G4VEnergyLossProcess::GetCurrentRange() const 565 { 566 return fRange; 567 } 568 569 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 570 571 inline void G4VEnergyLossProcess::SelectModel(G4double kinEnergy) 572 { 573 currentModel = modelManager->SelectModel(kinEnergy, currentMaterialIndex); 574 currentModel->SetCurrentCouple(currentCouple); 575 } 576 577 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 578 579 inline G4VEmModel* G4VEnergyLossProcess::SelectModelForMaterial( 580 G4double kinEnergy, size_t& idx) const 581 { 582 return modelManager->SelectModel(kinEnergy, idx); 583 } 584 585 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 586 587 inline void G4VEnergyLossProcess::SetFluctModel(G4VEmFluctuationModel* p) 588 { 589 fluctModel = p; 590 } 591 592 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 593 594 inline G4VEmFluctuationModel* G4VEnergyLossProcess::FluctModel() 595 { 596 return fluctModel; 597 } 598 599 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 600 601 inline void G4VEnergyLossProcess::SetParticle(const G4ParticleDefinition* p) 602 { 603 particle = p; 604 } 605 606 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 607 608 inline void G4VEnergyLossProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 609 { 610 secondaryParticle = p; 611 } 612 613 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 614 615 inline void G4VEnergyLossProcess::SetBaseParticle(const G4ParticleDefinition* p) 616 { 617 baseParticle = p; 618 } 619 620 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 621 622 inline const G4ParticleDefinition* G4VEnergyLossProcess::Particle() const 623 { 624 return particle; 625 } 626 627 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 628 629 inline const G4ParticleDefinition* G4VEnergyLossProcess::BaseParticle() const 630 { 631 return baseParticle; 632 } 633 634 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 635 636 inline const G4ParticleDefinition* G4VEnergyLossProcess::SecondaryParticle() const 637 { 638 return secondaryParticle; 639 } 640 641 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 642 643 inline void G4VEnergyLossProcess::SetLossFluctuations(G4bool val) 644 { 645 lossFluctuationFlag = val; 646 } 647 648 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 649 650 inline void G4VEnergyLossProcess::SetRandomStep(G4bool val) 651 { 652 rndmStepFlag = val; 653 } 654 655 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 656 657 inline void G4VEnergyLossProcess::SetIntegral(G4bool val) 658 { 659 integral = val; 660 } 661 662 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 663 664 inline G4bool G4VEnergyLossProcess::IsIntegral() const 665 { 666 return integral; 667 } 668 669 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 670 671 inline void G4VEnergyLossProcess::SetIonisation(G4bool val) 672 { 673 isIonisation = val; 674 if(val) aGPILSelection = CandidateForSelection; 675 else aGPILSelection = NotCandidateForSelection; 676 } 677 678 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 679 680 inline G4bool G4VEnergyLossProcess::IsIonisationProcess() const 681 { 682 return isIonisation; 683 } 684 685 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 686 687 inline void G4VEnergyLossProcess::SetLinearLossLimit(G4double val) 688 { 689 linLossLimit = val; 690 } 691 692 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 693 694 inline void G4VEnergyLossProcess::SetMinSubRange(G4double val) 695 { 696 minSubRange = val; 697 } 698 699 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 700 701 inline void G4VEnergyLossProcess::SetLambdaFactor(G4double val) 702 { 703 if(val > 0.0 && val <= 1.0) lambdaFactor = val; 704 } 705 706 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 707 708 void G4VEnergyLossProcess::SetStepFunction(G4double v1, G4double v2) 709 { 710 dRoverRange = v1; 711 finalRange = v2; 712 if (dRoverRange > 0.999) dRoverRange = 1.0; 713 currentCouple = 0; 714 mfpKinEnergy = DBL_MAX; 715 } 716 717 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 718 719 inline G4int G4VEnergyLossProcess::NumberOfSubCutoffRegions() const 720 { 721 return nSCoffRegions; 722 } 723 724 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 725 726 inline G4int G4VEnergyLossProcess::NumberOfDERegions() const 727 { 728 return nDERegions; 729 } 730 731 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 732 733 inline void G4VEnergyLossProcess::SetDEDXBinning(G4int nbins) 734 { 735 nBins = nbins; 736 } 737 738 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 739 740 inline void G4VEnergyLossProcess::SetLambdaBinning(G4int nbins) 741 { 742 nBins = nbins; 743 } 744 745 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 746 747 inline void G4VEnergyLossProcess::SetDEDXBinningForCSDARange(G4int nbins) 748 { 749 nBinsCSDA = nbins; 750 } 751 752 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 753 754 inline void G4VEnergyLossProcess::SetMinKinEnergy(G4double e) 755 { 756 minKinEnergy = e; 757 } 758 759 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 760 761 inline G4double G4VEnergyLossProcess::MinKinEnergy() const 762 { 763 return minKinEnergy; 764 } 765 766 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 767 768 inline void G4VEnergyLossProcess::SetMaxKinEnergy(G4double e) 769 { 770 maxKinEnergy = e; 771 if(e < maxKinEnergyCSDA) maxKinEnergyCSDA = e; 772 } 773 774 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 775 776 inline G4double G4VEnergyLossProcess::MaxKinEnergy() const 777 { 778 return maxKinEnergy; 779 } 780 781 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 782 783 inline void G4VEnergyLossProcess::SetMaxKinEnergyForCSDARange(G4double e) 784 { 785 maxKinEnergyCSDA = e; 542 786 } 543 787 … … 558 802 DefineMaterial(couple); 559 803 return GetSubDEDXForScaledEnergy(kineticEnergy*massRatio); 560 }561 562 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....563 564 inline G4double G4VEnergyLossProcess::GetDEDXForScaledEnergy(G4double e)565 {566 G4bool b;567 G4double x =568 ((*theDEDXTable)[currentMaterialIndex]->GetValue(e, b))*chargeSqRatio;569 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);570 return x;571 }572 573 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....574 575 inline G4double G4VEnergyLossProcess::GetSubDEDXForScaledEnergy(G4double e)576 {577 G4bool b;578 G4double x =579 ((*theDEDXSubTable)[currentMaterialIndex]->GetValue(e, b))*chargeSqRatio;580 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);581 return x;582 }583 584 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....585 586 inline G4double G4VEnergyLossProcess::GetIonisationForScaledEnergy(G4double e)587 {588 G4bool b;589 G4double x = 0.0;590 // if(theIonisationTable) {591 x = ((*theIonisationTable)[currentMaterialIndex]->GetValue(e, b))592 *chargeSqRatio;593 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);594 //}595 return x;596 }597 598 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....599 600 inline601 G4double G4VEnergyLossProcess::GetSubIonisationForScaledEnergy(G4double e)602 {603 G4bool b;604 G4double x = 0.0;605 //if(theIonisationSubTable) {606 x = ((*theIonisationSubTable)[currentMaterialIndex]->GetValue(e, b))607 *chargeSqRatio;608 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);609 //}610 return x;611 804 } 612 805 … … 643 836 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 644 837 838 inline G4double G4VEnergyLossProcess::GetRangeForLoss( 839 G4double& kineticEnergy, 840 const G4MaterialCutsCouple* couple) 841 { 842 DefineMaterial(couple); 843 G4double x = DBL_MAX; 844 if(theRangeTableForLoss) 845 x = GetScaledRangeForScaledEnergy(kineticEnergy*massRatio)*reduceFactor; 846 // G4cout << "Range from " << GetProcessName() 847 // << " e= " << kineticEnergy << " r= " << x << G4endl; 848 return x; 849 } 850 851 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 852 853 inline G4double G4VEnergyLossProcess::GetKineticEnergy( 854 G4double& range, 855 const G4MaterialCutsCouple* couple) 856 { 857 DefineMaterial(couple); 858 G4double r = range/reduceFactor; 859 G4double e = ScaledKinEnergyForLoss(r)/massRatio; 860 return e; 861 } 862 863 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 864 865 inline G4double G4VEnergyLossProcess::GetLambda(G4double& kineticEnergy, 866 const G4MaterialCutsCouple* couple) 867 { 868 DefineMaterial(couple); 869 G4double x = 0.0; 870 if(theLambdaTable) x = GetLambdaForScaledEnergy(kineticEnergy*massRatio); 871 return x; 872 } 873 874 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 875 876 inline G4bool G4VEnergyLossProcess::TablesAreBuilt() const 877 { 878 return tablesAreBuilt; 879 } 880 881 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 882 883 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTable() const 884 { 885 return theDEDXTable; 886 } 887 888 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 889 890 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTableForSubsec() const 891 { 892 return theDEDXSubTable; 893 } 894 895 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 896 897 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXunRestrictedTable() const 898 { 899 return theDEDXunRestrictedTable; 900 } 901 902 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 903 904 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTable() const 905 { 906 G4PhysicsTable* t = theDEDXTable; 907 if(theIonisationTable) t = theIonisationTable; 908 return t; 909 } 910 911 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 912 913 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTableForSubsec() const 914 { 915 G4PhysicsTable* t = theDEDXSubTable; 916 if(theIonisationSubTable) t = theIonisationSubTable; 917 return t; 918 } 919 920 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 921 922 inline G4PhysicsTable* G4VEnergyLossProcess::CSDARangeTable() const 923 { 924 return theCSDARangeTable; 925 } 926 927 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 928 929 inline G4PhysicsTable* G4VEnergyLossProcess::RangeTableForLoss() const 930 { 931 return theRangeTableForLoss; 932 } 933 934 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 935 936 inline G4PhysicsTable* G4VEnergyLossProcess::InverseRangeTable() const 937 { 938 return theInverseRangeTable; 939 } 940 941 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 942 943 inline G4PhysicsTable* G4VEnergyLossProcess::LambdaTable() 944 { 945 return theLambdaTable; 946 } 947 948 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 949 950 inline G4PhysicsTable* G4VEnergyLossProcess::SubLambdaTable() 951 { 952 return theSubLambdaTable; 953 } 954 955 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 956 957 inline G4double G4VEnergyLossProcess::SampleRange() 958 { 959 G4double e = amu_c2*preStepKinEnergy/particle->GetPDGMass(); 960 G4bool b; 961 G4double s = fRange*std::pow(10.,vstrag->GetValue(e,b)); 962 G4double x = fRange + G4RandGauss::shoot(0.0,s); 963 if(x > 0.0) fRange = x; 964 return fRange; 965 } 966 967 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 968 969 inline void G4VEnergyLossProcess::SetDynamicMassCharge(G4double massratio, 970 G4double charge2ratio) 971 { 972 massRatio = massratio; 973 chargeSqRatio = charge2ratio; 974 reduceFactor = 1.0/(chargeSqRatio*massRatio); 975 } 976 977 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 978 979 inline void G4VEnergyLossProcess::DefineMaterial( 980 const G4MaterialCutsCouple* couple) 981 { 982 if(couple != currentCouple) { 983 currentCouple = couple; 984 currentMaterial = couple->GetMaterial(); 985 currentMaterialIndex = couple->GetIndex(); 986 mfpKinEnergy = DBL_MAX; 987 } 988 } 989 990 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 991 992 inline G4double G4VEnergyLossProcess::GetDEDXForScaledEnergy(G4double e) 993 { 994 G4bool b; 995 G4double x = 996 ((*theDEDXTable)[currentMaterialIndex]->GetValue(e, b))*chargeSqRatio; 997 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy); 998 return x; 999 } 1000 1001 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1002 1003 inline G4double G4VEnergyLossProcess::GetSubDEDXForScaledEnergy(G4double e) 1004 { 1005 G4bool b; 1006 G4double x = 1007 ((*theDEDXSubTable)[currentMaterialIndex]->GetValue(e, b))*chargeSqRatio; 1008 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy); 1009 return x; 1010 } 1011 1012 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1013 1014 inline G4double G4VEnergyLossProcess::GetIonisationForScaledEnergy(G4double e) 1015 { 1016 G4bool b; 1017 G4double x = 0.0; 1018 // if(theIonisationTable) { 1019 x = ((*theIonisationTable)[currentMaterialIndex]->GetValue(e, b)) 1020 *chargeSqRatio; 1021 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy); 1022 //} 1023 return x; 1024 } 1025 1026 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1027 1028 inline 1029 G4double G4VEnergyLossProcess::GetSubIonisationForScaledEnergy(G4double e) 1030 { 1031 G4bool b; 1032 G4double x = 0.0; 1033 //if(theIonisationSubTable) { 1034 x = ((*theIonisationSubTable)[currentMaterialIndex]->GetValue(e, b)) 1035 *chargeSqRatio; 1036 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy); 1037 //} 1038 return x; 1039 } 1040 1041 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1042 1043 inline G4double G4VEnergyLossProcess::GetScaledRangeForScaledEnergy(G4double e) 1044 { 1045 G4bool b; 1046 G4double x = ((*theRangeTableForLoss)[currentMaterialIndex])->GetValue(e, b); 1047 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy); 1048 return x; 1049 } 1050 1051 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1052 645 1053 inline G4double G4VEnergyLossProcess::GetLimitScaledRangeForScaledEnergy( 646 1054 G4double e) … … 657 1065 } 658 1066 return x; 659 }660 661 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....662 663 inline G4double G4VEnergyLossProcess::GetRangeForLoss(664 G4double& kineticEnergy,665 const G4MaterialCutsCouple* couple)666 {667 DefineMaterial(couple);668 G4double x = DBL_MAX;669 if(theRangeTableForLoss)670 x = GetScaledRangeForScaledEnergy(kineticEnergy*massRatio)*reduceFactor;671 // G4cout << "Range from " << GetProcessName()672 // << " e= " << kineticEnergy << " r= " << x << G4endl;673 return x;674 }675 676 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....677 678 inline G4double G4VEnergyLossProcess::GetScaledRangeForScaledEnergy(G4double e)679 {680 G4bool b;681 G4double x = ((*theRangeTableForLoss)[currentMaterialIndex])->GetValue(e, b);682 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);683 return x;684 }685 686 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....687 688 inline G4double G4VEnergyLossProcess::GetKineticEnergy(689 G4double& range,690 const G4MaterialCutsCouple* couple)691 {692 DefineMaterial(couple);693 G4double r = range/reduceFactor;694 G4double e = ScaledKinEnergyForLoss(r)/massRatio;695 return e;696 1067 } 697 1068 … … 711 1082 } 712 1083 return e; 713 }714 715 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....716 717 inline G4double G4VEnergyLossProcess::GetLambda(G4double& kineticEnergy,718 const G4MaterialCutsCouple* couple)719 {720 DefineMaterial(couple);721 G4double x = 0.0;722 if(theLambdaTable) x = GetLambdaForScaledEnergy(kineticEnergy*massRatio);723 return x;724 1084 } 725 1085 … … 758 1118 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 759 1119 760 inline G4double G4VEnergyLossProcess::ContinuousStepLimit(761 const G4Track& track, G4double x, G4double y, G4double& z)762 {763 G4GPILSelection sel;764 return AlongStepGetPhysicalInteractionLength(track, x, y, z, &sel);765 }766 767 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....768 769 inline G4double G4VEnergyLossProcess::SampleRange()770 {771 G4double e = amu_c2*preStepKinEnergy/particle->GetPDGMass();772 G4bool b;773 G4double s = fRange*std::pow(10.,vstrag->GetValue(e,b));774 G4double x = fRange + G4RandGauss::shoot(0.0,s);775 if(x > 0.0) fRange = x;776 return fRange;777 }778 779 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....780 781 inline G4double G4VEnergyLossProcess::MeanFreePath(const G4Track& track)782 {783 DefineMaterial(track.GetMaterialCutsCouple());784 preStepLambda = GetLambdaForScaledEnergy(track.GetKineticEnergy()*massRatio);785 G4double x = DBL_MAX;786 if(DBL_MIN < preStepLambda) x = 1.0/preStepLambda;787 return x;788 }789 790 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....791 792 inline G4double G4VEnergyLossProcess::MinPrimaryEnergy(793 const G4ParticleDefinition*, const G4Material*, G4double cut)794 {795 return cut;796 }797 798 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....799 800 inline void G4VEnergyLossProcess::SelectModel(G4double kinEnergy)801 {802 currentModel = modelManager->SelectModel(kinEnergy, currentMaterialIndex);803 }804 805 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....806 807 inline G4VEmModel* G4VEnergyLossProcess::SelectModelForMaterial(808 G4double kinEnergy, size_t& idx) const809 {810 return modelManager->SelectModel(kinEnergy, idx);811 }812 813 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....814 815 inline G4ParticleChangeForLoss* G4VEnergyLossProcess::GetParticleChange()816 {817 return &fParticleChange;818 }819 820 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....821 822 inline const G4ParticleDefinition* G4VEnergyLossProcess::Particle() const823 {824 return particle;825 }826 827 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....828 829 inline const G4ParticleDefinition* G4VEnergyLossProcess::BaseParticle() const830 {831 return baseParticle;832 }833 834 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....835 836 inline const G4ParticleDefinition* G4VEnergyLossProcess::SecondaryParticle() const837 {838 return secondaryParticle;839 }840 841 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....842 843 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTable() const844 {845 return theDEDXTable;846 }847 848 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....849 850 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTableForSubsec() const851 {852 return theDEDXSubTable;853 }854 855 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....856 857 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXunRestrictedTable() const858 {859 return theDEDXunRestrictedTable;860 }861 862 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....863 864 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTable() const865 {866 G4PhysicsTable* t = theDEDXTable;867 if(theIonisationTable) t = theIonisationTable;868 return t;869 }870 871 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....872 873 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTableForSubsec() const874 {875 G4PhysicsTable* t = theDEDXSubTable;876 if(theIonisationSubTable) t = theIonisationSubTable;877 return t;878 }879 880 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....881 882 inline G4PhysicsTable* G4VEnergyLossProcess::CSDARangeTable() const883 {884 return theCSDARangeTable;885 }886 887 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....888 889 inline G4PhysicsTable* G4VEnergyLossProcess::RangeTableForLoss() const890 {891 return theRangeTableForLoss;892 }893 894 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....895 896 inline G4PhysicsTable* G4VEnergyLossProcess::InverseRangeTable() const897 {898 return theInverseRangeTable;899 }900 901 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....902 903 inline G4PhysicsTable* G4VEnergyLossProcess::LambdaTable()904 {905 return theLambdaTable;906 }907 908 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....909 910 inline G4PhysicsTable* G4VEnergyLossProcess::SubLambdaTable()911 {912 return theSubLambdaTable;913 }914 915 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....916 917 inline G4bool G4VEnergyLossProcess::IsIntegral() const918 {919 return integral;920 }921 922 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....923 924 inline size_t G4VEnergyLossProcess::CurrentMaterialCutsCoupleIndex() const925 {926 return currentMaterialIndex;927 }928 929 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....930 931 inline void G4VEnergyLossProcess::SetDynamicMassCharge(G4double massratio,932 G4double charge2ratio)933 {934 massRatio = massratio;935 chargeSqRatio = charge2ratio;936 reduceFactor = 1.0/(chargeSqRatio*massRatio);937 }938 939 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....940 941 inline G4double G4VEnergyLossProcess::GetCurrentRange() const942 {943 return fRange;944 }945 946 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....947 948 inline949 void G4VEnergyLossProcess::AddEmModel(G4int order, G4VEmModel* p,950 G4VEmFluctuationModel* fluc,951 const G4Region* region)952 {953 modelManager->AddEmModel(order, p, fluc, region);954 if(p) p->SetParticleChange(pParticleChange, fluc);955 }956 957 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....958 959 inline960 G4VEmModel* G4VEnergyLossProcess::GetModelByIndex(G4int idx, G4bool ver)961 {962 return modelManager->GetModel(idx, ver);963 }964 965 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....966 967 inline G4int G4VEnergyLossProcess::NumberOfModels()968 {969 return modelManager->NumberOfModels();970 }971 972 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....973 974 inline void G4VEnergyLossProcess::SetEmModel(G4VEmModel* p, G4int index)975 {976 G4int n = emModels.size();977 if(index >= n) for(G4int i=n; i<index+1; i++) {emModels.push_back(0);}978 emModels[index] = p;979 }980 981 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....982 983 inline G4VEmModel* G4VEnergyLossProcess::EmModel(G4int index)984 {985 G4VEmModel* p = 0;986 if(index >= 0 && index < G4int(emModels.size())) p = emModels[index];987 return p;988 }989 990 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....991 992 inline void G4VEnergyLossProcess::SetFluctModel(G4VEmFluctuationModel* p)993 {994 fluctModel = p;995 }996 997 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....998 999 inline G4VEmFluctuationModel* G4VEnergyLossProcess::FluctModel()1000 {1001 return fluctModel;1002 }1003 1004 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1005 1006 inline void G4VEnergyLossProcess::UpdateEmModel(const G4String& nam,1007 G4double emin, G4double emax)1008 {1009 modelManager->UpdateEmModel(nam, emin, emax);1010 }1011 1012 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1013 1014 inline void G4VEnergyLossProcess::SetIntegral(G4bool val)1015 {1016 integral = val;1017 }1018 1019 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1020 1021 inline void G4VEnergyLossProcess::SetParticle(const G4ParticleDefinition* p)1022 {1023 particle = p;1024 }1025 1026 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1027 1028 inline void G4VEnergyLossProcess::SetBaseParticle(const G4ParticleDefinition* p)1029 {1030 baseParticle = p;1031 }1032 1033 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1034 1035 inline void G4VEnergyLossProcess::SetSecondaryParticle(const G4ParticleDefinition* p)1036 {1037 secondaryParticle = p;1038 }1039 1040 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1041 1042 inline void G4VEnergyLossProcess::SetLinearLossLimit(G4double val)1043 {1044 linLossLimit = val;1045 }1046 1047 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1048 1049 inline void G4VEnergyLossProcess::SetLossFluctuations(G4bool val)1050 {1051 lossFluctuationFlag = val;1052 }1053 1054 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1055 1056 inline void G4VEnergyLossProcess::SetRandomStep(G4bool val)1057 {1058 rndmStepFlag = val;1059 }1060 1061 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1062 1063 inline void G4VEnergyLossProcess::SetMinSubRange(G4double val)1064 {1065 minSubRange = val;1066 }1067 1068 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1069 1070 inline G4bool G4VEnergyLossProcess::TablesAreBuilt() const1071 {1072 return tablesAreBuilt;1073 }1074 1075 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1076 1077 inline G4int G4VEnergyLossProcess::NumberOfSubCutoffRegions() const1078 {1079 return nSCoffRegions;1080 }1081 1082 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1083 1084 inline void G4VEnergyLossProcess::SetDEDXBinning(G4int nbins)1085 {1086 nBins = nbins;1087 }1088 1089 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1090 1091 inline void G4VEnergyLossProcess::SetLambdaBinning(G4int nbins)1092 {1093 nBins = nbins;1094 }1095 1096 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1097 1098 inline void G4VEnergyLossProcess::SetDEDXBinningForCSDARange(G4int nbins)1099 {1100 nBinsCSDA = nbins;1101 }1102 1103 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1104 1105 inline G4double G4VEnergyLossProcess::MinKinEnergy() const1106 {1107 return minKinEnergy;1108 }1109 1110 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1111 1112 inline void G4VEnergyLossProcess::SetMinKinEnergy(G4double e)1113 {1114 minKinEnergy = e;1115 }1116 1117 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1118 1119 inline void G4VEnergyLossProcess::SetMaxKinEnergy(G4double e)1120 {1121 maxKinEnergy = e;1122 if(e < maxKinEnergyCSDA) maxKinEnergyCSDA = e;1123 }1124 1125 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1126 1127 inline void G4VEnergyLossProcess::SetMaxKinEnergyForCSDARange(G4double e)1128 {1129 maxKinEnergyCSDA = e;1130 }1131 1132 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1133 1134 inline G4double G4VEnergyLossProcess::MaxKinEnergy() const1135 {1136 return maxKinEnergy;1137 }1138 1139 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1140 1141 inline void G4VEnergyLossProcess::SetLambdaFactor(G4double val)1142 {1143 if(val > 0.0 && val <= 1.0) lambdaFactor = val;1144 }1145 1146 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1147 1148 inline void G4VEnergyLossProcess::SetIonisation(G4bool val)1149 {1150 isIonisation = val;1151 if(val) aGPILSelection = CandidateForSelection;1152 else aGPILSelection = NotCandidateForSelection;1153 }1154 1155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1156 1157 inline G4bool G4VEnergyLossProcess::IsIonisationProcess() const1158 {1159 return isIonisation;1160 }1161 1162 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1163 1164 void G4VEnergyLossProcess::SetStepFunction(G4double v1, G4double v2)1165 {1166 dRoverRange = v1;1167 finalRange = v2;1168 if (dRoverRange > 0.999) dRoverRange = 1.0;1169 currentCouple = 0;1170 mfpKinEnergy = DBL_MAX;1171 }1172 1173 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1174 1175 1120 #endif -
trunk/source/processes/electromagnetic/utils/include/G4VMscModel.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VMscModel.hh,v 1. 4 2008/03/10 10:39:28vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4VMscModel.hh,v 1.9 2009/04/07 18:39:47 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 39 39 // 40 40 // Modifications: 41 // 41 // 07.04.2009 V.Ivanchenko moved msc methods from G4VEmModel to G4VMscModel 42 42 // 43 43 // Class Description: … … 54 54 #include "G4MscStepLimitType.hh" 55 55 #include "globals.hh" 56 #include "G4ThreeVector.hh" 57 #include "G4Track.hh" 58 #include "G4SafetyHelper.hh" 59 60 class G4ParticleChangeForMSC; 56 61 57 62 class G4VMscModel : public G4VEmModel … … 64 69 virtual ~G4VMscModel(); 65 70 71 virtual G4double ComputeTruePathLengthLimit(const G4Track& track, 72 G4PhysicsTable* theLambdaTable, 73 G4double currentMinimalStep); 74 75 virtual G4double ComputeGeomPathLength(G4double truePathLength); 76 77 virtual G4double ComputeTrueStepLength(G4double geomPathLength); 78 79 virtual void SampleScattering(const G4DynamicParticle*, 80 G4double safety); 81 82 // empty 83 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*, 84 const G4MaterialCutsCouple*, 85 const G4DynamicParticle*, 86 G4double tmin, 87 G4double tmax); 88 89 //================================================================ 90 // Set parameters of multiple scattering models 91 //================================================================ 92 66 93 inline void SetStepLimitType(G4MscStepLimitType); 67 94 … … 73 100 74 101 inline void SetSkin(G4double); 102 103 inline void SetSampleZ(G4bool); 104 105 protected: 106 107 // initialisation of the ParticleChange for the model 108 G4ParticleChangeForMSC* GetParticleChangeForMSC(); 109 110 // initialisation of interface with geometry 111 void InitialiseSafetyHelper(); 112 113 // shift point of the track PostStep 114 void ComputeDisplacement(G4ParticleChangeForMSC*, 115 const G4ThreeVector& displDir, 116 G4double displacement, 117 G4double postsafety); 118 119 // compute safety 120 inline G4double ComputeSafety(const G4ThreeVector& position, G4double limit); 121 122 // compute linear distance to a geometry boundary 123 inline G4double ComputeGeomLimit(const G4Track& position, G4double& presafety, 124 G4double limit); 75 125 76 126 private: … … 79 129 G4VMscModel & operator=(const G4VMscModel &right); 80 130 G4VMscModel(const G4VMscModel&); 131 132 G4SafetyHelper* safetyHelper; 81 133 82 134 protected: … … 88 140 G4double dtrl; 89 141 G4double lambdalimit; 142 G4double geommax; 90 143 91 144 G4MscStepLimitType steppingAlgorithm; … … 134 187 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 135 188 189 inline void G4VMscModel::SetSampleZ(G4bool val) 190 { 191 samplez = val; 192 } 193 194 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 195 196 inline G4double G4VMscModel::ComputeSafety(const G4ThreeVector& position, 197 G4double) 198 { 199 return safetyHelper->ComputeSafety(position); 200 } 201 202 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 203 204 inline G4double G4VMscModel::ComputeGeomLimit(const G4Track& track, 205 G4double& presafety, 206 G4double limit) 207 { 208 G4double res = geommax; 209 if(track.GetVolume() != safetyHelper->GetWorldVolume()) { 210 res = safetyHelper->CheckNextStep( 211 track.GetStep()->GetPreStepPoint()->GetPosition(), 212 track.GetMomentumDirection(), 213 limit, presafety); 214 } 215 return res; 216 } 217 218 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 219 136 220 #endif 137 221 -
trunk/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh
r1007 r1055 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VMultipleScattering.hh,v 1.5 4 2008/07/31 13:01:26vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 2$26 // $Id: G4VMultipleScattering.hh,v 1.56 2009/04/07 18:39:47 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-03-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 64 64 // 27-10-07 Virtual functions moved to source (V.Ivanchenko) 65 65 // 15-07-08 Reorder class members for further multi-thread development (VI) 66 // 07-04-09 Moved msc methods from G4VEmModel to G4VMscModel (VI) 66 67 // 67 68 … … 80 81 #include "G4Step.hh" 81 82 #include "G4EmModelManager.hh" 82 #include "G4V EmModel.hh"83 #include "G4VMscModel.hh" 83 84 #include "G4MscStepLimitType.hh" 84 85 … … 145 146 G4bool ascii); 146 147 147 //------------------------------------------------------------------------148 // Specific methods for msc processes149 //------------------------------------------------------------------------150 151 148 // The function overloads the corresponding function of the base 152 149 // class.It limits the step near to boundaries only 153 150 // and invokes the method GetMscContinuousStepLimit at every step. 154 virtualG4double AlongStepGetPhysicalInteractionLength(151 G4double AlongStepGetPhysicalInteractionLength( 155 152 const G4Track&, 156 153 G4double previousStepSize, … … 192 189 inline G4PhysicsTable* LambdaTable() const; 193 190 194 //------------------------------------------------------------------------ 195 // Define and access particle type 196 //------------------------------------------------------------------------ 197 191 // access particle type 198 192 inline const G4ParticleDefinition* Particle() const; 199 inline void SetParticle(const G4ParticleDefinition*);200 193 201 194 //------------------------------------------------------------------------ … … 203 196 //------------------------------------------------------------------------ 204 197 205 inline void AddEmModel(G4int, G4VEmModel*, const G4Region* region = 0); 206 198 protected: 199 // Select model in run time 200 inline G4VEmModel* SelectModel(G4double kinEnergy); 201 202 public: 203 // Select model in run time 207 204 inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy, 208 205 size_t& idxRegion) const; 209 206 210 // Access to models 211 inline G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false); 212 213 //------------------------------------------------------------------------ 214 // Set parameters for simulation of multiple scattering 215 //------------------------------------------------------------------------ 216 207 // Add model for region, smaller value of order defines which 208 // model will be selected for a given energy interval 209 void AddEmModel(G4int order, G4VEmModel*, const G4Region* region = 0); 210 211 // Access to models by index 212 G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false); 213 214 //------------------------------------------------------------------------ 215 // Get/Set parameters for simulation of multiple scattering 216 //------------------------------------------------------------------------ 217 218 inline G4bool LateralDisplasmentFlag() const; 217 219 inline void SetLateralDisplasmentFlag(G4bool val); 218 220 221 inline G4double Skin() const; 219 222 inline void SetSkin(G4double val); 220 223 224 inline G4double RangeFactor() const; 221 225 inline void SetRangeFactor(G4double val); 222 226 227 inline G4double GeomFactor() const; 223 228 inline void SetGeomFactor(G4double val); 224 229 230 inline G4double PolarAngleLimit() const; 225 231 inline void SetPolarAngleLimit(G4double val); 226 232 233 inline G4MscStepLimitType StepLimitType() const; 227 234 inline void SetStepLimitType(G4MscStepLimitType val); 228 235 236 //------------------------------------------------------------------------ 237 // Run time methods 238 //------------------------------------------------------------------------ 239 229 240 protected: 230 241 231 // This method is used for tracking, it returns mean free path value242 // This method is not used for tracking, it returns mean free path value 232 243 G4double GetMeanFreePath(const G4Track& track, 233 244 G4double, 234 245 G4ForceCondition* condition); 235 236 //------------------------------------------------------------------------237 // Run time methods238 //------------------------------------------------------------------------239 246 240 247 // This method is not used for tracking, it returns step limit … … 244 251 G4double& currentSafety); 245 252 253 // This method returns inversed transport cross section 246 254 inline G4double GetLambda(const G4ParticleDefinition* p, 247 255 G4double& kineticEnergy); … … 253 261 G4double& currentSafety); 254 262 255 inline G4VEmModel* SelectModel(G4double kinEnergy);256 // Select concrete model263 // defines current material in run time 264 inline void DefineMaterial(const G4MaterialCutsCouple* couple); 257 265 258 266 inline const G4MaterialCutsCouple* CurrentMaterialCutsCouple() const; 259 267 260 // define current material261 inline void DefineMaterial(const G4MaterialCutsCouple* couple);262 263 //------------------------------------------------------------------------264 // Access parameters of multiple scattering265 //------------------------------------------------------------------------266 267 inline G4ParticleChangeForMSC* GetParticleChange();268 269 inline G4double Skin() const;270 271 inline G4double RangeFactor() const;272 273 inline G4double GeomFactor() const;274 275 inline G4double PolarAngleLimit() const;276 277 inline G4MscStepLimitType StepLimitType() const;278 279 inline G4bool LateralDisplasmentFlag() const;280 281 268 private: 282 269 283 270 // hide assignment operator 284 285 271 G4VMultipleScattering(G4VMultipleScattering &); 286 272 G4VMultipleScattering & operator=(const G4VMultipleScattering &right); … … 318 304 private: 319 305 320 G4V EmModel*currentModel;306 G4VMscModel* currentModel; 321 307 322 308 // cache … … 330 316 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 331 317 318 inline G4double G4VMultipleScattering::ContinuousStepLimit( 319 const G4Track& track, 320 G4double previousStepSize, 321 G4double currentMinimalStep, 322 G4double& currentSafety) 323 { 324 return GetMscContinuousStepLimit(track,previousStepSize,currentMinimalStep, 325 currentSafety); 326 } 327 328 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 329 330 inline void G4VMultipleScattering::SetBinning(G4int nbins) 331 { 332 nBins = nbins; 333 } 334 335 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 336 337 inline G4int G4VMultipleScattering::Binning() const 338 { 339 return nBins; 340 } 341 342 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 343 344 inline void G4VMultipleScattering::SetMinKinEnergy(G4double e) 345 { 346 minKinEnergy = e; 347 } 348 349 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 350 351 inline G4double G4VMultipleScattering::MinKinEnergy() const 352 { 353 return minKinEnergy; 354 } 355 356 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 357 358 inline void G4VMultipleScattering::SetMaxKinEnergy(G4double e) 359 { 360 maxKinEnergy = e; 361 } 362 363 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 364 365 inline G4double G4VMultipleScattering::MaxKinEnergy() const 366 { 367 return maxKinEnergy; 368 } 369 370 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 371 372 inline void G4VMultipleScattering::SetBuildLambdaTable(G4bool val) 373 { 374 buildLambdaTable = val; 375 } 376 377 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 378 379 inline G4PhysicsTable* G4VMultipleScattering::LambdaTable() const 380 { 381 return theLambdaTable; 382 } 383 384 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 385 386 inline const G4ParticleDefinition* G4VMultipleScattering::Particle() const 387 { 388 return currentParticle; 389 } 390 391 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 392 393 inline G4VEmModel* G4VMultipleScattering::SelectModel(G4double kinEnergy) 394 { 395 return modelManager->SelectModel(kinEnergy, currentMaterialIndex); 396 } 397 398 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 399 400 inline G4VEmModel* G4VMultipleScattering::SelectModelForMaterial( 401 G4double kinEnergy, size_t& idxRegion) const 402 { 403 return modelManager->SelectModel(kinEnergy, idxRegion); 404 } 405 406 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 407 408 inline G4bool G4VMultipleScattering::LateralDisplasmentFlag() const 409 { 410 return latDisplasment; 411 } 412 413 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 414 415 inline void G4VMultipleScattering::SetLateralDisplasmentFlag(G4bool val) 416 { 417 latDisplasment = val; 418 } 419 420 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 421 422 inline G4double G4VMultipleScattering::Skin() const 423 { 424 return skin; 425 } 426 427 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 428 429 inline void G4VMultipleScattering::SetSkin(G4double val) 430 { 431 if(val < 1.0) skin = 0.0; 432 else skin = val; 433 } 434 435 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 436 437 inline G4double G4VMultipleScattering::RangeFactor() const 438 { 439 return facrange; 440 } 441 442 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 443 444 inline void G4VMultipleScattering::SetRangeFactor(G4double val) 445 { 446 if(val > 0.0) facrange = val; 447 } 448 449 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 450 451 inline G4double G4VMultipleScattering::GeomFactor() const 452 { 453 return facgeom; 454 } 455 456 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 457 458 inline void G4VMultipleScattering::SetGeomFactor(G4double val) 459 { 460 if(val > 0.0) facgeom = val; 461 } 462 463 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 464 465 inline G4double G4VMultipleScattering::PolarAngleLimit() const 466 { 467 return polarAngleLimit; 468 } 469 470 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 471 472 inline void G4VMultipleScattering::SetPolarAngleLimit(G4double val) 473 { 474 if(val < 0.0) polarAngleLimit = 0.0; 475 else if(val > pi) polarAngleLimit = pi; 476 else polarAngleLimit = val; 477 } 478 479 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 480 481 inline G4MscStepLimitType G4VMultipleScattering::StepLimitType() const 482 { 483 return stepLimit; 484 } 485 486 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 487 488 inline void G4VMultipleScattering::SetStepLimitType(G4MscStepLimitType val) 489 { 490 stepLimit = val; 491 if(val == fMinimal) facrange = 0.2; 492 } 493 494 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 495 332 496 inline 333 void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* couple) 334 { 335 if(couple != currentCouple) { 336 currentCouple = couple; 337 currentMaterialIndex = couple->GetIndex(); 497 G4double G4VMultipleScattering::GetLambda(const G4ParticleDefinition* p, 498 G4double& e) 499 { 500 G4double x; 501 if(theLambdaTable) { 502 G4bool b; 503 x = ((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b); 504 } else { 505 x = currentModel->CrossSection(currentCouple,p,e); 338 506 } 507 if(x > DBL_MIN) x = 1./x; 508 else x = DBL_MAX; 509 return x; 339 510 } 340 511 … … 349 520 G4double x = currentMinimalStep; 350 521 DefineMaterial(track.GetMaterialCutsCouple()); 351 currentModel = SelectModel(scaledKinEnergy);522 currentModel = static_cast<G4VMscModel*>(SelectModel(scaledKinEnergy)); 352 523 if(x > 0.0 && scaledKinEnergy > 0.0) { 353 524 G4double tPathLength = … … 364 535 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 365 536 366 inline G4double G4VMultipleScattering::ContinuousStepLimit(367 const G4Track& track,368 G4double previousStepSize,369 G4double currentMinimalStep,370 G4double& currentSafety)371 {372 return GetMscContinuousStepLimit(track,previousStepSize,currentMinimalStep,373 currentSafety);374 }375 376 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....377 378 537 inline 379 G4double G4VMultipleScattering::GetLambda(const G4ParticleDefinition* p, 380 G4double& e) 381 { 382 G4double x; 383 if(theLambdaTable) { 384 G4bool b; 385 x = ((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b); 386 } else { 387 x = currentModel->CrossSection(currentCouple,p,e); 538 void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* couple) 539 { 540 if(couple != currentCouple) { 541 currentCouple = couple; 542 currentMaterialIndex = couple->GetIndex(); 388 543 } 389 if(x > DBL_MIN) x = 1./x; 390 else x = DBL_MAX; 391 return x; 392 } 393 394 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 395 396 inline G4VEmModel* G4VMultipleScattering::SelectModel(G4double kinEnergy) 397 { 398 return modelManager->SelectModel(kinEnergy, currentMaterialIndex); 399 } 400 401 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 402 403 inline G4VEmModel* G4VMultipleScattering::SelectModelForMaterial( 404 G4double kinEnergy, size_t& idxRegion) const 405 { 406 return modelManager->SelectModel(kinEnergy, idxRegion); 407 } 408 409 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 410 411 inline void G4VMultipleScattering::SetBinning(G4int nbins) 412 { 413 nBins = nbins; 414 } 415 416 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 417 418 inline G4int G4VMultipleScattering::Binning() const 419 { 420 return nBins; 421 } 422 423 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 424 425 inline void G4VMultipleScattering::SetMinKinEnergy(G4double e) 426 { 427 minKinEnergy = e; 428 } 429 430 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 431 432 inline G4double G4VMultipleScattering::MinKinEnergy() const 433 { 434 return minKinEnergy; 435 } 436 437 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 438 439 inline void G4VMultipleScattering::SetMaxKinEnergy(G4double e) 440 { 441 maxKinEnergy = e; 442 } 443 444 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 445 446 inline G4double G4VMultipleScattering::MaxKinEnergy() const 447 { 448 return maxKinEnergy; 449 } 450 451 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 452 453 inline G4bool G4VMultipleScattering::LateralDisplasmentFlag() const 454 { 455 return latDisplasment; 456 } 457 458 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 459 460 inline void G4VMultipleScattering::SetLateralDisplasmentFlag(G4bool val) 461 { 462 latDisplasment = val; 463 } 464 465 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 466 467 inline G4ParticleChangeForMSC* G4VMultipleScattering::GetParticleChange() 468 { 469 return &fParticleChange; 470 } 471 472 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 473 474 inline G4double G4VMultipleScattering::Skin() const 475 { 476 return skin; 477 } 478 479 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 480 481 inline void G4VMultipleScattering::SetSkin(G4double val) 482 { 483 if(val < 1.0) skin = 0.0; 484 else skin = val; 485 } 486 487 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 488 489 inline G4double G4VMultipleScattering::RangeFactor() const 490 { 491 return facrange; 492 } 493 494 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 495 496 inline void G4VMultipleScattering::SetRangeFactor(G4double val) 497 { 498 if(val > 0.0) facrange = val; 499 } 500 501 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 502 503 inline G4double G4VMultipleScattering::GeomFactor() const 504 { 505 return facgeom; 506 } 507 508 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 509 510 inline void G4VMultipleScattering::SetGeomFactor(G4double val) 511 { 512 if(val > 0.0) facgeom = val; 513 } 514 515 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 516 517 inline G4double G4VMultipleScattering::PolarAngleLimit() const 518 { 519 return polarAngleLimit; 520 } 521 522 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 523 524 inline void G4VMultipleScattering::SetPolarAngleLimit(G4double val) 525 { 526 if(val < 0.0) polarAngleLimit = 0.0; 527 else if(val > pi) polarAngleLimit = pi; 528 else polarAngleLimit = val; 529 } 530 531 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 532 533 inline G4MscStepLimitType G4VMultipleScattering::StepLimitType() const 534 { 535 return stepLimit; 536 } 537 538 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 539 540 inline void G4VMultipleScattering::SetStepLimitType(G4MscStepLimitType val) 541 { 542 stepLimit = val; 543 if(val == fMinimal) facrange = 0.2; 544 } 545 546 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 547 548 inline void G4VMultipleScattering::SetBuildLambdaTable(G4bool val) 549 { 550 buildLambdaTable = val; 551 } 552 553 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 554 555 inline const G4ParticleDefinition* G4VMultipleScattering::Particle() const 556 { 557 return currentParticle; 558 } 559 560 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 561 562 inline G4PhysicsTable* G4VMultipleScattering::LambdaTable() const 563 { 564 return theLambdaTable; 565 } 566 567 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 568 569 inline 570 const G4MaterialCutsCouple* G4VMultipleScattering::CurrentMaterialCutsCouple() const 544 } 545 546 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 547 548 inline const G4MaterialCutsCouple* 549 G4VMultipleScattering::CurrentMaterialCutsCouple() const 571 550 { 572 551 return currentCouple; … … 575 554 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 576 555 577 inline void G4VMultipleScattering::AddEmModel(G4int order, G4VEmModel* p,578 const G4Region* region)579 {580 G4VEmFluctuationModel* fm = 0;581 modelManager->AddEmModel(order, p, fm, region);582 if(p) p->SetParticleChange(pParticleChange);583 }584 585 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....586 587 inline588 G4VEmModel* G4VMultipleScattering::GetModelByIndex(G4int idx, G4bool ver)589 {590 return modelManager->GetModel(idx, ver);591 }592 593 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....594 595 556 #endif
Note: See TracChangeset
for help on using the changeset viewer.