Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4BOptnForceFreeFlight << 27 // ------------------------------------------- << 28 #include "G4BOptnForceFreeFlight.hh" 26 #include "G4BOptnForceFreeFlight.hh" 29 #include "G4ILawForceFreeFlight.hh" 27 #include "G4ILawForceFreeFlight.hh" 30 #include "G4BiasingProcessInterface.hh" 28 #include "G4BiasingProcessInterface.hh" 31 #include "G4Step.hh" 29 #include "G4Step.hh" 32 30 33 G4BOptnForceFreeFlight::G4BOptnForceFreeFlight << 31 34 : G4VBiasingOperation( name ) << 32 >> 33 G4BOptnForceFreeFlight::G4BOptnForceFreeFlight(G4String name) >> 34 : G4VBiasingOperation ( name ), >> 35 fCumulatedWeightChange ( -1.0 ), >> 36 fInitialTrackWeight ( -1.0 ), >> 37 fOperationComplete ( true ) 35 { 38 { 36 fForceFreeFlightInteractionLaw = new G4ILawF 39 fForceFreeFlightInteractionLaw = new G4ILawForceFreeFlight("LawForOperation"+name); 37 } 40 } 38 41 39 G4BOptnForceFreeFlight::~G4BOptnForceFreeFligh 42 G4BOptnForceFreeFlight::~G4BOptnForceFreeFlight() 40 { 43 { 41 delete fForceFreeFlightInteractionLaw; << 44 if ( fForceFreeFlightInteractionLaw ) delete fForceFreeFlightInteractionLaw; 42 } 45 } 43 46 44 const G4VBiasingInteractionLaw* G4BOptnForceFr << 47 const G4VBiasingInteractionLaw* G4BOptnForceFreeFlight::ProvideOccurenceBiasingInteractionLaw( const G4BiasingProcessInterface*, G4ForceCondition& proposeForceCondition ) 45 ProvideOccurenceBiasingInteractionLaw( const G << 46 G4Force << 47 { 48 { 48 fOperationComplete = false; 49 fOperationComplete = false; 49 proposeForceCondition = Forced; 50 proposeForceCondition = Forced; 50 return fForceFreeFlightInteractionLaw; 51 return fForceFreeFlightInteractionLaw; 51 } 52 } 52 53 53 G4VParticleChange* G4BOptnForceFreeFlight:: << 54 G4bool G4BOptnForceFreeFlight::DenyProcessPostStepDoIt( const G4BiasingProcessInterface*, const G4Track*, const G4Step* step, G4double& proposedWeight ) 54 ApplyFinalStateBiasing( const G4BiasingProcess << 55 { 55 const G4Track* track, << 56 // -- force free flight always deny process to apply its doit. 56 G4bool& forceFinalStat << 57 // -- if reaching boundary, track is restored with non-zero weight >> 58 if ( fInitialTrackWeight <= DBL_MIN ) >> 59 { >> 60 G4ExceptionDescription ed; >> 61 ed << " Initial track weight is null ! " << G4endl; >> 62 G4Exception(" G4BOptnForceFreeFlight::DenyProcessPostStepDoIt(...)", >> 63 "BIAS.GEN.05", >> 64 JustWarning, >> 65 ed); >> 66 } >> 67 if ( fCumulatedWeightChange <= DBL_MIN ) >> 68 { >> 69 G4ExceptionDescription ed; >> 70 ed << " Cumulated weight is null ! " << G4endl; >> 71 G4Exception(" G4BOptnForceFreeFlight::DenyProcessPostStepDoIt(...)", >> 72 "BIAS.GEN.06", >> 73 JustWarning, >> 74 ed); >> 75 } >> 76 if ( step->GetPostStepPoint()->GetStepStatus() == fGeomBoundary ) >> 77 { >> 78 if ( proposedWeight <= DBL_MIN ) proposedWeight = fCumulatedWeightChange * fInitialTrackWeight; >> 79 else proposedWeight *= fCumulatedWeightChange; >> 80 } >> 81 >> 82 return true; >> 83 } >> 84 >> 85 G4VParticleChange* G4BOptnForceFreeFlight::ApplyFinalStateBiasing( const G4BiasingProcessInterface* callingProcess, >> 86 const G4Track* track, >> 87 const G4Step* step, >> 88 G4bool& forceFinalState) 57 { 89 { 58 // -- If the track is reaching the volume bo 90 // -- If the track is reaching the volume boundary, its free flight ends. In this case, its zero 59 // -- weight is brought back to non-zero val 91 // -- weight is brought back to non-zero value: its initial weight is restored by the first 60 // -- ApplyFinalStateBiasing operation calle 92 // -- ApplyFinalStateBiasing operation called, and the weight for force free flight is applied 61 // -- is applied by each operation. 93 // -- is applied by each operation. 62 // -- If the track is not reaching the volum 94 // -- If the track is not reaching the volume boundary, it zero weight flight continues. 63 95 64 fParticleChange.Initialize( *track ); 96 fParticleChange.Initialize( *track ); 65 forceFinalState = true; << 97 forceFinalState = true; 66 if ( step->GetPostStepPoint()->GetStepStatus 98 if ( step->GetPostStepPoint()->GetStepStatus() == fGeomBoundary ) 67 { << 68 // -- Sanity checks: << 69 if ( fInitialTrackWeight <= DBL_MIN ) << 70 { << 71 G4ExceptionDescription ed; << 72 ed << " Initial track weight is null ! " << 73 G4Exception(" G4BOptnForceFreeFlight::Ap << 74 "BIAS.GEN.05", JustWarning, << 75 } << 76 if ( fCumulatedWeightChange <= DBL_MIN ) << 77 { 99 { 78 G4ExceptionDescription ed; << 100 // -- Sanity checks: 79 ed << " Cumulated weight is null ! " << << 101 if ( fInitialTrackWeight <= DBL_MIN ) 80 G4Exception(" G4BOptnForceFreeFlight::Ap << 102 { 81 "BIAS.GEN.06", JustWarning, << 103 G4ExceptionDescription ed; >> 104 ed << " Initial track weight is null ! " << G4endl; >> 105 G4Exception(" G4BOptnForceFreeFlight::ApplyFinalStateBiasing(...)", >> 106 "BIAS.GEN.05", >> 107 JustWarning, >> 108 ed); >> 109 } >> 110 if ( fCumulatedWeightChange <= DBL_MIN ) >> 111 { >> 112 G4ExceptionDescription ed; >> 113 ed << " Cumulated weight is null ! " << G4endl; >> 114 G4Exception(" G4BOptnForceFreeFlight::ApplyFinalStateBiasing(...)", >> 115 "BIAS.GEN.06", >> 116 JustWarning, >> 117 ed); >> 118 } >> 119 >> 120 G4double proposedWeight = track->GetWeight(); >> 121 if ( callingProcess->GetIsFirstPostStepDoItInterface() ) proposedWeight = fCumulatedWeightChange * fInitialTrackWeight; >> 122 else proposedWeight *= fCumulatedWeightChange; >> 123 fParticleChange.ProposeWeight(proposedWeight); >> 124 fOperationComplete = true; 82 } 125 } 83 G4double proposedWeight = track->GetWeight << 84 if ( callingProcess->GetIsFirstPostStepDoI << 85 proposedWeight = fCumulatedWeightChange << 86 else << 87 proposedWeight *= fCumulatedWeightChange << 88 fParticleChange.ProposeWeight(proposedWeig << 89 fOperationComplete = true; << 90 } << 91 126 92 return &fParticleChange; 127 return &fParticleChange; 93 } 128 } 94 129 95 void G4BOptnForceFreeFlight:: << 130 96 AlongMoveBy( const G4BiasingProcessInterface*, << 131 void G4BOptnForceFreeFlight::AlongMoveBy( const G4BiasingProcessInterface*, const G4Step*, G4double weightChange ) 97 const G4Step*, G4double weightCha << 98 { 132 { 99 fCumulatedWeightChange *= weightChange; 133 fCumulatedWeightChange *= weightChange; 100 } 134 } 101 135