- Timestamp:
- Apr 20, 2009, 4:53:50 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh
r991 r1005 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VMultipleScattering.hh,v 1.5 4 2008/07/31 13:01:26vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-02 $26 // $Id: G4VMultipleScattering.hh,v 1.55 2009/02/18 12:19:33 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-02-ref-02 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 145 145 G4bool ascii); 146 146 147 //------------------------------------------------------------------------148 // Specific methods for msc processes149 //------------------------------------------------------------------------150 151 147 // The function overloads the corresponding function of the base 152 148 // class.It limits the step near to boundaries only 153 149 // and invokes the method GetMscContinuousStepLimit at every step. 154 virtualG4double AlongStepGetPhysicalInteractionLength(150 G4double AlongStepGetPhysicalInteractionLength( 155 151 const G4Track&, 156 152 G4double previousStepSize, … … 192 188 inline G4PhysicsTable* LambdaTable() const; 193 189 194 //------------------------------------------------------------------------ 195 // Define and access particle type 196 //------------------------------------------------------------------------ 197 190 // access particle type 198 191 inline const G4ParticleDefinition* Particle() const; 199 inline void SetParticle(const G4ParticleDefinition*);200 192 201 193 //------------------------------------------------------------------------ … … 203 195 //------------------------------------------------------------------------ 204 196 205 inline void AddEmModel(G4int, G4VEmModel*, const G4Region* region = 0); 206 197 protected: 198 // Select model in run time 199 inline G4VEmModel* SelectModel(G4double kinEnergy); 200 201 public: 202 // Select model in run time 207 203 inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy, 208 204 size_t& idxRegion) const; 209 205 210 // Access to models 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 211 211 inline G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false); 212 212 213 213 //------------------------------------------------------------------------ 214 // Set parameters for simulation of multiple scattering 215 //------------------------------------------------------------------------ 216 214 // Get/Set parameters for simulation of multiple scattering 215 //------------------------------------------------------------------------ 216 217 inline G4bool LateralDisplasmentFlag() const; 217 218 inline void SetLateralDisplasmentFlag(G4bool val); 218 219 220 inline G4double Skin() const; 219 221 inline void SetSkin(G4double val); 220 222 223 inline G4double RangeFactor() const; 221 224 inline void SetRangeFactor(G4double val); 222 225 226 inline G4double GeomFactor() const; 223 227 inline void SetGeomFactor(G4double val); 224 228 229 inline G4double PolarAngleLimit() const; 225 230 inline void SetPolarAngleLimit(G4double val); 226 231 232 inline G4MscStepLimitType StepLimitType() const; 227 233 inline void SetStepLimitType(G4MscStepLimitType val); 234 235 //------------------------------------------------------------------------ 236 // Run time methods 237 //------------------------------------------------------------------------ 228 238 229 239 protected: … … 233 243 G4double, 234 244 G4ForceCondition* condition); 235 236 //------------------------------------------------------------------------237 // Run time methods238 //------------------------------------------------------------------------239 245 240 246 // This method is not used for tracking, it returns step limit … … 253 259 G4double& currentSafety); 254 260 255 inline G4VEmModel* SelectModel(G4double kinEnergy);256 // Select concrete model257 258 inline const G4MaterialCutsCouple* CurrentMaterialCutsCouple() const;259 260 261 // define current material 261 262 inline void DefineMaterial(const G4MaterialCutsCouple* couple); 262 263 263 //------------------------------------------------------------------------ 264 // Access parameters of multiple scattering 265 //------------------------------------------------------------------------ 264 inline const G4MaterialCutsCouple* CurrentMaterialCutsCouple() const; 266 265 267 266 inline G4ParticleChangeForMSC* GetParticleChange(); 268 267 269 inline G4double Skin() const;270 271 inline G4double RangeFactor() const;272 273 inline G4double GeomFactor() const;274 275 inline G4double PolarAngleLimit() const;276 277 inline G4MscStepLimitType StepLimitType() const;278 279 inline G4bool LateralDisplasmentFlag() const;280 268 281 269 private: 282 270 283 271 // hide assignment operator 284 285 272 G4VMultipleScattering(G4VMultipleScattering &); 286 273 G4VMultipleScattering & operator=(const G4VMultipleScattering &right); … … 330 317 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 331 318 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() const 339 { 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() const 353 { 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() const 367 { 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() const 381 { 382 return theLambdaTable; 383 } 384 385 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 386 387 inline const G4ParticleDefinition* G4VMultipleScattering::Particle() const 388 { 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) const 413 { 414 return modelManager->SelectModel(kinEnergy, idxRegion); 415 } 416 417 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 418 332 419 inline 333 void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* couple) 334 { 335 if(couple != currentCouple) { 336 currentCouple = couple; 337 currentMaterialIndex = couple->GetIndex(); 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); 338 525 } 526 if(x > DBL_MIN) x = 1./x; 527 else x = DBL_MAX; 528 return x; 339 529 } 340 530 … … 364 554 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 365 555 366 inline G4double G4VMultipleScattering::ContinuousStepLimit(367 const G4Track& track,368 G4double previousStepSize,369 G4double currentMinimalStep,370 G4double& currentSafety)371 {372 return GetMscContinuousStepLimit(track,previousStepSize,currentMinimalStep,373 currentSafety);374 }375 376 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....377 378 556 inline 379 G4double G4VMultipleScattering::GetLambda(const G4ParticleDefinition* p, 380 G4double& e) 381 { 382 G4double x; 383 if(theLambdaTable) { 384 G4bool b; 385 x = ((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b); 386 } else { 387 x = currentModel->CrossSection(currentCouple,p,e); 557 void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* couple) 558 { 559 if(couple != currentCouple) { 560 currentCouple = couple; 561 currentMaterialIndex = couple->GetIndex(); 388 562 } 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 563 } 564 565 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 566 567 inline const G4MaterialCutsCouple* 568 G4VMultipleScattering::CurrentMaterialCutsCouple() const 571 569 { 572 570 return currentCouple; … … 575 573 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 576 574 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); 575 inline G4ParticleChangeForMSC* G4VMultipleScattering::GetParticleChange() 576 { 577 return &fParticleChange; 591 578 } 592 579
Note: See TracChangeset
for help on using the changeset viewer.