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