ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4ErrorEnergyLoss.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4ErrorEnergyLoss.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 
27 #include "G4ErrorEnergyLoss.hh"
28 #include "G4ErrorPropagatorData.hh"
30 
31 //-------------------------------------------------------------------
33  G4ProcessType type)
34  : G4VContinuousProcess(processName, type)
35 {
36  if (verboseLevel>2) {
37  G4cout << GetProcessName() << " is created " << G4endl;
38  }
39 
41 
42  theStepLimit = 1.;
43 }
44 
45 //-------------------------------------------------------------------
47 {}
48 
49 
50 //-------------------------------------------------------------------
52 {
54 }
55 
56 //-------------------------------------------------------------------
58 G4ErrorEnergyLoss::AlongStepDoIt(const G4Track& aTrack, const G4Step& aStep)
59 {
61 
63 
64  G4double kinEnergyStart = aTrack.GetKineticEnergy();
65  G4double step_length = aStep.GetStepLength();
66 
67  const G4Material* aMaterial = aTrack.GetMaterial();
68  const G4ParticleDefinition* aParticleDef = aTrack.GetDynamicParticle()->GetDefinition();
69  G4double kinEnergyEnd = kinEnergyStart;
70 
71  if( g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropBackwards) ) {
72  kinEnergyEnd = theELossForExtrapolator->EnergyBeforeStep( kinEnergyStart,
73  step_length,
74  aMaterial,
75  aParticleDef );
76  G4double kinEnergyHalfStep = kinEnergyStart - (kinEnergyStart-kinEnergyEnd)/2.;
77 
78 #ifdef G4VERBOSE
80  G4cout << " G4ErrorEnergyLoss FWD end " << kinEnergyEnd
81  << " halfstep " << kinEnergyHalfStep << G4endl;
82 #endif
83 
84  //--- rescale to energy lost at 1/2 step
85  kinEnergyEnd = theELossForExtrapolator->EnergyBeforeStep( kinEnergyHalfStep,
86  step_length,
87  aMaterial,
88  aParticleDef );
89  kinEnergyEnd = kinEnergyStart - (kinEnergyHalfStep - kinEnergyEnd );
90  }else if( g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropForwards) ) {
91  kinEnergyEnd = theELossForExtrapolator->EnergyAfterStep( kinEnergyStart,
92  step_length,
93  aMaterial,
94  aParticleDef );
95  G4double kinEnergyHalfStep = kinEnergyStart - (kinEnergyStart-kinEnergyEnd)/2.;
96 #ifdef G4VERBOSE
98  G4cout << " G4ErrorEnergyLoss BCKD end " << kinEnergyEnd
99  << " halfstep " << kinEnergyHalfStep << G4endl;
100 #endif
101 
102  //--- rescale to energy lost at 1/2 step
103  kinEnergyEnd = theELossForExtrapolator->EnergyAfterStep( kinEnergyHalfStep,
104  step_length,
105  aMaterial,
106  aParticleDef );
107  kinEnergyEnd = kinEnergyStart - (kinEnergyHalfStep - kinEnergyEnd );
108  }
109 
110  G4double edepo = kinEnergyEnd - kinEnergyStart;
111 
112 #ifdef G4VERBOSE
113  if( G4ErrorPropagatorData::verbose() >= 2 )
114  G4cout << "AlongStepDoIt Estart= " << kinEnergyStart << " Eend " << kinEnergyEnd
115  << " Ediff " << kinEnergyStart-kinEnergyEnd << " step= " << step_length
116  << " mate= " << aMaterial->GetName()
117  << " particle= " << aParticleDef->GetParticleName() << G4endl;
118 #endif
119 
123 
124  aParticleChange.ProposeEnergy( kinEnergyEnd );
125 
126  return &aParticleChange;
127 }
128 
129 
130 //-------------------------------------------------------------------
132  G4double ,
133  G4double currentMinimumStep,
134  G4double& )
135 {
136  G4double Step = DBL_MAX;
137  if( theStepLimit != 1. ) {
138  G4double kinEnergyStart = aTrack.GetKineticEnergy();
139  G4double kinEnergyLoss = kinEnergyStart;
140  const G4Material* aMaterial = aTrack.GetMaterial();
141  const G4ParticleDefinition* aParticleDef = aTrack.GetDynamicParticle()->GetDefinition();
143  if( g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropBackwards) ) {
144  kinEnergyLoss = - kinEnergyStart +
145  theELossForExtrapolator->EnergyBeforeStep( kinEnergyStart, currentMinimumStep,
146  aMaterial, aParticleDef );
147  }else if( g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropForwards) ) {
148  kinEnergyLoss = kinEnergyStart -
149  theELossForExtrapolator->EnergyAfterStep( kinEnergyStart, currentMinimumStep,
150  aMaterial, aParticleDef );
151  }
152 #ifdef G4VERBOSE
153  if(G4ErrorPropagatorData::verbose() >= 3 )
154  G4cout << " G4ErrorEnergyLoss: currentMinimumStep " <<currentMinimumStep
155  << " kinEnergyLoss " << kinEnergyLoss
156  << " kinEnergyStart " << kinEnergyStart << G4endl;
157 #endif
158  if( kinEnergyLoss / kinEnergyStart > theStepLimit ) {
159  Step = theStepLimit / (kinEnergyLoss / kinEnergyStart) * currentMinimumStep;
160 #ifdef G4VERBOSE
161  if(G4ErrorPropagatorData::verbose() >= 2 )
162  G4cout << " G4ErrorEnergyLoss: limiting Step " << Step
163  << " energy loss fraction " << kinEnergyLoss / kinEnergyStart
164  << " > " << theStepLimit << G4endl;
165 #endif
166  }
167  }
168 
169  return Step;
170 
171 }