- Timestamp:
- Apr 17, 2009, 12:17:14 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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.