00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "G4VDiscreteProcess.hh"
00040 #include "G4SystemOfUnits.hh"
00041
00042 #include "G4Step.hh"
00043 #include "G4Track.hh"
00044 #include "G4MaterialTable.hh"
00045 #include "G4VParticleChange.hh"
00046
00047 G4VDiscreteProcess::G4VDiscreteProcess()
00048 :G4VProcess("No Name Discrete Process")
00049 {
00050 G4Exception("G4VDiscreteProcess::G4VDiscreteProcess()","ProcMan102",
00051 JustWarning,"Default constructor is called");
00052 }
00053
00054 G4VDiscreteProcess::G4VDiscreteProcess(const G4String& aName , G4ProcessType aType)
00055 : G4VProcess(aName, aType)
00056 {
00057 enableAtRestDoIt = false;
00058 enableAlongStepDoIt = false;
00059
00060 }
00061
00062 G4VDiscreteProcess::~G4VDiscreteProcess()
00063 {
00064 }
00065
00066 G4VDiscreteProcess::G4VDiscreteProcess(G4VDiscreteProcess& right)
00067 : G4VProcess(right)
00068 {
00069 }
00070
00071 G4double G4VDiscreteProcess::PostStepGetPhysicalInteractionLength(
00072 const G4Track& track,
00073 G4double previousStepSize,
00074 G4ForceCondition* condition
00075 )
00076 {
00077 if ( (previousStepSize < 0.0) || (theNumberOfInteractionLengthLeft<=0.0)) {
00078
00079 ResetNumberOfInteractionLengthLeft();
00080 } else if ( previousStepSize > 0.0) {
00081
00082 SubtractNumberOfInteractionLengthLeft(previousStepSize);
00083 } else {
00084
00085
00086 }
00087
00088
00089 *condition = NotForced;
00090
00091
00092 currentInteractionLength = GetMeanFreePath(track, previousStepSize, condition);
00093
00094 G4double value;
00095 if (currentInteractionLength <DBL_MAX) {
00096 value = theNumberOfInteractionLengthLeft * currentInteractionLength;
00097 } else {
00098 value = DBL_MAX;
00099 }
00100 #ifdef G4VERBOSE
00101 if (verboseLevel>1){
00102 G4cout << "G4VDiscreteProcess::PostStepGetPhysicalInteractionLength ";
00103 G4cout << "[ " << GetProcessName() << "]" <<G4endl;
00104 track.GetDynamicParticle()->DumpInfo();
00105 G4cout << " in Material " << track.GetMaterial()->GetName() <<G4endl;
00106 G4cout << "InteractionLength= " << value/cm <<"[cm] " <<G4endl;
00107 }
00108 #endif
00109 return value;
00110 }
00111
00112 G4VParticleChange* G4VDiscreteProcess::PostStepDoIt(
00113 const G4Track& ,
00114 const G4Step&
00115 )
00116 {
00117
00118 ClearNumberOfInteractionLengthLeft();
00119
00120 return pParticleChange;
00121 }