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 "G4VRestDiscreteProcess.hh"
00040 #include "G4SystemOfUnits.hh"
00041
00042 #include "Randomize.hh"
00043 #include "G4Step.hh"
00044 #include "G4Track.hh"
00045 #include "G4MaterialTable.hh"
00046 #include "G4VParticleChange.hh"
00047
00048 G4VRestDiscreteProcess::G4VRestDiscreteProcess()
00049 :G4VProcess("No Name Discrete Process")
00050 {
00051 G4Exception("G4VRestDiscreteProcess::G4VRestDiscreteProcess","ProcMan102",
00052 JustWarning,"Default constructor is called");
00053 }
00054
00055 G4VRestDiscreteProcess::G4VRestDiscreteProcess(const G4String& aName , G4ProcessType aType)
00056 : G4VProcess(aName, aType)
00057 {
00058 enableAlongStepDoIt = false;
00059 }
00060
00061 G4VRestDiscreteProcess::~G4VRestDiscreteProcess()
00062 {
00063 }
00064
00065 G4VRestDiscreteProcess::G4VRestDiscreteProcess(G4VRestDiscreteProcess& right)
00066 : G4VProcess(right)
00067 {
00068 }
00069
00070 G4double G4VRestDiscreteProcess::PostStepGetPhysicalInteractionLength(
00071 const G4Track& track,
00072 G4double previousStepSize,
00073 G4ForceCondition* condition
00074 )
00075 {
00076 if ( (previousStepSize < 0.0) || (theNumberOfInteractionLengthLeft<=0.0)) {
00077
00078 ResetNumberOfInteractionLengthLeft();
00079 } else if ( previousStepSize > 0.0) {
00080
00081 SubtractNumberOfInteractionLengthLeft(previousStepSize);
00082 } else {
00083
00084
00085 }
00086
00087
00088 *condition = NotForced;
00089
00090
00091 currentInteractionLength = GetMeanFreePath(track, previousStepSize, condition);
00092
00093 G4double value;
00094 if (currentInteractionLength <DBL_MAX) {
00095 value = theNumberOfInteractionLengthLeft * currentInteractionLength;
00096 } else {
00097 value = DBL_MAX;
00098 }
00099 #ifdef G4VERBOSE
00100 if (verboseLevel>1){
00101 G4cout << "G4VRestDiscreteProcess::PostStepGetPhysicalInteractionLength ";
00102 G4cout << "[ " << GetProcessName() << "]" <<G4endl;
00103 track.GetDynamicParticle()->DumpInfo();
00104 G4cout << " in Material " << track.GetMaterial()->GetName() <<G4endl;
00105 G4cout << "InteractionLength= " << value/cm <<"[cm] " <<G4endl;
00106 }
00107 #endif
00108 return value;
00109 }
00110
00111 G4VParticleChange* G4VRestDiscreteProcess::PostStepDoIt(
00112 const G4Track& ,
00113 const G4Step&
00114 )
00115 {
00116
00117 ClearNumberOfInteractionLengthLeft();
00118
00119 return pParticleChange;
00120 }
00121
00122 G4double G4VRestDiscreteProcess::AtRestGetPhysicalInteractionLength(
00123 const G4Track& track,
00124 G4ForceCondition* condition
00125 )
00126 {
00127
00128 ResetNumberOfInteractionLengthLeft();
00129
00130
00131 *condition = NotForced;
00132
00133
00134 currentInteractionLength = GetMeanLifeTime(track, condition);
00135
00136 #ifdef G4VERBOSE
00137 if ((currentInteractionLength <0.0) || (verboseLevel>2)){
00138 G4cout << "G4VRestDiscreteProcess::AtRestGetPhysicalInteractionLength ";
00139 G4cout << "[ " << GetProcessName() << "]" <<G4endl;
00140 track.GetDynamicParticle()->DumpInfo();
00141 G4cout << " in Material " << track.GetMaterial()->GetName() <<G4endl;
00142 G4cout << "MeanLifeTime = " << currentInteractionLength/ns << "[ns]" <<G4endl;
00143 }
00144 #endif
00145
00146 return theNumberOfInteractionLengthLeft * currentInteractionLength;
00147 }
00148
00149
00150 G4VParticleChange* G4VRestDiscreteProcess::AtRestDoIt(
00151 const G4Track&,
00152 const G4Step&
00153 )
00154 {
00155
00156 ClearNumberOfInteractionLengthLeft();
00157
00158 return pParticleChange;
00159 }