- Timestamp:
- Jun 18, 2010, 11:42:07 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/electromagnetic/utils/include/G4VEmProcess.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VEmProcess.hh,v 1. 55 2009/09/23 14:42:47vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4VEmProcess.hh,v 1.60 2010/04/28 14:43:13 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 56 56 // 27-10-07 Virtual functions moved to source (V.Ivanchenko) 57 57 // 15-07-08 Reorder class members for further multi-thread development (VI) 58 // 17-02-10 Added pointer currentParticle (VI) 58 59 // 59 60 // Class Description: … … 158 159 159 160 // It returns the cross section of the process per atom 160 inlineG4double ComputeCrossSectionPerAtom(G4double kineticEnergy,161 162 163 164 inlineG4double MeanFreePath(const G4Track& track);161 G4double ComputeCrossSectionPerAtom(G4double kineticEnergy, 162 G4double Z, G4double A=0., 163 G4double cut=0.0); 164 165 G4double MeanFreePath(const G4Track& track); 165 166 166 167 // It returns cross section per volume … … 225 226 G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false); 226 227 228 // access atom on which interaction happens 229 const G4Element* GetCurrentElement() const; 230 227 231 inline void SetLambdaFactor(G4double val); 228 232 … … 231 235 232 236 inline void SetApplyCuts(G4bool val); 237 238 inline void SetBuildTableFlag(G4bool val); 233 239 234 240 //------------------------------------------------------------------------ … … 245 251 246 252 inline G4double RecalculateLambda(G4double kinEnergy, 247 const G4MaterialCutsCouple* couple);253 const G4MaterialCutsCouple* couple); 248 254 249 255 inline G4ParticleChangeForGamma* GetParticleChange(); … … 258 264 259 265 inline G4double GetElectronEnergyCut(); 260 261 inline void SetBuildTableFlag(G4bool val);262 266 263 267 inline void SetStartFromNullFlag(G4bool val); … … 340 344 341 345 const G4ParticleDefinition* particle; 346 const G4ParticleDefinition* currentParticle; 342 347 343 348 // cash … … 352 357 }; 353 358 354 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 355 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 356 357 inline G4double G4VEmProcess::ComputeCrossSectionPerAtom( 358 G4double kineticEnergy, G4double Z, G4double A, G4double cut) 359 { 360 SelectModel(kineticEnergy, currentCoupleIndex); 361 G4double x = 0.0; 362 if(currentModel) { 363 x = currentModel->ComputeCrossSectionPerAtom(particle,kineticEnergy, 364 Z,A,cut); 365 } 366 return x; 367 } 368 369 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 370 371 inline G4double G4VEmProcess::MeanFreePath(const G4Track& track) 372 { 373 DefineMaterial(track.GetMaterialCutsCouple()); 374 preStepLambda = GetCurrentLambda(track.GetKineticEnergy()); 375 G4double x = DBL_MAX; 376 if(DBL_MIN < preStepLambda) x = 1.0/preStepLambda; 377 return x; 378 } 379 380 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 381 382 inline G4double G4VEmProcess::GetLambda(G4double& kineticEnergy, 383 const G4MaterialCutsCouple* couple) 384 { 385 DefineMaterial(couple); 386 return GetCurrentLambda(kineticEnergy); 387 } 388 389 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 390 391 inline void G4VEmProcess::SetLambdaBinning(G4int nbins) 392 { 393 nLambdaBins = nbins; 394 } 395 396 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 397 398 inline G4int G4VEmProcess::LambdaBinning() const 399 { 400 return nLambdaBins; 401 } 402 403 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 404 405 inline void G4VEmProcess::SetMinKinEnergy(G4double e) 406 { 407 minKinEnergy = e; 408 } 409 410 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 411 412 inline G4double G4VEmProcess::MinKinEnergy() const 413 { 414 return minKinEnergy; 415 } 416 417 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 418 419 inline void G4VEmProcess::SetMaxKinEnergy(G4double e) 420 { 421 maxKinEnergy = e; 422 } 423 424 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 425 426 inline G4double G4VEmProcess::MaxKinEnergy() const 427 { 428 return maxKinEnergy; 429 } 430 431 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 432 433 inline void G4VEmProcess::SetPolarAngleLimit(G4double val) 434 { 435 if(val < 0.0) polarAngleLimit = 0.0; 436 else if(val > pi) polarAngleLimit = pi; 437 else polarAngleLimit = val; 438 } 439 440 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 441 442 inline G4double G4VEmProcess::PolarAngleLimit() const 443 { 444 return polarAngleLimit; 445 } 446 447 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 448 449 inline const G4PhysicsTable* G4VEmProcess::LambdaTable() const 450 { 451 return theLambdaTable; 452 } 453 454 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 455 456 inline const G4ParticleDefinition* G4VEmProcess::Particle() const 457 { 458 return particle; 459 } 460 461 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 462 463 inline const G4ParticleDefinition* G4VEmProcess::SecondaryParticle() const 464 { 465 return secondaryParticle; 466 } 467 468 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 469 470 inline 471 G4VEmModel* G4VEmProcess::SelectModel(G4double& kinEnergy, size_t index) 472 { 473 currentModel = modelManager->SelectModel(kinEnergy, index); 474 currentModel->SetCurrentCouple(currentCouple); 475 return currentModel; 476 } 477 478 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 479 480 inline 481 G4VEmModel* G4VEmProcess::SelectModelForMaterial(G4double kinEnergy, 482 size_t& idxRegion) const 483 { 484 return modelManager->SelectModel(kinEnergy, idxRegion); 485 } 486 487 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 488 489 inline void G4VEmProcess::SetLambdaFactor(G4double val) 490 { 491 if(val > 0.0 && val <= 1.0) lambdaFactor = val; 492 } 493 494 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 495 496 inline void G4VEmProcess::SetIntegral(G4bool val) 497 { 498 if(particle && particle != theGamma) integral = val; 499 if(integral) buildLambdaTable = true; 500 } 501 502 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 503 504 inline G4bool G4VEmProcess::IsIntegral() const 505 { 506 return integral; 507 } 508 509 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 510 511 inline void G4VEmProcess::SetApplyCuts(G4bool val) 512 { 513 applyCuts = val; 514 } 515 516 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 517 518 inline G4double G4VEmProcess::RecalculateLambda(G4double e, 519 const G4MaterialCutsCouple* couple) 520 { 521 DefineMaterial(couple); 522 return ComputeCurrentLambda(e); 523 } 524 525 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 526 527 inline G4ParticleChangeForGamma* G4VEmProcess::GetParticleChange() 528 { 529 return &fParticleChange; 530 } 531 532 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 533 534 inline void G4VEmProcess::SetParticle(const G4ParticleDefinition* p) 535 { 536 particle = p; 537 } 538 539 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 540 541 inline void G4VEmProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 542 { 543 secondaryParticle = p; 544 } 545 546 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 359 // ======== Run time inline methods ================ 547 360 548 361 inline size_t G4VEmProcess::CurrentMaterialCutsCoupleIndex() const … … 563 376 { 564 377 return (*theCutsElectron)[currentCoupleIndex]; 565 }566 567 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....568 569 inline void G4VEmProcess::SetBuildTableFlag(G4bool val)570 {571 buildLambdaTable = val;572 if(!val) integral = false;573 }574 575 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....576 577 inline void G4VEmProcess::SetStartFromNullFlag(G4bool val)578 {579 startFromNull = val;580 }581 582 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....583 584 inline void G4VEmProcess::InitialiseStep(const G4Track& track)585 {586 preStepKinEnergy = track.GetKineticEnergy();587 DefineMaterial(track.GetMaterialCutsCouple());588 SelectModel(preStepKinEnergy, currentCoupleIndex);589 if (theNumberOfInteractionLengthLeft < 0.0) mfpKinEnergy = DBL_MAX;590 378 } 591 379 … … 600 388 mfpKinEnergy = DBL_MAX; 601 389 } 390 } 391 392 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 393 394 inline 395 G4VEmModel* G4VEmProcess::SelectModel(G4double& kinEnergy, size_t index) 396 { 397 currentModel = modelManager->SelectModel(kinEnergy, index); 398 currentModel->SetCurrentCouple(currentCouple); 399 return currentModel; 400 } 401 402 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 403 404 inline 405 G4VEmModel* G4VEmProcess::SelectModelForMaterial(G4double kinEnergy, 406 size_t& idxRegion) const 407 { 408 return modelManager->SelectModel(kinEnergy, idxRegion); 409 } 410 411 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 412 413 inline void G4VEmProcess::InitialiseStep(const G4Track& track) 414 { 415 currentParticle = track.GetDefinition(); 416 preStepKinEnergy = track.GetKineticEnergy(); 417 DefineMaterial(track.GetMaterialCutsCouple()); 418 SelectModel(preStepKinEnergy, currentCoupleIndex); 419 if (theNumberOfInteractionLengthLeft < 0.0) mfpKinEnergy = DBL_MAX; 420 } 421 422 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 423 424 inline G4double G4VEmProcess::GetLambdaFromTable(G4double e) 425 { 426 return (((*theLambdaTable)[currentCoupleIndex])->Value(e)); 427 } 428 429 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 430 431 inline G4double G4VEmProcess::ComputeCurrentLambda(G4double e) 432 { 433 SelectModel(e, currentCoupleIndex); 434 return currentModel->CrossSectionPerVolume(currentMaterial,currentParticle, 435 e,(*theCuts)[currentCoupleIndex]); 436 } 437 438 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 439 440 inline G4double G4VEmProcess::GetCurrentLambda(G4double e) 441 { 442 G4double x = 0.0; 443 if(theLambdaTable) { x = GetLambdaFromTable(e); } 444 else { x = ComputeCurrentLambda(e); } 445 return x; 446 } 447 448 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 449 450 inline G4double G4VEmProcess::GetLambda(G4double& kineticEnergy, 451 const G4MaterialCutsCouple* couple) 452 { 453 DefineMaterial(couple); 454 return GetCurrentLambda(kineticEnergy); 455 } 456 457 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 458 459 inline G4double G4VEmProcess::RecalculateLambda(G4double e, 460 const G4MaterialCutsCouple* couple) 461 { 462 DefineMaterial(couple); 463 return ComputeCurrentLambda(e); 602 464 } 603 465 … … 625 487 } 626 488 627 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 628 629 inline G4double G4VEmProcess::GetLambdaFromTable(G4double e) 630 { 631 return (((*theLambdaTable)[currentCoupleIndex])->Value(e)); 632 } 633 634 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 635 636 inline G4double G4VEmProcess::GetCurrentLambda(G4double e) 637 { 638 G4double x = 0.0; 639 if(theLambdaTable) { x = GetLambdaFromTable(e); } 640 else { x = ComputeCurrentLambda(e); } 641 return x; 642 } 643 644 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 645 646 inline G4double G4VEmProcess::ComputeCurrentLambda(G4double e) 647 { 648 SelectModel(e, currentCoupleIndex); 649 return currentModel->CrossSectionPerVolume(currentMaterial,particle, 650 e,(*theCuts)[currentCoupleIndex]); 489 // ======== Get/Set inline methods used at initialisation ================ 490 491 inline void G4VEmProcess::SetLambdaBinning(G4int nbins) 492 { 493 nLambdaBins = nbins; 494 } 495 496 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 497 498 inline G4int G4VEmProcess::LambdaBinning() const 499 { 500 return nLambdaBins; 501 } 502 503 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 504 505 inline void G4VEmProcess::SetMinKinEnergy(G4double e) 506 { 507 minKinEnergy = e; 508 } 509 510 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 511 512 inline G4double G4VEmProcess::MinKinEnergy() const 513 { 514 return minKinEnergy; 515 } 516 517 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 518 519 inline void G4VEmProcess::SetMaxKinEnergy(G4double e) 520 { 521 maxKinEnergy = e; 522 } 523 524 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 525 526 inline G4double G4VEmProcess::MaxKinEnergy() const 527 { 528 return maxKinEnergy; 529 } 530 531 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 532 533 inline void G4VEmProcess::SetPolarAngleLimit(G4double val) 534 { 535 if(val < 0.0) polarAngleLimit = 0.0; 536 else if(val > pi) polarAngleLimit = pi; 537 else polarAngleLimit = val; 538 } 539 540 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 541 542 inline G4double G4VEmProcess::PolarAngleLimit() const 543 { 544 return polarAngleLimit; 545 } 546 547 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 548 549 inline const G4PhysicsTable* G4VEmProcess::LambdaTable() const 550 { 551 return theLambdaTable; 552 } 553 554 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 555 556 inline const G4ParticleDefinition* G4VEmProcess::Particle() const 557 { 558 return particle; 559 } 560 561 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 562 563 inline const G4ParticleDefinition* G4VEmProcess::SecondaryParticle() const 564 { 565 return secondaryParticle; 566 } 567 568 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 569 570 inline void G4VEmProcess::SetLambdaFactor(G4double val) 571 { 572 if(val > 0.0 && val <= 1.0) { lambdaFactor = val; } 573 } 574 575 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 576 577 inline void G4VEmProcess::SetIntegral(G4bool val) 578 { 579 if(particle && particle != theGamma) { integral = val; } 580 if(integral) { buildLambdaTable = true; } 581 } 582 583 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 584 585 inline G4bool G4VEmProcess::IsIntegral() const 586 { 587 return integral; 588 } 589 590 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 591 592 inline void G4VEmProcess::SetApplyCuts(G4bool val) 593 { 594 applyCuts = val; 595 } 596 597 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 598 599 inline void G4VEmProcess::SetBuildTableFlag(G4bool val) 600 { 601 buildLambdaTable = val; 602 if(!val) { integral = false; } 603 } 604 605 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 606 607 inline G4ParticleChangeForGamma* G4VEmProcess::GetParticleChange() 608 { 609 return &fParticleChange; 610 } 611 612 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 613 614 inline void G4VEmProcess::SetParticle(const G4ParticleDefinition* p) 615 { 616 particle = p; 617 currentParticle = p; 618 } 619 620 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 621 622 inline void G4VEmProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 623 { 624 secondaryParticle = p; 625 } 626 627 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 628 629 inline void G4VEmProcess::SetStartFromNullFlag(G4bool val) 630 { 631 startFromNull = val; 651 632 } 652 633
Note: See TracChangeset
for help on using the changeset viewer.