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 // G4BOptnForceCommonTruncatedExp 27 // 28 // Class Description: 29 // 30 // A G4VBiasingOperation physics-based biasing operation. It 31 // handles several processes together, biasing on the total 32 // cross-section of these processes (instead of biasing them 33 // individually). 34 // The biasing interaction law is a truncated exponential 35 // one, driven by the total cross-section and which extends 36 // in the range [0,L]. 37 // Process are registered with the AddCrossSection() method. 38 // As cross-sections are all known at the end of the 39 // PostStepGPIL loop, the step limitation is made at the 40 // AlongStepGPIL level. 41 // 42 // Author: Marc Verderi, November 2013. 43 // -------------------------------------------------------------------- 44 #ifndef G4BOptnForceCommonTruncatedExp_hh 45 #define G4BOptnForceCommonTruncatedExp_hh 1 46 47 #include "G4VBiasingOperation.hh" 48 #include "G4ThreeVector.hh" 49 #include "G4ParticleChangeForNothing.hh" 50 51 #include <map> 52 53 class G4ILawCommonTruncatedExp; 54 class G4ILawForceFreeFlight; 55 56 class G4BOptnForceCommonTruncatedExp : public G4VBiasingOperation 57 { 58 public: 59 // -- Constructor : 60 G4BOptnForceCommonTruncatedExp(const G4String& name); 61 // -- destructor: 62 virtual ~G4BOptnForceCommonTruncatedExp(); 63 64 // -- Methods from G4VBiasingOperation interface: 65 // ------------------------------------------- 66 // -- Used: 67 virtual const G4VBiasingInteractionLaw* 68 ProvideOccurenceBiasingInteractionLaw( const G4BiasingProcessInterface*, G4ForceCondition& ); 69 virtual G4double 70 ProposeAlongStepLimit( const G4BiasingProcessInterface* ) { return DBL_MAX; } 71 virtual G4GPILSelection 72 ProposeGPILSelection( const G4GPILSelection processSelection ); 73 virtual G4VParticleChange* 74 ApplyFinalStateBiasing( const G4BiasingProcessInterface*, 75 const G4Track*, const G4Step*, G4bool& ); 76 // -- Unused: 77 virtual G4double 78 DistanceToApplyOperation( const G4Track*, 79 G4double, G4ForceCondition* ) { return DBL_MAX; } 80 virtual G4VParticleChange* 81 GenerateBiasingFinalState(const G4Track*, const G4Step*) { return nullptr; } 82 83 // -- Additional methods, specific to this class: 84 // ---------------------------------------------- 85 // -- return concrete type of interaction laws: 86 G4ILawCommonTruncatedExp* GetCommonTruncatedExpLaw() 87 { 88 return fCommonTruncatedExpLaw; 89 } 90 G4ILawForceFreeFlight* GetForceFreeFlightLaw() 91 { 92 return fForceFreeFlightLaw; 93 } 94 95 void Initialize( const G4Track* ); 96 void UpdateForStep( const G4Step* ); 97 void Sample(); 98 const G4ThreeVector& GetInitialMomentum() const { return fInitialMomentum; } 99 G4double GetMaximumDistance() const { return fMaximumDistance; } 100 void ChooseProcessToApply(); 101 const G4VProcess* GetProcessToApply() const { return fProcessToApply; } 102 void AddCrossSection( const G4VProcess*, G4double ); 103 std::size_t GetNumberOfSharing() const { return fNumberOfSharing; } 104 void SetInteractionOccured( G4bool b ) { fInteractionOccured = b; } 105 G4bool GetInteractionOccured() const { return fInteractionOccured; } 106 107 private: 108 109 G4ILawCommonTruncatedExp* fCommonTruncatedExpLaw = nullptr; 110 G4ILawForceFreeFlight* fForceFreeFlightLaw = nullptr; 111 G4double fTotalCrossSection = 0.0; 112 std::map < const G4VProcess*, G4double > fCrossSections; 113 std::size_t fNumberOfSharing = 0; 114 const G4VProcess* fProcessToApply = nullptr; 115 G4bool fInteractionOccured = false; 116 G4ThreeVector fInitialMomentum; 117 G4double fMaximumDistance = -1.0; 118 G4ParticleChangeForNothing fDummyParticleChange; 119 }; 120 121 #endif 122