Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 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. * 10 // * * 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. * 17 // * * 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 // ******************************************************************** 25 // 26 // G4InteractionLawPhysical 27 // -------------------------------------------------------------------- 28 29 #include "G4InteractionLawPhysical.hh" 30 #include "Randomize.hh" 31 32 G4InteractionLawPhysical::G4InteractionLawPhysical(const G4String& name) 33 : G4VBiasingInteractionLaw(name) 34 {} 35 36 G4InteractionLawPhysical::~G4InteractionLawPhysical() 37 {} 38 39 void G4InteractionLawPhysical::SetPhysicalCrossSection(G4double crossSection) 40 { 41 if (crossSection < 0.0) 42 { 43 G4Exception("G4InteractionLawPhysical::SetPhysicalCrossSection(..)", 44 "BIAS.GEN.14", JustWarning, 45 "Cross-section value passed is negative. It is set to zero !"); 46 crossSection = 0.0; 47 } 48 fCrossSectionDefined = true; 49 fCrossSection = crossSection; 50 } 51 52 G4double G4InteractionLawPhysical:: 53 ComputeEffectiveCrossSectionAt(G4double) const 54 { 55 if (!fCrossSectionDefined) 56 { 57 G4Exception("G4InteractionLawPhysical::ComputeEffectiveCrossSection(..)", 58 "BIAS.GEN.15", JustWarning, 59 "Cross-section value requested, but has not been defined yet. Assumes 0 !"); 60 } 61 return fCrossSection; 62 } 63 64 G4double G4InteractionLawPhysical:: 65 ComputeNonInteractionProbabilityAt(G4double stepLength) const 66 { 67 if (!fCrossSectionDefined) 68 { 69 G4Exception("G4InteractionLawPhysical::ComputeNonInteractionProbability(..)", 70 "BIAS.GEN.16", JustWarning, 71 "Non interaction probabitlity value requested, but cross section has not been defined yet. Assumes it to be 0 !"); 72 } 73 // -- allows zero cross-section case, by convention: 74 if ( fCrossSection == 0.0 ) return 1.0; 75 else return std::exp(-fCrossSection*stepLength); 76 } 77 78 G4double G4InteractionLawPhysical::SampleInteractionLength() 79 { 80 if ( !fCrossSectionDefined || fCrossSection < 0.0 ) 81 { 82 G4Exception("G4InteractionLawPhysical::Sample(..)", 83 "BIAS.GEN.17", FatalException, 84 "Trying to sample while cross-section is not defined or < 0 !"); 85 } 86 if ( fCrossSection == 0.0 ) return DBL_MAX; 87 88 fNumberOfInteractionLength = -std::log( G4UniformRand() ); 89 return fNumberOfInteractionLength/fCrossSection; 90 } 91 92 G4double G4InteractionLawPhysical:: 93 UpdateInteractionLengthForStep(G4double truePathLength) 94 { 95 fNumberOfInteractionLength -= truePathLength*fCrossSection; 96 97 if ( fNumberOfInteractionLength < 0 ) 98 { 99 G4ExceptionDescription ed; 100 ed << " Negative number of interaction length for `" << GetName() 101 << "' " << fNumberOfInteractionLength << ", set it to zero !" << G4endl; 102 G4Exception("G4InteractionLawPhysical::UpdateInteractionLengthForStep(...)", 103 "BIAS.GEN.13", JustWarning, ed); 104 fNumberOfInteractionLength = 0.; 105 } 106 return fNumberOfInteractionLength/fCrossSection; 107 } 108