Ignore:
Timestamp:
Apr 20, 2009, 5:54:05 PM (15 years ago)
Author:
garnier
Message:

update to geant4.9.2

Location:
trunk/source/processes/electromagnetic/utils/include
Files:
25 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/processes/electromagnetic/utils/include/G4DummyModel.hh

    r961 r1007  
    2525//
    2626// $Id: G4DummyModel.hh,v 1.3 2007/05/22 17:31:57 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929// -------------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4ElectronIonPair.hh

    r966 r1007  
    2525//
    2626// $Id: G4ElectronIonPair.hh,v 1.2 2008/10/17 14:46:16 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929//
  • trunk/source/processes/electromagnetic/utils/include/G4EmCalculator.hh

    r961 r1007  
    2525//
    2626// $Id: G4EmCalculator.hh,v 1.18 2007/03/15 12:34:46 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929//
  • trunk/source/processes/electromagnetic/utils/include/G4EmConfigurator.hh

    r966 r1007  
    2525//
    2626// $Id: G4EmConfigurator.hh,v 1.2 2008/11/21 12:30:29 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929// -------------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4EmCorrections.hh

    r961 r1007  
    2525//
    2626// $Id: G4EmCorrections.hh,v 1.24 2008/09/12 14:44:48 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929// -------------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4EmElementSelector.hh

    r966 r1007  
    2525//
    2626// $Id: G4EmElementSelector.hh,v 1.2 2008/07/22 15:55:15 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929// -------------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4EmModelManager.hh

    r961 r1007  
    2525//
    2626// $Id: G4EmModelManager.hh,v 1.25 2008/10/13 14:56:56 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929// -------------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4EmMultiModel.hh

    r961 r1007  
    2525//
    2626// $Id: G4EmMultiModel.hh,v 1.6 2007/05/22 17:31:57 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929// -------------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4EmProcessOptions.hh

    r1005 r1007  
    2424// ********************************************************************
    2525//
    26 // $Id: G4EmProcessOptions.hh,v 1.15 2009/02/18 14:40:10 vnivanch 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 $
    2828//
    2929//
     
    107107  void SetLinearLossLimit(G4double val);
    108108
    109   void ActivateDeexcitation(const G4String& proc, G4bool val,
    110                             const G4String& reg = "");
     109  void ActivateDeexcitation(G4bool val, const G4Region* r = 0);
    111110
    112111  void SetMscStepLimitation(G4MscStepLimitType val);
  • trunk/source/processes/electromagnetic/utils/include/G4EmProcessSubType.hh

    r966 r1007  
    2626//
    2727// $Id: G4EmProcessSubType.hh,v 1.9 2008/12/18 13:01:42 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     28// GEANT4 tag $Name: geant4-09-02 $
    2929//
    3030//---------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4EmSaturation.hh

    r966 r1007  
    2525//
    2626// $Id: G4EmSaturation.hh,v 1.6 2008/03/17 11:27:32 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929//
  • trunk/source/processes/electromagnetic/utils/include/G4EmTableType.hh

    r961 r1007  
    2626//
    2727// $Id: G4EmTableType.hh,v 1.4 2008/10/13 14:56:56 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     28// GEANT4 tag $Name: geant4-09-02 $
    2929//
    3030//---------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4EnergyLossMessenger.hh

    r1005 r1007  
    2525//
    2626//
    27 // $Id: G4EnergyLossMessenger.hh,v 1.23 2009/02/18 14:40:10 vnivanch 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 $
    2929//
    3030// -------------------------------------------------------------------
     
    107107  G4UIcmdWithADouble*        MinSubSecCmd;
    108108  G4UIcommand*               StepFuncCmd;
    109   G4UIcommand*               deexCmd;
    110109  G4UIcmdWithAString*        mscCmd;
    111110  G4UIcmdWithADoubleAndUnit* MinEnCmd;
  • trunk/source/processes/electromagnetic/utils/include/G4EnergyLossTables.hh

    r961 r1007  
    2626//
    2727// $Id: G4EnergyLossTables.hh,v 1.19 2006/06/29 19:54:35 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     28// GEANT4 tag $Name: geant4-09-02 $
    2929//
    3030// $Id:
  • trunk/source/processes/electromagnetic/utils/include/G4LossTableBuilder.hh

    r961 r1007  
    2525//
    2626// $Id: G4LossTableBuilder.hh,v 1.8 2008/07/22 15:55:15 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929//
  • trunk/source/processes/electromagnetic/utils/include/G4LossTableManager.hh

    r961 r1007  
    2525//
    2626// $Id: G4LossTableManager.hh,v 1.53 2008/07/15 16:56:38 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929//
  • trunk/source/processes/electromagnetic/utils/include/G4MscStepLimitType.hh

    r961 r1007  
    2626//
    2727// $Id: G4MscStepLimitType.hh,v 1.2 2007/06/11 14:56:51 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     28// GEANT4 tag $Name: geant4-09-02 $
    2929//
    3030//---------------------------------------------------------------
  • trunk/source/processes/electromagnetic/utils/include/G4VEmFluctuationModel.hh

    r1005 r1007  
    2424// ********************************************************************
    2525//
    26 // $Id: G4VEmFluctuationModel.hh,v 1.12 2009/02/19 11:25:50 vnivanch 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 $
    2828//
    2929// -------------------------------------------------------------------
     
    101101  //------------------------------------------------------------------------
    102102
    103   inline G4String GetName() const;
     103  G4String GetName() const;
    104104
    105105private:
     
    115115//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    116116
     117inline void G4VEmFluctuationModel::InitialiseMe(const G4ParticleDefinition*)
     118{}
     119
     120inline
     121void G4VEmFluctuationModel::SetParticleAndCharge(const G4ParticleDefinition*,
     122                                                 G4double)
     123{}
     124
    117125inline G4String G4VEmFluctuationModel::GetName() const
    118126{
  • trunk/source/processes/electromagnetic/utils/include/G4VEmModel.hh

    r1005 r1007  
    2424// ********************************************************************
    2525//
    26 // $Id: G4VEmModel.hh,v 1.66 2009/02/19 09:57:36 vnivanch 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 $
    2828//
    2929// -------------------------------------------------------------------
     
    6565// 12-09-08 Added methods GetParticleCharge, GetChargeSquareRatio,
    6666//          CorrectionsAlongStep, ActivateNuclearStopping (VI)
    67 // 16-02-09 Move implementations of virtual methods to source (VI)
    6867//
    6968// Class Description:
     
    121120  //------------------------------------------------------------------------
    122121
     122  // dEdx per unit length
     123  virtual G4double ComputeDEDX(const G4MaterialCutsCouple*,
     124                               const G4ParticleDefinition*,
     125                               G4double kineticEnergy,
     126                               G4double cutEnergy = DBL_MAX);
     127
    123128  // main method to compute dEdx
    124129  virtual G4double ComputeDEDXPerVolume(const G4Material*,
     
    126131                                        G4double kineticEnergy,
    127132                                        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);
    128140
    129141  // main method to compute cross section per Volume
     
    163175                                    G4double length);
    164176
    165   // sample PIXE deexcitation
    166   virtual void SampleDeexcitationAlongStep(const G4Material*,
    167                                            const G4Track&,
    168                                            G4double& eloss);
    169 
    170177protected:
    171178
     
    205212                                  const G4DataVector&);
    206213
    207   // dEdx per unit length
    208   inline G4double ComputeDEDX(const G4MaterialCutsCouple*,
    209                               const G4ParticleDefinition*,
    210                               G4double kineticEnergy,
    211                               G4double cutEnergy = DBL_MAX);
    212 
    213   // cross section per volume
    214   inline G4double CrossSection(const G4MaterialCutsCouple*,
    215                                 const G4ParticleDefinition*,
    216                                 G4double kineticEnergy,
    217                                 G4double cutEnergy = 0.0,
    218                                 G4double maxEnergy = DBL_MAX);
    219 
    220214  // compute mean free path via cross section per volume
    221   inline G4double ComputeMeanFreePath(const G4ParticleDefinition*,
    222                                       G4double kineticEnergy,
    223                                       const G4Material*,   
    224                                       G4double cutEnergy = 0.0,
    225                                       G4double maxEnergy = DBL_MAX);
     215  G4double ComputeMeanFreePath(const G4ParticleDefinition*,
     216                               G4double kineticEnergy,
     217                               const G4Material*,   
     218                               G4double cutEnergy = 0.0,
     219                               G4double maxEnergy = DBL_MAX);
    226220
    227221  // generic cross section per element
     
    239233                                           G4double maxEnergy = DBL_MAX);
    240234
    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
    242237  inline const G4Element* SelectRandomAtom(const G4Material*,
    243238                                           const G4ParticleDefinition*,
     
    265260  inline G4bool LPMFlag() const;
    266261
    267   inline G4bool DeexcitationFlag() const;
    268 
    269262  inline void SetHighEnergyLimit(G4double);
    270263
     
    277270  inline void SetLPMFlag(G4bool val);
    278271
    279   inline void SetDeexcitationFlag(G4bool val);
    280 
    281272  inline void ActivateNuclearStopping(G4bool);
    282273
     
    287278  inline void SetParticleChange(G4VParticleChange*, G4VEmFluctuationModel*);
    288279
    289   inline void SetCurrentCouple(const G4MaterialCutsCouple*);
    290 
    291280protected:
    292281
    293   inline const G4MaterialCutsCouple* CurrentCouple() const;
     282  inline const G4Element* GetCurrentElement() const;
    294283
    295284  inline void SetCurrentElement(const G4Element*);
    296 
    297   inline const G4Element* GetCurrentElement() const;
    298285
    299286private:
     
    328315private:
    329316
    330   const G4MaterialCutsCouple* currentCouple;
    331   const G4Element*            currentElement;
    332 
     317  const G4Element* currentElement;
    333318  G4int                  nsec;
    334   G4bool                 flagDeexcitation;
    335319  std::vector<G4double>  xsec;
    336320
     
    340324//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    341325
    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;
     326inline G4double G4VEmModel::HighEnergyLimit() const
     327{
     328  return highLimit;
     329}
     330
     331//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     332
     333inline G4double G4VEmModel::LowEnergyLimit() const
     334{
     335  return lowLimit;
     336}
     337
     338//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     339
     340inline G4double G4VEmModel::PolarAngleLimit() const
     341{
     342  return polarAngleLimit;
     343}
     344
     345//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     346
     347inline G4double G4VEmModel::SecondaryThreshold() const
     348{
     349  return secondaryThreshold;
     350}
     351
     352//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     353
     354inline G4bool G4VEmModel::LPMFlag() const
     355{
     356  return theLPMflag;
     357}
     358
     359//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     360
     361inline void G4VEmModel::SetHighEnergyLimit(G4double val)
     362{
     363  highLimit = val;
     364}
     365
     366//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     367
     368inline void G4VEmModel::SetLowEnergyLimit(G4double val)
     369{
     370  lowLimit = val;
     371}
     372
     373//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     374
     375inline void G4VEmModel::SetPolarAngleLimit(G4double val)
     376{
     377  polarAngleLimit = val;
     378}
     379
     380//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     381
     382inline void G4VEmModel::SetSecondaryThreshold(G4double val)
     383{
     384  secondaryThreshold = val;
     385}
     386
     387//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     388
     389inline void G4VEmModel::SetLPMFlag(G4bool val)
     390{
     391  theLPMflag = val;
     392}
     393
     394//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     395
     396inline void G4VEmModel::ActivateNuclearStopping(G4bool val)
     397{
     398  nuclearStopping = val;
    375399}
    376400
     
    391415//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    392416
     417inline 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
     427inline G4VEmFluctuationModel* G4VEmModel::GetModelOfFluctuations()
     428{
     429  return fluc;
     430}
     431
     432//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     433
     434inline G4double G4VEmModel::MinEnergyCut(const G4ParticleDefinition*,
     435                                         const G4MaterialCutsCouple*)
     436{
     437  return 0.0;
     438}
     439
     440//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     441
     442inline 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
     451inline G4double G4VEmModel::GetParticleCharge(const G4ParticleDefinition* p,
     452                                              const G4Material*, G4double)
     453{
     454  return p->GetPDGCharge();
     455}
     456
     457//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     458
     459inline void G4VEmModel::CorrectionsAlongStep(const G4MaterialCutsCouple*,
     460                                             const G4DynamicParticle*,
     461                                             G4double&,G4double&,G4double)
     462{}
     463
     464//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     465
     466inline G4double G4VEmModel::ComputeDEDXPerVolume(const G4Material*,
     467                                                 const G4ParticleDefinition*,
     468                                                 G4double,G4double)
     469{
     470  return 0.0;
     471}
     472
     473//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     474
     475inline 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
     485inline 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
     497inline 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
    393507inline
    394508const G4Element* G4VEmModel::SelectRandomAtom(const G4MaterialCutsCouple* couple,
     
    398512                                              G4double maxEnergy)
    399513{
    400   currentCouple = couple;
    401514  if(nSelectors > 0) {
    402515    currentElement =
     
    458571//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    459572
    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;
     573inline const G4Element* G4VEmModel::GetCurrentElement() const
     574{
     575  return currentElement;
     576}
     577
     578//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     579
     580inline void G4VEmModel::SetCurrentElement(const G4Element* elm)
     581{
     582  currentElement = elm;
    554583}
    555584
     
    565594//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    566595
     596inline G4double G4VEmModel::MaxSecondaryEnergy(const G4ParticleDefinition*,
     597                                               G4double kineticEnergy)
     598{
     599  return kineticEnergy;
     600}
     601
     602//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     603
    567604inline const G4String& G4VEmModel::GetName() const
    568605{
     
    571608
    572609//....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
     613inline void G4VEmModel::SampleScattering(const G4DynamicParticle*, G4double)
     614{}
     615
     616//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     617
     618inline G4double G4VEmModel::ComputeTruePathLengthLimit(
     619                                const G4Track&,
     620                                G4PhysicsTable*,
     621                                G4double)
     622{
     623  return DBL_MAX;
     624}
     625
     626//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     627
     628inline G4double G4VEmModel::ComputeGeomPathLength(G4double truePathLength)
     629{
     630  return truePathLength;
     631}
     632
     633//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     634
     635inline G4double G4VEmModel::ComputeTrueStepLength(G4double geomPathLength)
     636{
     637  return geomPathLength;
     638}
     639
     640//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     641
     642inline void G4VEmModel::DefineForRegion(const G4Region*)
     643{}
     644
     645//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     646
     647inline void G4VEmModel::SetupForMaterial(const G4ParticleDefinition*,
     648                                         const G4Material*, G4double)
     649{}
    608650
    609651//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
  • trunk/source/processes/electromagnetic/utils/include/G4VEmProcess.hh

    r1005 r1007  
    2424// ********************************************************************
    2525//
    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 $
    2828//
    2929// -------------------------------------------------------------------
     
    108108
    109109  //------------------------------------------------------------------------
    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
    111118  //------------------------------------------------------------------------
    112119
    113120public:
     121
     122  void PrintInfoDefinition();
     123
     124  G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);
    114125
    115126  // Initialise for build of tables
     
    118129  // Build physics table during initialisation
    119130  void BuildPhysicsTable(const G4ParticleDefinition&);
    120 
    121   void PrintInfoDefinition();
    122 
    123   // implementation of virtual method, specific for G4VEmProcess
    124   G4double PostStepGetPhysicalInteractionLength(
    125                              const G4Track& track,
    126                              G4double   previousStepSize,
    127                              G4ForceCondition* condition
    128                             );
    129 
    130   // implementation of virtual method, specific for G4VEmProcess
    131   G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);
    132131
    133132  // Store PhysicsTable in a file.
     
    146145                              G4bool ascii);
    147146
    148   // deexcitation activated per G4Region
    149   void ActivateDeexcitation(G4bool, const G4Region* r = 0);
    150 
    151147  //------------------------------------------------------------------------
    152148  // Specific methods for Discrete EM post step simulation
     
    156152  G4double CrossSectionPerVolume(G4double kineticEnergy,
    157153                                 const G4MaterialCutsCouple* couple);
     154
     155  // implementation of virtual method
     156  virtual G4double PostStepGetPhysicalInteractionLength(
     157                             const G4Track& track,
     158                             G4double   previousStepSize,
     159                             G4ForceCondition* condition
     160                            );
    158161
    159162  // It returns the cross section of the process per atom
     
    164167  inline G4double MeanFreePath(const G4Track& track);
    165168
     169  inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy,
     170                                            size_t& idxRegion) const;
     171
    166172  // It returns cross section per volume
    167173  inline G4double GetLambda(G4double& kinEnergy,
     
    197203
    198204  //------------------------------------------------------------------------
    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);
    210210   
    211   // Add model for region, smaller value of order defines which
    212   // model will be selected for a given energy interval 
    213   inline void AddEmModel(G4int, G4VEmModel*, const G4Region* region = 0);
    214 
    215211  // Assign a model to a process
    216   inline void SetModel(G4VEmModel*, G4int index = 1);
     212  inline void SetModel(G4VEmModel*);
    217213 
    218214  // return the assigned model
    219   inline G4VEmModel* Model(G4int index = 1);
     215  inline G4VEmModel* Model();
    220216   
    221217  // Define new energy range for the model identified by the name
     
    225221  inline G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false);
    226222
     223  //------------------------------------------------------------------------
     224  // Get/set parameters used for simulation of energy loss
     225  //------------------------------------------------------------------------
     226
     227  inline void ActivateDeexcitation(G4bool, const G4Region* r = 0);
     228
    227229  inline void SetLambdaFactor(G4double val);
    228230
     
    231233
    232234  inline void SetApplyCuts(G4bool val);
    233 
    234   //------------------------------------------------------------------------
    235   // Other generic methods
    236   //------------------------------------------------------------------------
    237235 
    238236protected:
     
    244242  G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*);
    245243
    246   inline G4double RecalculateLambda(G4double kinEnergy,
    247                                     const G4MaterialCutsCouple* couple);
    248 
    249244  inline G4ParticleChangeForGamma* GetParticleChange();
    250245
     
    253248  inline void SetSecondaryParticle(const G4ParticleDefinition* p);
    254249
     250  inline G4VEmModel* SelectModel(G4double& kinEnergy);
     251
    255252  inline size_t CurrentMaterialCutsCoupleIndex() const;
    256253
     
    283280  inline G4double ComputeCurrentLambda(G4double kinEnergy);
    284281
    285   // copy constructor and hide assignment operator
     282  // hide  assignment operator
     283
    286284  G4VEmProcess(G4VEmProcess &);
    287285  G4VEmProcess & operator=(const G4VEmProcess &right);
     
    299297  // ======== Parameters of the class fixed at initialisation =======
    300298
    301   std::vector<G4VEmModel*>     emModels;
    302 
    303299  // tables and vectors
    304300  G4PhysicsTable*              theLambdaTable;
     
    321317  G4bool                       applyCuts;
    322318  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;
    328323
    329324  // ======== Cashed values - may be state dependent ================
     
    337332  std::vector<G4DynamicParticle*> secParticles;
    338333
    339   G4VEmModel*                  currentModel; 
     334  G4VEmModel*                  selectedModel; 
    340335
    341336  const G4ParticleDefinition*  particle;
     
    353348
    354349//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    355 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    356 
    357 inline G4double G4VEmProcess::ComputeCrossSectionPerAtom(
    358                  G4double kineticEnergy, G4double Z, G4double A, G4double cut)
    359 {
    360   SelectModel(kineticEnergy);
    361   G4double x = 0.0;
    362   if(currentModel) {
    363    x = currentModel->ComputeCrossSectionPerAtom(particle,kineticEnergy,
    364                                                  Z,A,cut);
    365   }
    366   return x;
    367 }
    368 
    369 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    370 
    371 inline G4double G4VEmProcess::MeanFreePath(const G4Track& track)
    372 {
    373   DefineMaterial(track.GetMaterialCutsCouple());
    374   preStepLambda = GetCurrentLambda(track.GetKineticEnergy());
    375   G4double x = DBL_MAX;
    376   if(DBL_MIN < preStepLambda) x = 1.0/preStepLambda;
    377   return x;
    378 }
    379 
    380 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    381 
    382 inline G4double G4VEmProcess::GetLambda(G4double& kineticEnergy,
    383                                         const G4MaterialCutsCouple* couple)
    384 {
    385   DefineMaterial(couple);
    386   return GetCurrentLambda(kineticEnergy);
    387 }
    388 
    389 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    390 
    391 inline void G4VEmProcess::SetLambdaBinning(G4int nbins)
    392 {
    393   nLambdaBins = nbins;
    394 }
    395 
    396 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    397 
    398 inline G4int G4VEmProcess::LambdaBinning() const
    399 {
    400   return nLambdaBins;
    401 }
    402 
    403 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    404 
    405 inline void G4VEmProcess::SetMinKinEnergy(G4double e)
    406 {
    407   minKinEnergy = e;
    408 }
    409 
    410 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    411 
    412 inline G4double G4VEmProcess::MinKinEnergy() const
    413 {
    414   return minKinEnergy;
    415 }
    416 
    417 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    418 
    419 inline void G4VEmProcess::SetMaxKinEnergy(G4double e)
    420 {
    421   maxKinEnergy = e;
    422 }
    423 
    424 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    425 
    426 inline G4double G4VEmProcess::MaxKinEnergy() const
    427 {
    428   return maxKinEnergy;
    429 }
    430 
    431 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    432 
    433 inline void G4VEmProcess::SetPolarAngleLimit(G4double val)
    434 {
    435   if(val < 0.0)     polarAngleLimit = 0.0;
    436   else if(val > pi) polarAngleLimit = pi;
    437   else              polarAngleLimit = val;
    438 }
    439 
    440 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    441 
    442 inline G4double G4VEmProcess::PolarAngleLimit() const
    443 {
    444   return polarAngleLimit;
    445 }
    446 
    447 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    448 
    449 inline const G4PhysicsTable* G4VEmProcess::LambdaTable() const
    450 {
    451   return theLambdaTable;
    452 }
    453 
    454 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    455 
    456 inline const G4ParticleDefinition* G4VEmProcess::Particle() const
    457 {
    458   return particle;
    459 }
    460 
    461 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    462 
    463 inline const G4ParticleDefinition* G4VEmProcess::SecondaryParticle() const
    464 {
    465   return secondaryParticle;
    466 }
    467 
    468 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    469 
    470 inline void G4VEmProcess::SelectModel(G4double& kinEnergy)
    471 {
    472   currentModel = modelManager->SelectModel(kinEnergy, currentMaterialIndex);
    473   currentModel->SetCurrentCouple(currentCouple);
    474 }
    475 
    476 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    477 
    478 inline G4VEmModel* G4VEmProcess::SelectModelForMaterial(
    479                                    G4double kinEnergy, size_t& idxRegion) const
    480 {
    481   return modelManager->SelectModel(kinEnergy, idxRegion);
    482 }
    483 
    484 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    485 
    486 inline void G4VEmProcess::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() const
    545 {
    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() const
    589 {
    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 
    631350//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    632351
     
    639358    mfpKinEnergy = DBL_MAX;
    640359  }
     360}
     361
     362//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     363
     364inline 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
     373inline 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
     382inline 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
     392inline 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
     401inline 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
     413inline G4double G4VEmProcess::GetLambdaFromTable(G4double e)
     414{
     415  G4bool b;
     416  return (((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b));
    641417}
    642418
     
    666442//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    667443
    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);
     444inline 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;
    681450  return x;
    682451}
     
    684453//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    685454
    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;
     455inline G4VEmModel* G4VEmProcess::SelectModel(G4double& kinEnergy)
     456{
     457  return modelManager->SelectModel(kinEnergy, currentMaterialIndex);
     458}
     459
     460//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     461
     462inline 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
     470inline const G4ParticleDefinition* G4VEmProcess::Particle() const
     471{
     472  return particle;
     473}
     474
     475//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     476
     477inline const G4ParticleDefinition* G4VEmProcess::SecondaryParticle() const
     478{
     479  return secondaryParticle;
     480}
     481
     482//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     483
     484inline G4double G4VEmProcess::GetGammaEnergyCut()
     485{
     486  return (*theCutsGamma)[currentMaterialIndex];
     487}
     488
     489//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     490
     491inline G4double G4VEmProcess::GetElectronEnergyCut()
     492{
     493  return (*theCutsElectron)[currentMaterialIndex];
     494}
     495
     496//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     497
     498inline void G4VEmProcess::SetLambdaFactor(G4double val)
     499{
     500  if(val > 0.0 && val <= 1.0) lambdaFactor = val;
     501}
     502
     503//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     504
     505inline G4VEmModel* G4VEmProcess::GetModelByIndex(G4int idx, G4bool ver)
     506{
     507  return modelManager->GetModel(idx, ver);
     508}
     509
     510//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     511
     512inline G4ParticleChangeForGamma* G4VEmProcess::GetParticleChange()
     513{
     514  return &fParticleChange;
     515}
     516
     517//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     518
     519inline void G4VEmProcess::SetParticle(const G4ParticleDefinition* p)
     520{
     521  particle = p;
     522}
     523
     524//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     525
     526inline void G4VEmProcess::SetSecondaryParticle(const G4ParticleDefinition* p)
     527{
     528  secondaryParticle = p;
     529}
     530
     531//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     532
     533inline 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
     543inline void G4VEmProcess::SetModel(G4VEmModel* model)
     544{
     545  selectedModel = model;
     546}
     547
     548//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     549
     550inline G4VEmModel* G4VEmProcess::Model()
     551{
     552  return selectedModel;
     553}
     554
     555//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     556
     557inline 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
     565inline 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
     574inline void G4VEmProcess::SetLambdaBinning(G4int nbins)
     575{
     576  nLambdaBins = nbins;
     577}
     578
     579//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     580
     581inline G4int G4VEmProcess::LambdaBinning() const
     582{
     583  return nLambdaBins;
     584}
     585
     586//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     587
     588inline void G4VEmProcess::SetMinKinEnergy(G4double e)
     589{
     590  minKinEnergy = e;
     591}
     592
     593//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     594
     595inline G4double G4VEmProcess::MinKinEnergy() const
     596{
     597  return minKinEnergy;
     598}
     599
     600//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     601
     602inline void G4VEmProcess::SetMaxKinEnergy(G4double e)
     603{
     604  maxKinEnergy = e;
     605}
     606
     607//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     608
     609inline G4double G4VEmProcess::MaxKinEnergy() const
     610{
     611  return maxKinEnergy;
     612}
     613
     614//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     615
     616inline 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
     625inline G4double G4VEmProcess::PolarAngleLimit() const
     626{
     627  return polarAngleLimit;
     628}
     629
     630//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     631
     632inline void G4VEmProcess::ActivateDeexcitation(G4bool, const G4Region*)
     633{}
     634
     635//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     636
     637inline const G4PhysicsTable* G4VEmProcess::LambdaTable() const
     638{
     639  return theLambdaTable;
     640}
     641
     642//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     643
     644inline 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
     652inline G4bool G4VEmProcess::IsIntegral() const
     653{
     654  return integral;
     655}
     656
     657//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     658
     659inline void G4VEmProcess::SetBuildTableFlag(G4bool val)
     660{
     661  buildLambdaTable = val;
     662  if(!val) integral = false;
     663}
     664
     665//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     666
     667inline void G4VEmProcess::SetStartFromNullFlag(G4bool val)
     668{
     669  startFromNull = val;
     670}
     671
     672//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     673
     674inline void G4VEmProcess::SetApplyCuts(G4bool val)
     675{
     676  applyCuts = val;
     677}
     678
     679//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     680
     681inline size_t G4VEmProcess::CurrentMaterialCutsCoupleIndex() const
     682{
     683  return currentMaterialIndex;
    695684}
    696685
  • trunk/source/processes/electromagnetic/utils/include/G4VEnergyLoss.hh

    r961 r1007  
    2626//
    2727// $Id: G4VEnergyLoss.hh,v 1.18 2006/06/29 19:54:47 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     28// GEANT4 tag $Name: geant4-09-02 $
    2929//
    3030//
  • trunk/source/processes/electromagnetic/utils/include/G4VEnergyLossProcess.hh

    r1005 r1007  
    2424// ********************************************************************
    2525//
    26 // $Id: G4VEnergyLossProcess.hh,v 1.86 2009/02/19 09:57:36 vnivanch Exp $
     26// $Id: G4VEnergyLossProcess.hh,v 1.83 2008/09/12 16:19:01 vnivanch Exp $
    2727// GEANT4 tag $Name:
    2828//
     
    126126  virtual ~G4VEnergyLossProcess();
    127127
    128 private:
    129   // clean vectors and arrays
    130   void Clean();
    131 
    132128  //------------------------------------------------------------------------
    133129  // Virtual methods to be implemented in concrete processes
    134130  //------------------------------------------------------------------------
    135131
    136 public:
    137132  virtual G4bool IsApplicable(const G4ParticleDefinition& p) = 0;
    138133 
     
    148143  //------------------------------------------------------------------------
    149144
     145protected:
     146
    150147  virtual G4double MinPrimaryEnergy(const G4ParticleDefinition*,
    151148                                    const G4Material*, G4double cut);
    152149
    153150  //------------------------------------------------------------------------
    154   // Virtual methods implementation common to all EM ContinuousDiscrete
    155   // processes. Further inheritance is not assumed
     151  // Virtual methods common to all EM ContinuousDiscrete processes
     152  // Further inheritance is not assumed
    156153  //------------------------------------------------------------------------
    157154
    158155public:
    159156
    160   // prepare all tables
     157  void PrintInfoDefinition();
     158
    161159  void PreparePhysicsTable(const G4ParticleDefinition&);
    162160
    163   // build all tables
    164161  void BuildPhysicsTable(const G4ParticleDefinition&);
    165162
    166   // build a table
    167   G4PhysicsTable* BuildDEDXTable(G4EmTableType tType = fRestricted);
    168 
    169   // build a table
    170   G4PhysicsTable* BuildLambdaTable(G4EmTableType tType = fRestricted);
    171 
    172   // summary printout after initialisation
    173   void PrintInfoDefinition();
    174 
    175   // Add subcutoff option for the region
    176   void ActivateSubCutoff(G4bool val, const G4Region* region = 0);
    177 
    178   // Activate deexcitation code for region
    179   void ActivateDeexcitation(G4bool, const G4Region* region = 0);
    180 
    181   // Step limit from AlongStep
    182163  G4double AlongStepGetPhysicalInteractionLength(const G4Track&,
    183164                                                 G4double  previousStepSize,
     
    186167                                                 G4GPILSelection* selection);
    187168
    188   // Step limit from cross section
    189169  G4double PostStepGetPhysicalInteractionLength(const G4Track& track,
    190170                                                G4double   previousStepSize,
    191171                                                G4ForceCondition* condition);
    192172
    193   // AlongStep computations
    194173  G4VParticleChange* AlongStepDoIt(const G4Track&, const G4Step&);
    195174
    196   // Sampling of secondaries in vicinity of geometrical boundary
    197   void SampleSubCutSecondaries(std::vector<G4Track*>&, const G4Step&,
    198                                G4VEmModel* model, G4int matIdx,
    199                                G4double& extraEdep);
    200 
    201   // PostStep sampling of secondaries
    202175  G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);
    203176
    204   // Store all PhysicsTable in files.
    205   // Return false in case of any fatal failure at I/O 
     177  // Store PhysicsTable in a file.
     178  // Return false in case of failure at I/O
    206179  G4bool StorePhysicsTable(const G4ParticleDefinition*,
    207180                           const G4String& directory,
    208181                           G4bool ascii = false);
    209182
    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.
    213188  G4bool RetrievePhysicsTable(const G4ParticleDefinition*,
    214189                              const G4String& directory,
    215190                              G4bool ascii);
    216191
    217 private:
    218   // store a table
    219   G4bool StoreTable(const G4ParticleDefinition* p,
    220                     G4PhysicsTable*, G4bool ascii,
    221                     const G4String& directory,
    222                     const G4String& tname);
    223 
    224   // retrieve a table
    225   G4bool RetrieveTable(const G4ParticleDefinition* p,
    226                        G4PhysicsTable*, G4bool ascii,
    227                        const G4String& directory,
    228                        const G4String& tname,
    229                        G4bool mandatory);
    230 
    231   //------------------------------------------------------------------------
    232   // Public interface to cross section, mfp and sampling of fluctuations
    233   // These methods are not used in run time
    234   //------------------------------------------------------------------------
    235 
    236 public:
    237   // access to dispersion of restricted energy loss
    238   G4double GetDEDXDispersion(const G4MaterialCutsCouple *couple,
    239                              const G4DynamicParticle* dp,
    240                              G4double length);
    241 
    242   // Access to cross section table
    243   G4double CrossSectionPerVolume(G4double kineticEnergy,
    244                                  const G4MaterialCutsCouple* couple);
    245 
    246   // access to cross section
    247   G4double MeanFreePath(const G4Track& track);
    248 
    249   // access to step limit
    250   G4double ContinuousStepLimit(const G4Track& track,
    251                                G4double previousStepSize,
    252                                G4double currentMinimumStep,
    253                                G4double& currentSafety);
    254 
    255192protected:
    256193
    257   // implementation of the pure virtual method
    258194  G4double GetMeanFreePath(const G4Track& track,
    259195                           G4double previousStepSize,
    260196                           G4ForceCondition* condition);
    261197
    262   // implementation of the pure virtual method
    263198  G4double GetContinuousStepLimit(const G4Track& track,
    264199                                  G4double previousStepSize,
     
    267202
    268203  //------------------------------------------------------------------------
    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  //------------------------------------------------------------------------
    288206
    289207public:
    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
    341209  void AddCollaborativeProcess(G4VEnergyLossProcess*);
    342210
    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);
    366226
    367227  void SetDEDXTable(G4PhysicsTable* p, G4EmTableType tType);
    368228  void SetCSDARangeTable(G4PhysicsTable* pRange);
    369229  void SetRangeTableForLoss(G4PhysicsTable* p);
     230  void SetInverseRangeTable(G4PhysicsTable* p);
    370231  void SetSecondaryRangeTable(G4PhysicsTable* p);
    371   void SetInverseRangeTable(G4PhysicsTable* p);
    372232
    373233  void SetLambdaTable(G4PhysicsTable* p);
     
    391251  // Max kinetic energy for tables
    392252  inline void SetMaxKinEnergyForCSDARange(G4double e);
    393 
    394   // Return values for given G4MaterialCutsCouple
    395   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;
    405253
    406254  // Access to specific tables
     
    416264  inline G4PhysicsTable* SubLambdaTable();
    417265
     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
    418359  //------------------------------------------------------------------------
    419360  // Run time method for simulation of ionisation
     
    426367  inline void SetDynamicMassCharge(G4double massratio, G4double charge2ratio);
    427368
     369  // Access to cross section table
     370  G4double CrossSectionPerVolume(G4double kineticEnergy,
     371                                 const G4MaterialCutsCouple* couple);
     372
     373protected:
     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
    428390private:
     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);
    429408
    430409  // define material and indexes
    431410  inline void DefineMaterial(const G4MaterialCutsCouple* couple);
    432411
    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  //
    437414  inline G4double GetDEDXForScaledEnergy(G4double scaledKinEnergy);
    438415  inline G4double GetSubDEDXForScaledEnergy(G4double scaledKinEnergy);
     
    441418  inline G4double GetScaledRangeForScaledEnergy(G4double scaledKinEnergy);
    442419  inline G4double GetLimitScaledRangeForScaledEnergy(G4double scaledKinEnergy);
     420  inline G4double GetLambdaForScaledEnergy(G4double scaledKinEnergy);
    443421  inline G4double ScaledKinEnergyForLoss(G4double range);
    444   inline G4double GetLambdaForScaledEnergy(G4double scaledKinEnergy);
    445422  inline void ComputeLambdaForScaledEnergy(G4double scaledKinEnergy);
    446423
    447424  // hide  assignment operator
     425
    448426  G4VEnergyLossProcess(G4VEnergyLossProcess &);
    449427  G4VEnergyLossProcess & operator=(const G4VEnergyLossProcess &right);
     
    466444  G4VEmFluctuationModel*                fluctModel;
    467445  std::vector<const G4Region*>          scoffRegions;
    468   std::vector<const G4Region*>          deRegions;
    469446  G4int                                 nSCoffRegions;
    470   G4int                                 nDERegions;
    471   G4bool*                               idxSCoffRegions;
    472   G4bool*                               idxDERegions;
     447  G4int*                                idxSCoffRegions;
    473448
    474449  std::vector<G4VEnergyLossProcess*>    scProcesses;
     
    518493  G4bool   isIonisation;
    519494  G4bool   useSubCutoff;
    520   G4bool   useDeexcitation;
    521495
    522496protected:
     
    557531//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    558532
    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;
     533inline 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  }
    847542}
    848543
     
    863558  DefineMaterial(couple);
    864559  return GetSubDEDXForScaledEnergy(kineticEnergy*massRatio);
     560}
     561
     562//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     563
     564inline 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
     575inline 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
     586inline 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
     600inline
     601G4double 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;
    865611}
    866612
     
    897643//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    898644
    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() const
    938 {
    939   return  tablesAreBuilt;
    940 }
    941 
    942 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    943 
    944 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTable() const
    945 {
    946   return theDEDXTable;
    947 }
    948 
    949 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    950 
    951 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTableForSubsec() const
    952 {
    953   return theDEDXSubTable;
    954 }
    955 
    956 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    957 
    958 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXunRestrictedTable() const
    959 {
    960   return theDEDXunRestrictedTable;
    961 }
    962 
    963 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    964 
    965 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTable() const
    966 {
    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() const
    975 {
    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() const
    984 {
    985   return theCSDARangeTable;
    986 }
    987 
    988 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    989 
    990 inline G4PhysicsTable* G4VEnergyLossProcess::RangeTableForLoss() const
    991 {
    992   return theRangeTableForLoss;
    993 }
    994 
    995 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    996 
    997 inline G4PhysicsTable* G4VEnergyLossProcess::InverseRangeTable() const
    998 {
    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 inline
    1090 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 
    1114645inline G4double G4VEnergyLossProcess::GetLimitScaledRangeForScaledEnergy(
    1115646                G4double e)
     
    1126657  }
    1127658  return x;
     659}
     660
     661//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     662
     663inline 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
     678inline 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
     688inline 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;
    1128696}
    1129697
     
    1143711  }
    1144712  return e;
     713}
     714
     715//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     716
     717inline 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;
    1145724}
    1146725
     
    1179758//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    1180759
     760inline 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
     769inline 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
     781inline 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
     792inline G4double G4VEnergyLossProcess::MinPrimaryEnergy(
     793                const G4ParticleDefinition*, const G4Material*, G4double cut)
     794{
     795  return cut;
     796}
     797
     798//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     799
     800inline void G4VEnergyLossProcess::SelectModel(G4double kinEnergy)
     801{
     802  currentModel = modelManager->SelectModel(kinEnergy, currentMaterialIndex);
     803}
     804
     805//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     806
     807inline 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
     815inline G4ParticleChangeForLoss* G4VEnergyLossProcess::GetParticleChange()
     816{
     817  return &fParticleChange;
     818}
     819
     820//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     821
     822inline const G4ParticleDefinition* G4VEnergyLossProcess::Particle() const
     823{
     824  return particle;
     825}
     826
     827//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     828
     829inline const G4ParticleDefinition* G4VEnergyLossProcess::BaseParticle() const
     830{
     831  return baseParticle;
     832}
     833
     834//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     835
     836inline const G4ParticleDefinition* G4VEnergyLossProcess::SecondaryParticle() const
     837{
     838  return secondaryParticle;
     839}
     840
     841//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     842
     843inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTable() const
     844{
     845  return theDEDXTable;
     846}
     847
     848//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     849
     850inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTableForSubsec() const
     851{
     852  return theDEDXSubTable;
     853}
     854
     855//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     856
     857inline G4PhysicsTable* G4VEnergyLossProcess::DEDXunRestrictedTable() const
     858{
     859  return theDEDXunRestrictedTable;
     860}
     861
     862//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     863
     864inline 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
     873inline 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
     882inline G4PhysicsTable* G4VEnergyLossProcess::CSDARangeTable() const
     883{
     884  return theCSDARangeTable;
     885}
     886
     887//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     888
     889inline G4PhysicsTable* G4VEnergyLossProcess::RangeTableForLoss() const
     890{
     891  return theRangeTableForLoss;
     892}
     893
     894//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     895
     896inline G4PhysicsTable* G4VEnergyLossProcess::InverseRangeTable() const
     897{
     898  return theInverseRangeTable;
     899}
     900
     901//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     902
     903inline G4PhysicsTable* G4VEnergyLossProcess::LambdaTable()
     904{
     905  return theLambdaTable;
     906}
     907
     908//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     909
     910inline G4PhysicsTable* G4VEnergyLossProcess::SubLambdaTable()
     911{
     912  return theSubLambdaTable;
     913}
     914
     915//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     916 
     917inline G4bool G4VEnergyLossProcess::IsIntegral() const
     918{
     919  return integral;
     920}
     921
     922//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     923
     924inline size_t G4VEnergyLossProcess::CurrentMaterialCutsCoupleIndex() const
     925{
     926  return currentMaterialIndex;
     927}
     928
     929//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     930
     931inline 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 
     941inline G4double G4VEnergyLossProcess::GetCurrentRange() const
     942{
     943  return fRange;
     944}
     945
     946//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     947
     948inline
     949void 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
     959inline
     960G4VEmModel* G4VEnergyLossProcess::GetModelByIndex(G4int idx, G4bool ver)
     961{
     962  return modelManager->GetModel(idx, ver);
     963}
     964
     965//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     966
     967inline G4int G4VEnergyLossProcess::NumberOfModels()
     968{
     969  return modelManager->NumberOfModels();
     970}
     971
     972//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     973
     974inline 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
     983inline 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
     992inline void G4VEnergyLossProcess::SetFluctModel(G4VEmFluctuationModel* p)
     993{
     994  fluctModel = p;
     995}
     996
     997//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     998
     999inline G4VEmFluctuationModel* G4VEnergyLossProcess::FluctModel()
     1000{
     1001  return fluctModel;
     1002}
     1003
     1004//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1005
     1006inline 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
     1014inline void G4VEnergyLossProcess::SetIntegral(G4bool val)
     1015{
     1016  integral = val;
     1017}
     1018
     1019//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1020
     1021inline void G4VEnergyLossProcess::SetParticle(const G4ParticleDefinition* p)
     1022{
     1023  particle = p;
     1024}
     1025
     1026//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1027
     1028inline void G4VEnergyLossProcess::SetBaseParticle(const G4ParticleDefinition* p)
     1029{
     1030  baseParticle = p;
     1031}
     1032
     1033//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1034
     1035inline void G4VEnergyLossProcess::SetSecondaryParticle(const G4ParticleDefinition* p)
     1036{
     1037  secondaryParticle = p;
     1038}
     1039
     1040//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1041
     1042inline void G4VEnergyLossProcess::SetLinearLossLimit(G4double val)
     1043{
     1044  linLossLimit = val;
     1045}
     1046
     1047//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1048
     1049inline void G4VEnergyLossProcess::SetLossFluctuations(G4bool val)
     1050{
     1051  lossFluctuationFlag = val;
     1052}
     1053
     1054//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1055
     1056inline void G4VEnergyLossProcess::SetRandomStep(G4bool val)
     1057{
     1058  rndmStepFlag = val;
     1059}
     1060
     1061//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1062
     1063inline void G4VEnergyLossProcess::SetMinSubRange(G4double val)
     1064{
     1065  minSubRange = val;
     1066}
     1067
     1068//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1069
     1070inline G4bool G4VEnergyLossProcess::TablesAreBuilt() const
     1071{
     1072  return  tablesAreBuilt;
     1073}
     1074
     1075//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1076
     1077inline G4int G4VEnergyLossProcess::NumberOfSubCutoffRegions() const
     1078{
     1079  return nSCoffRegions;
     1080}
     1081
     1082//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1083
     1084inline void G4VEnergyLossProcess::SetDEDXBinning(G4int nbins)
     1085{
     1086  nBins = nbins;
     1087}
     1088
     1089//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1090
     1091inline void G4VEnergyLossProcess::SetLambdaBinning(G4int nbins)
     1092{
     1093  nBins = nbins;
     1094}
     1095
     1096//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1097
     1098inline void G4VEnergyLossProcess::SetDEDXBinningForCSDARange(G4int nbins)
     1099{
     1100  nBinsCSDA = nbins;
     1101}
     1102
     1103//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1104
     1105inline G4double G4VEnergyLossProcess::MinKinEnergy() const
     1106{
     1107  return minKinEnergy;
     1108}
     1109
     1110//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1111
     1112inline void G4VEnergyLossProcess::SetMinKinEnergy(G4double e)
     1113{
     1114  minKinEnergy = e;
     1115}
     1116
     1117//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1118
     1119inline void G4VEnergyLossProcess::SetMaxKinEnergy(G4double e)
     1120{
     1121  maxKinEnergy = e;
     1122  if(e < maxKinEnergyCSDA) maxKinEnergyCSDA = e;
     1123}
     1124
     1125//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1126
     1127inline void G4VEnergyLossProcess::SetMaxKinEnergyForCSDARange(G4double e)
     1128{
     1129  maxKinEnergyCSDA = e;
     1130}
     1131
     1132//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1133
     1134inline G4double G4VEnergyLossProcess::MaxKinEnergy() const
     1135{
     1136  return maxKinEnergy;
     1137}
     1138
     1139//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1140
     1141inline void G4VEnergyLossProcess::SetLambdaFactor(G4double val)
     1142{
     1143  if(val > 0.0 && val <= 1.0) lambdaFactor = val;
     1144}
     1145
     1146//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1147
     1148inline 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
     1157inline G4bool G4VEnergyLossProcess::IsIonisationProcess() const
     1158{
     1159  return isIonisation;
     1160}
     1161
     1162//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     1163
     1164void 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
    11811175#endif
  • trunk/source/processes/electromagnetic/utils/include/G4VMscModel.hh

    r1005 r1007  
    2424// ********************************************************************
    2525//
    26 // $Id: G4VMscModel.hh,v 1.8 2009/02/24 09:56:03 vnivanch 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 $
    2828//
    2929// -------------------------------------------------------------------
     
    5454#include "G4MscStepLimitType.hh"
    5555#include "globals.hh"
    56 #include "G4ThreeVector.hh"
    57 #include "G4Track.hh"
    58 #include "G4SafetyHelper.hh"
    59 
    60 class G4ParticleChangeForMSC;
    6156
    6257class G4VMscModel : public G4VEmModel
     
    6964  virtual ~G4VMscModel();
    7065
    71   // empty
    72   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 models
    80   //================================================================
    81  
    8266  inline void SetStepLimitType(G4MscStepLimitType);
    8367
     
    9074  inline void SetSkin(G4double);
    9175
    92   inline void SetSampleZ(G4bool);
    93 
    94 protected:
    95 
    96   // initialisation of interface with geometry
    97   void InitialiseSafetyHelper();
    98 
    99   // shift point of the track PostStep
    100   void ComputeDisplacement(G4ParticleChangeForMSC*, 
    101                            const G4ThreeVector& displDir,
    102                            G4double displacement,
    103                            G4double postsafety);
    104 
    105   // compute safety
    106   inline G4double ComputeSafety(const G4ThreeVector& position, G4double limit);
    107 
    108   // compute linear distance to a geometry boundary
    109   inline G4double ComputeGeomLimit(const G4Track& position, G4double& presafety,
    110                                    G4double limit);
    111 
    11276private:
    11377
     
    11579  G4VMscModel & operator=(const  G4VMscModel &right);
    11680  G4VMscModel(const  G4VMscModel&);
    117 
    118   G4SafetyHelper* safetyHelper;
    11981
    12082protected:
     
    12688  G4double dtrl;
    12789  G4double lambdalimit;
    128   G4double geommax;
    12990
    13091  G4MscStepLimitType steppingAlgorithm;
     
    173134//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    174135
    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 
    206136#endif
    207137
  • trunk/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh

    r1005 r1007  
    2424// ********************************************************************
    2525//
    26 // $Id: G4VMultipleScattering.hh,v 1.55 2009/02/18 12:19:33 vnivanch 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 $
    2828//
    2929// -------------------------------------------------------------------
     
    145145                              G4bool ascii);
    146146
     147  //------------------------------------------------------------------------
     148  // Specific methods for msc processes
     149  //------------------------------------------------------------------------
     150
    147151  // The function overloads the corresponding function of the base
    148152  // class.It limits the step near to boundaries only
    149153  // and invokes the method GetMscContinuousStepLimit at every step.
    150   G4double AlongStepGetPhysicalInteractionLength(
     154  virtual G4double AlongStepGetPhysicalInteractionLength(
    151155                                            const G4Track&,
    152156                                            G4double  previousStepSize,
     
    188192  inline G4PhysicsTable* LambdaTable() const;
    189193
    190   // access particle type
     194  //------------------------------------------------------------------------
     195  // Define and access particle type
     196  //------------------------------------------------------------------------
     197
    191198  inline const G4ParticleDefinition* Particle() const;
     199  inline void SetParticle(const G4ParticleDefinition*);
    192200
    193201  //------------------------------------------------------------------------
     
    195203  //------------------------------------------------------------------------
    196204
    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
    203207  inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy,
    204208                                            size_t& idxRegion) const;
    205209
    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
    211211  inline G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false);
    212212
    213213  //------------------------------------------------------------------------
    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
    218217  inline void SetLateralDisplasmentFlag(G4bool val);
    219218
    220   inline G4double Skin() const;
    221219  inline void SetSkin(G4double val);
    222220
    223   inline G4double RangeFactor() const;
    224221  inline void SetRangeFactor(G4double val);
    225222
    226   inline G4double GeomFactor() const;
    227223  inline void SetGeomFactor(G4double val);
    228224
    229   inline G4double PolarAngleLimit() const;
    230225  inline void SetPolarAngleLimit(G4double val);
    231226
    232   inline G4MscStepLimitType StepLimitType() const;
    233227  inline void SetStepLimitType(G4MscStepLimitType val);
    234 
    235   //------------------------------------------------------------------------
    236   // Run time methods
    237   //------------------------------------------------------------------------
    238228
    239229protected:
     
    243233                           G4double,
    244234                           G4ForceCondition* condition);
     235
     236  //------------------------------------------------------------------------
     237  // Run time methods
     238  //------------------------------------------------------------------------
    245239
    246240  // This method is not used for tracking, it returns step limit
     
    259253                                            G4double& currentSafety);
    260254
     255  inline G4VEmModel* SelectModel(G4double kinEnergy);
     256  // Select concrete model
     257
     258  inline const G4MaterialCutsCouple* CurrentMaterialCutsCouple() const;
     259
    261260  // define current material
    262261  inline void DefineMaterial(const G4MaterialCutsCouple* couple);
    263262
    264   inline const G4MaterialCutsCouple* CurrentMaterialCutsCouple() const;
     263  //------------------------------------------------------------------------
     264  // Access parameters of multiple scattering
     265  //------------------------------------------------------------------------
    265266
    266267  inline G4ParticleChangeForMSC* GetParticleChange();
    267268
     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;
    268280
    269281private:
    270282
    271283  // hide  assignment operator
     284
    272285  G4VMultipleScattering(G4VMultipleScattering &);
    273286  G4VMultipleScattering & operator=(const G4VMultipleScattering &right);
     
    317330//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    318331
    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 
    419332inline
    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);
     333void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* couple)
     334{
     335  if(couple != currentCouple) {
     336    currentCouple   = couple;
     337    currentMaterialIndex = couple->GetIndex();
    525338  }
    526   if(x > DBL_MIN) x = 1./x;
    527   else            x = DBL_MAX;
    528   return x;
    529339}
    530340
     
    554364//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    555365
     366inline 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
    556378inline
    557 void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* couple)
    558 {
    559   if(couple != currentCouple) {
    560     currentCouple   = couple;
    561     currentMaterialIndex = couple->GetIndex();
     379G4double 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);
    562388  }
    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
     396inline G4VEmModel* G4VMultipleScattering::SelectModel(G4double kinEnergy)
     397{
     398  return modelManager->SelectModel(kinEnergy, currentMaterialIndex);
     399}
     400
     401//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     402
     403inline 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
     411inline void G4VMultipleScattering::SetBinning(G4int nbins)
     412{
     413  nBins = nbins;
     414}
     415
     416//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     417
     418inline G4int G4VMultipleScattering::Binning() const
     419{
     420  return nBins;
     421}
     422
     423//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     424
     425inline void G4VMultipleScattering::SetMinKinEnergy(G4double e)
     426{
     427  minKinEnergy = e;
     428}
     429
     430//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     431
     432inline G4double G4VMultipleScattering::MinKinEnergy() const
     433{
     434  return minKinEnergy;
     435}
     436
     437//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     438
     439inline void G4VMultipleScattering::SetMaxKinEnergy(G4double e)
     440{
     441  maxKinEnergy = e;
     442}
     443
     444//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     445
     446inline G4double G4VMultipleScattering::MaxKinEnergy() const
     447{
     448  return maxKinEnergy;
     449}
     450
     451//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     452
     453inline  G4bool G4VMultipleScattering::LateralDisplasmentFlag() const
     454{
     455  return latDisplasment;
     456}
     457
     458//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     459
     460inline  void G4VMultipleScattering::SetLateralDisplasmentFlag(G4bool val)
     461{
     462  latDisplasment = val;
     463}
     464
     465//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     466
     467inline G4ParticleChangeForMSC* G4VMultipleScattering::GetParticleChange()
     468{
     469  return &fParticleChange;
     470}
     471
     472//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     473
     474inline  G4double G4VMultipleScattering::Skin() const
     475{
     476  return skin;
     477}
     478
     479//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     480
     481inline  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
     489inline  G4double G4VMultipleScattering::RangeFactor() const
     490{
     491  return facrange;
     492}
     493
     494//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     495
     496inline  void G4VMultipleScattering::SetRangeFactor(G4double val)
     497{
     498  if(val > 0.0) facrange = val;
     499}
     500
     501//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     502
     503inline  G4double G4VMultipleScattering::GeomFactor() const
     504{
     505  return facgeom;
     506}
     507
     508//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     509
     510inline  void G4VMultipleScattering::SetGeomFactor(G4double val)
     511{
     512  if(val > 0.0) facgeom = val;
     513}
     514
     515//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     516
     517inline  G4double G4VMultipleScattering::PolarAngleLimit() const
     518{
     519  return polarAngleLimit;
     520}
     521
     522//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     523
     524inline  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
     533inline G4MscStepLimitType G4VMultipleScattering::StepLimitType() const
     534{
     535  return stepLimit;
     536}
     537
     538//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     539
     540inline void G4VMultipleScattering::SetStepLimitType(G4MscStepLimitType val)
     541{
     542  stepLimit = val;
     543  if(val == fMinimal) facrange = 0.2;
     544}
     545
     546//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     547
     548inline  void G4VMultipleScattering::SetBuildLambdaTable(G4bool val)
     549{
     550  buildLambdaTable = val;
     551}
     552
     553//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     554
     555inline  const G4ParticleDefinition* G4VMultipleScattering::Particle() const
     556{
     557  return currentParticle;
     558}
     559
     560//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     561
     562inline G4PhysicsTable* G4VMultipleScattering::LambdaTable() const
     563{
     564  return theLambdaTable;
     565}
     566
     567//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     568
     569inline
     570const G4MaterialCutsCouple* G4VMultipleScattering::CurrentMaterialCutsCouple() const
    569571{
    570572  return currentCouple;
     
    573575//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    574576
    575 inline G4ParticleChangeForMSC* G4VMultipleScattering::GetParticleChange()
    576 {
    577   return &fParticleChange;
     577inline 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
     587inline
     588G4VEmModel* G4VMultipleScattering::GetModelByIndex(G4int idx, G4bool ver)
     589{
     590  return modelManager->GetModel(idx, ver);
    578591}
    579592
  • trunk/source/processes/electromagnetic/utils/include/G4ionEffectiveCharge.hh

    r961 r1007  
    2525//
    2626// $Id: G4ionEffectiveCharge.hh,v 1.12 2008/09/20 19:39:34 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-02-ref-02 $
     27// GEANT4 tag $Name: geant4-09-02 $
    2828//
    2929// -------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.