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 "G4VRestContinuousDiscreteProcess.hh"
00040 #include "G4SystemOfUnits.hh"
00041
00042 #include "G4Step.hh"
00043 #include "G4Track.hh"
00044 #include "G4MaterialTable.hh"
00045 #include "G4VParticleChange.hh"
00046
00047 G4VRestContinuousDiscreteProcess::G4VRestContinuousDiscreteProcess()
00048 :G4VProcess("No Name Discrete Process"),
00049 valueGPILSelection(CandidateForSelection)
00050 {
00051 G4Exception("G4VRestContinuousDiscreteProcess::G4VRestContinuousDiscreteProcess()",
00052 "ProcMan102",JustWarning,"Default constructor is called");
00053 }
00054
00055 G4VRestContinuousDiscreteProcess::G4VRestContinuousDiscreteProcess(const G4String& aName , G4ProcessType aType)
00056 : G4VProcess(aName, aType),
00057 valueGPILSelection(CandidateForSelection)
00058 {
00059 }
00060
00061 G4VRestContinuousDiscreteProcess::~G4VRestContinuousDiscreteProcess()
00062 {
00063 }
00064
00065 G4VRestContinuousDiscreteProcess::G4VRestContinuousDiscreteProcess(G4VRestContinuousDiscreteProcess& right)
00066 : G4VProcess(right),
00067 valueGPILSelection(right.valueGPILSelection)
00068 {
00069 }
00070
00071 G4double G4VRestContinuousDiscreteProcess::AtRestGetPhysicalInteractionLength(
00072 const G4Track& track,
00073 G4ForceCondition* condition
00074 )
00075 {
00076
00077 ResetNumberOfInteractionLengthLeft();
00078
00079
00080 *condition = NotForced;
00081
00082
00083 currentInteractionLength = GetMeanLifeTime(track, condition);
00084
00085 #ifdef G4VERBOSE
00086 if ((currentInteractionLength <0.0) || (verboseLevel>2)){
00087 G4cout << "G4VRestContinuousDiscreteProcess::AtRestGetPhysicalInteractionLength ";
00088 G4cout << "[ " << GetProcessName() << "]" <<G4endl;
00089 track.GetDynamicParticle()->DumpInfo();
00090 G4cout << " in Material " << track.GetMaterial()->GetName() <<G4endl;
00091 G4cout << "MeanLifeTime = " << currentInteractionLength/ns << "[ns]" <<G4endl;
00092 }
00093 #endif
00094
00095 return theNumberOfInteractionLengthLeft * currentInteractionLength;
00096 }
00097
00098
00099 G4VParticleChange* G4VRestContinuousDiscreteProcess::AtRestDoIt(
00100 const G4Track&,
00101 const G4Step&
00102 )
00103 {
00104
00105 ClearNumberOfInteractionLengthLeft();
00106
00107 return pParticleChange;
00108 }
00109
00110 G4double G4VRestContinuousDiscreteProcess::AlongStepGetPhysicalInteractionLength(
00111 const G4Track& track,
00112 G4double previousStepSize,
00113 G4double currentMinimumStep,
00114 G4double& currentSafety,
00115 G4GPILSelection* selection
00116 )
00117 {
00118
00119 valueGPILSelection = CandidateForSelection;
00120
00121
00122 G4double steplength = GetContinuousStepLimit(track,previousStepSize,currentMinimumStep, currentSafety);
00123
00124
00125 *selection = valueGPILSelection;
00126
00127 #ifdef G4VERBOSE
00128 if (verboseLevel>1){
00129 G4cout << "G4VRestContinuousDiscreteProcess::AlongStepGetPhysicalInteractionLength ";
00130 G4cout << "[ " << GetProcessName() << "]" <<G4endl;
00131 track.GetDynamicParticle()->DumpInfo();
00132 G4cout << " in Material " << track.GetMaterial()->GetName() <<G4endl;
00133 G4cout << "IntractionLength= " << steplength/cm <<"[cm] " <<G4endl;
00134 }
00135 #endif
00136 return steplength ;
00137 }
00138
00139 G4VParticleChange* G4VRestContinuousDiscreteProcess::AlongStepDoIt(
00140 const G4Track& ,
00141 const G4Step&
00142 )
00143 {
00144 return pParticleChange;
00145 }
00146
00147 G4double G4VRestContinuousDiscreteProcess::PostStepGetPhysicalInteractionLength(
00148 const G4Track& track,
00149 G4double previousStepSize,
00150 G4ForceCondition* condition
00151 )
00152 {
00153 if ( (previousStepSize < 0.0) || (theNumberOfInteractionLengthLeft<=0.0)) {
00154
00155 ResetNumberOfInteractionLengthLeft();
00156 } else if ( previousStepSize > 0.0) {
00157
00158 SubtractNumberOfInteractionLengthLeft(previousStepSize);
00159 } else {
00160
00161
00162 }
00163
00164
00165 *condition = NotForced;
00166
00167
00168 currentInteractionLength = GetMeanFreePath(track, previousStepSize, condition);
00169
00170
00171 G4double value;
00172 if (currentInteractionLength <DBL_MAX) {
00173 value = theNumberOfInteractionLengthLeft * currentInteractionLength;
00174 } else {
00175 value = DBL_MAX;
00176 }
00177 #ifdef G4VERBOSE
00178 if (verboseLevel>1){
00179 G4cout << "G4VRestContinuousDiscreteProcess::PostStepGetPhysicalInteractionLength ";
00180 G4cout << "[ " << GetProcessName() << "]" <<G4endl;
00181 track.GetDynamicParticle()->DumpInfo();
00182 G4cout << " in Material " << track.GetMaterial()->GetName() <<G4endl;
00183 G4cout << "InteractionLength= " << value/cm <<"[cm] " <<G4endl;
00184 }
00185 #endif
00186 return value;
00187 }
00188
00189 G4VParticleChange* G4VRestContinuousDiscreteProcess::PostStepDoIt(
00190 const G4Track& ,
00191 const G4Step&
00192 )
00193 {
00194
00195 ClearNumberOfInteractionLengthLeft();
00196
00197 return pParticleChange;
00198 }