39 aParticleChange.Initialize(aTrack);
41 G4ErrorPropagatorData* g4edata = G4ErrorPropagatorData::GetErrorPropagatorData();
43 G4double kinEnergyStart = aTrack.GetKineticEnergy();
44 G4double step_length = aStep.GetStepLength();
46 const G4Material* aMaterial = aTrack.GetMaterial();
47 const G4ParticleDefinition* aParticleDef = aTrack.GetDynamicParticle()->GetDefinition();
48 G4double kinEnergyEnd = kinEnergyStart;
50 if (g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropBackwards)) {
55 G4double kinEnergyHalfStep = (kinEnergyStart + kinEnergyEnd) * 0.5;
57 B2DEBUG(200,
"ExtEnergyLoss::AlongStepDoIt() BWD end " << kinEnergyEnd <<
" halfstep " << kinEnergyHalfStep);
64 kinEnergyEnd = kinEnergyStart - (kinEnergyHalfStep - kinEnergyEnd);
65 }
else if (g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropForwards)) {
71 G4double kinEnergyHalfStep = (kinEnergyStart + kinEnergyEnd) * 0.5;
72 B2DEBUG(200,
"ExtEnergyLoss::AlongStepDoIt() FWD end " << kinEnergyEnd <<
" halfstep " << kinEnergyHalfStep);
79 kinEnergyEnd = kinEnergyStart - (kinEnergyHalfStep - kinEnergyEnd);
82 G4double edepo = kinEnergyEnd - kinEnergyStart;
84 B2DEBUG(300,
"ExtEnergyLoss::AlongStepDoIt() Estart= " << kinEnergyStart <<
" Eend " << kinEnergyEnd
85 <<
" Ediff " << -edepo <<
" step= " << step_length <<
" mate= " << aMaterial->GetName()
86 <<
" particle= " << aParticleDef->GetParticleName());
88 aParticleChange.ClearDebugFlag();
89 aParticleChange.ProposeLocalEnergyDeposit(edepo);
90 aParticleChange.SetNumberOfSecondaries(0);
92 aParticleChange.ProposeEnergy(kinEnergyEnd);
94 return &aParticleChange;
99 G4double currentMinimumStep,
102 G4double step = DBL_MAX;
104 G4double kinEnergyStart = aTrack.GetKineticEnergy();
105 G4double kinEnergyLoss = kinEnergyStart;
106 const G4Material* aMaterial = aTrack.GetMaterial();
107 const G4ParticleDefinition* aParticleDef = aTrack.GetDynamicParticle()->GetDefinition();
108 G4ErrorPropagatorData* g4edata = G4ErrorPropagatorData::GetErrorPropagatorData();
109 if (g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropBackwards)) {
110 kinEnergyLoss = - kinEnergyStart +
112 }
else if (g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropForwards)) {
113 kinEnergyLoss = kinEnergyStart -
116 B2DEBUG(300,
"ExtEnergyLoss::GetContinuousStepLimit() currentMinimumStep " << currentMinimumStep
117 <<
" kinEnergyLoss " << kinEnergyLoss <<
" kinEnergyStart " << kinEnergyStart);
118 if (kinEnergyLoss / kinEnergyStart >
m_StepLimit) {
119 step =
m_StepLimit / (kinEnergyLoss / kinEnergyStart) * currentMinimumStep;
120 B2DEBUG(300,
"ExtEnergyLoss::GetContinuousStepLimit() limiting Step " << step
121 <<
" energy loss fraction " << kinEnergyLoss / kinEnergyStart <<
" > " <<
m_StepLimit);