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 54 ApplyFinalStateBiasing( const G4BiasingProcess << 55 G4VParticleChange* G4BOptnForceFreeFlight::ApplyFinalStateBiasing( const G4BiasingProcessInterface* callingProcess, 55 const G4Track* track, << 56 const G4Track* track, 56 G4bool& forceFinalStat << 57 const G4Step* step, >> 58 G4bool& forceFinalState) 57 { 59 { 58 // -- If the track is reaching the volume bo 60 // -- 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 61 // -- weight is brought back to non-zero value: its initial weight is restored by the first 60 // -- ApplyFinalStateBiasing operation calle 62 // -- ApplyFinalStateBiasing operation called, and the weight for force free flight is applied 61 // -- is applied by each operation. 63 // -- is applied by each operation. 62 // -- If the track is not reaching the volum 64 // -- If the track is not reaching the volume boundary, it zero weight flight continues. 63 65 64 fParticleChange.Initialize( *track ); 66 fParticleChange.Initialize( *track ); 65 forceFinalState = true; << 67 forceFinalState = true; 66 if ( step->GetPostStepPoint()->GetStepStatus 68 if ( step->GetPostStepPoint()->GetStepStatus() == fGeomBoundary ) 67 { << 68 // -- Sanity checks: << 69 if ( fInitialTrackWeight <= DBL_MIN ) << 70 { 69 { 71 G4ExceptionDescription ed; << 70 // -- Sanity checks: 72 ed << " Initial track weight is null ! " << 71 if ( fInitialTrackWeight <= DBL_MIN ) 73 G4Exception(" G4BOptnForceFreeFlight::Ap << 72 { 74 "BIAS.GEN.05", JustWarning, << 73 G4ExceptionDescription ed; >> 74 ed << " Initial track weight is null ! " << G4endl; >> 75 G4Exception(" G4BOptnForceFreeFlight::ApplyFinalStateBiasing(...)", >> 76 "BIAS.GEN.05", >> 77 JustWarning, >> 78 ed); >> 79 } >> 80 if ( fCumulatedWeightChange <= DBL_MIN ) >> 81 { >> 82 G4ExceptionDescription ed; >> 83 ed << " Cumulated weight is null ! " << G4endl; >> 84 G4Exception(" G4BOptnForceFreeFlight::ApplyFinalStateBiasing(...)", >> 85 "BIAS.GEN.06", >> 86 JustWarning, >> 87 ed); >> 88 } >> 89 >> 90 G4double proposedWeight = track->GetWeight(); >> 91 if ( callingProcess->GetIsFirstPostStepDoItInterface() ) proposedWeight = fCumulatedWeightChange * fInitialTrackWeight; >> 92 else proposedWeight *= fCumulatedWeightChange; >> 93 fParticleChange.ProposeWeight(proposedWeight); >> 94 fOperationComplete = true; 75 } 95 } 76 if ( fCumulatedWeightChange <= DBL_MIN ) << 77 { << 78 G4ExceptionDescription ed; << 79 ed << " Cumulated weight is null ! " << << 80 G4Exception(" G4BOptnForceFreeFlight::Ap << 81 "BIAS.GEN.06", JustWarning, << 82 } << 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 96 92 return &fParticleChange; 97 return &fParticleChange; 93 } 98 } 94 99 95 void G4BOptnForceFreeFlight:: << 100 96 AlongMoveBy( const G4BiasingProcessInterface*, << 101 void G4BOptnForceFreeFlight::AlongMoveBy( const G4BiasingProcessInterface*, const G4Step*, G4double weightChange ) 97 const G4Step*, G4double weightCha << 98 { 102 { 99 fCumulatedWeightChange *= weightChange; 103 fCumulatedWeightChange *= weightChange; 100 } 104 } 101 105