2 // ********************************************************************
 
    3 // * License and Disclaimer                                           *
 
    5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
 
    6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
 
    7 // * conditions of the Geant4 Software License,  included in the file *
 
    8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
 
    9 // * include a list of copyright holders.                             *
 
   11 // * Neither the authors of this software system, nor their employing *
 
   12 // * institutes,nor the agencies providing financial support for this *
 
   13 // * work  make  any representation or  warranty, express or implied, *
 
   14 // * regarding  this  software system or assume any liability for its *
 
   15 // * use.  Please see the license in the file  LICENSE  and URL above *
 
   16 // * for the full disclaimer and the limitation of liability.         *
 
   18 // * This  code  implementation is the result of  the  scientific and *
 
   19 // * technical work of the GEANT4 collaboration.                      *
 
   20 // * By using,  copying,  modifying or  distributing the software (or *
 
   21 // * any work based  on the software)  you  agree  to acknowledge its *
 
   22 // * use  in  resulting  scientific  publications,  and indicate your *
 
   23 // * acceptance of all terms of the Geant4 Software license.          *
 
   24 // ********************************************************************
 
   26 // $Id: G4IonParametrisedLossModel.icc 66241 2012-12-13 18:34:42Z gunter $
 
   28 // ===========================================================================
 
   31 // Class:                G4IonParametrisedLossModel
 
   33 // Base class:           G4VEmModel (utils)
 
   35 // Author:               Anton Lechner (Anton.Lechner@cern.ch)
 
   37 // First implementation: 10. 11. 2008
 
   39 // Modifications: 03. 02. 2009 - Bug fix iterators (AL)
 
   40 //                11. 03. 2009 - Introduced new table handler (G4IonDEDXHandler)
 
   41 //                               and modified method to add/remove tables
 
   42 //                               (tables are now built in initialisation phase),
 
   43 //                               Minor bug fix in ComputeDEDXPerVolume (AL)
 
   44 //                20. 11. 2009 - Added set-method for energy loss limit (AL)
 
   45 //                04. 11. 2010 - Moved virtual methods to the source (VI)
 
   48 //    Model for computing the energy loss of ions by employing a 
 
   49 //    parameterisation of dE/dx tables (default ICRU 73 tables). For 
 
   50 //    ion-material combinations and/or projectile energies not covered 
 
   51 //    by this model, the G4BraggIonModel and G4BetheBloch models are
 
   56 // =========================================================================== 
 
   58 inline G4double G4IonParametrisedLossModel::DeltaRayMeanEnergyTransferRate(
 
   59                                       const G4Material* material,
 
   60                                  const G4ParticleDefinition* particle,
 
   61                                  G4double kineticEnergy,
 
   64   // ############## Mean energy transferred to delta-rays ###################
 
   65   // Computes the mean energy transfered to delta-rays per unit length,
 
   66   // considering only delta-rays with energies above the energy threshold 
 
   69   // The mean energy transfer rate is derived by using the differential
 
   70   // cross section given in the references below.
 
   72   // See Geant4 physics reference manual (version 9.1), section 9.1.3
 
   74   // Ref.: W.M. Yao et al, Jour. of Phys. G 33 (2006) 1.
 
   75   //       B. Rossi, High energy particles, New York, NY: Prentice-Hall (1952).
 
   77   // (Implementation adapted from G4BraggIonModel)
 
   81   //   kineticEnergy = kinetic energy of projectile
 
   82   //   totEnergy     = total energy of projectile, i.e. kinetic energy
 
   83   //                   plus rest energy (Mc^2)
 
   84   //   betaSquared   = beta of projectile squared, calculated as
 
   85   //                      beta^2 = 1 - 1 / (E/Mc^2)^2
 
   86   //                             = T * ( E + Mc^2 ) / E^2
 
   87   //                   where T = kineticEnergy, E = totEnergy
 
   88   //   cutEnergy     = energy threshold for secondary particle production
 
   89   //                   i.e. energy cut, below which energy transfered to 
 
   90   //                   electrons is treated as continuous loss of projectile
 
   91   //   maxKinEnergy  = maximum energy transferable to secondary electrons
 
   92   //   meanRate      = mean kinetic energy of delta ray (per unit length) 
 
   95   G4double meanRate = 0.0;
 
   97   G4double maxKinEnergy = MaxSecondaryEnergy(particle, kineticEnergy);
 
   99   if (cutEnergy < maxKinEnergy) {
 
  101     G4double totalEnergy  = kineticEnergy + cacheMass;
 
  102     G4double betaSquared  = kineticEnergy * 
 
  103                   (totalEnergy + cacheMass) / (totalEnergy * totalEnergy);
 
  105     G4double cutMaxEnergyRatio = cutEnergy / maxKinEnergy;
 
  108         (- std::log(cutMaxEnergyRatio) - (1.0 - cutMaxEnergyRatio) * betaSquared) * 
 
  109         CLHEP::twopi_mc2_rcl2 * 
 
  110         (material->GetTotNbOfElectPerVolume()) / betaSquared;
 
  112     meanRate *= GetChargeSquareRatio(particle, material, kineticEnergy);
 
  119 void G4IonParametrisedLossModel::UpdateCache(
 
  120                              const G4ParticleDefinition* particle) {
 
  122   cacheParticle = particle;
 
  123   cacheMass = particle -> GetPDGMass();
 
  124   cacheElecMassRatio = CLHEP::electron_mass_c2 / cacheMass;
 
  125   G4double q = particle -> GetPDGCharge() / CLHEP::eplus;
 
  126   cacheChargeSquare = q * q;
 
  130 LossTableList::iterator G4IonParametrisedLossModel::IsApplicable(
 
  131                     const G4ParticleDefinition* particle,  // Projectile (ion) 
 
  132                     const G4Material* material) {          // Target material
 
  134   LossTableList::iterator iter = lossTableList.end();
 
  135   LossTableList::iterator iterTables = lossTableList.begin();
 
  136   LossTableList::iterator iterTables_end = lossTableList.end();
 
  138   for(;iterTables != iterTables_end; iterTables++) {
 
  139       G4bool isApplicable = (*iterTables) -> 
 
  140                        IsApplicable(particle, material);
 
  152 void G4IonParametrisedLossModel::SetEnergyLossLimit(
 
  153                                             G4double ionEnergyLossLimit) {
 
  155   if(ionEnergyLossLimit > 0 && ionEnergyLossLimit <=1) {
 
  157      energyLossLimit = ionEnergyLossLimit;