Belle II Software  release-05-01-25
ExtEnergyLoss.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010-2011 Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Leo Piilonen *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <simulation/kernel/ExtEnergyLoss.h>
12 #include <simulation/kernel/EnergyLossForExtrapolator.h>
13 
14 #include <G4ErrorPropagatorData.hh>
15 
16 #include <framework/logging/Logger.h>
17 
18 using namespace std;
19 using namespace Belle2;
20 using namespace Belle2::Simulation;
21 
22 ExtEnergyLoss::ExtEnergyLoss(const G4String& processName, G4ProcessType type)
23  : G4VContinuousProcess(processName, type), m_energyLossForExtrapolator(NULL)
24 {
25  B2DEBUG(200, "ExtEnergyLoss is created");
26  if (m_energyLossForExtrapolator == NULL) {
28  }
29  m_StepLimit = 1.0; // fraction of kinetic energy that could be lost in one step
30  if (false) {
31  G4Track aTrack;
32  G4Step aStep;
33  double dummy;
34  AlongStepDoIt(aTrack, aStep);
35  GetContinuousStepLimit(aTrack, 0.0, 0.0, dummy);
36  }
37 }
38 
40 {
41  if (m_energyLossForExtrapolator != NULL) {
43  }
44 }
45 
46 G4VParticleChange* ExtEnergyLoss::AlongStepDoIt(const G4Track& aTrack, const G4Step& aStep)
47 {
48  aParticleChange.Initialize(aTrack);
49 
50  G4ErrorPropagatorData* g4edata = G4ErrorPropagatorData::GetErrorPropagatorData();
51 
52  G4double kinEnergyStart = aTrack.GetKineticEnergy();
53  G4double step_length = aStep.GetStepLength();
54 
55  const G4Material* aMaterial = aTrack.GetMaterial();
56  const G4ParticleDefinition* aParticleDef = aTrack.GetDynamicParticle()->GetDefinition();
57  G4double kinEnergyEnd = kinEnergyStart;
58 
59  if (g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropBackwards)) {
60  kinEnergyEnd = m_energyLossForExtrapolator->EnergyBeforeStep(kinEnergyStart,
61  step_length,
62  aMaterial,
63  aParticleDef);
64  G4double kinEnergyHalfStep = (kinEnergyStart + kinEnergyEnd) * 0.5;
65 
66  B2DEBUG(200, "ExtEnergyLoss::AlongStepDoIt() BWD end " << kinEnergyEnd << " halfstep " << kinEnergyHalfStep);
67 
68  // rescale to energy lost at midpoint of step
69  kinEnergyEnd = m_energyLossForExtrapolator->EnergyBeforeStep(kinEnergyHalfStep,
70  step_length,
71  aMaterial,
72  aParticleDef);
73  kinEnergyEnd = kinEnergyStart - (kinEnergyHalfStep - kinEnergyEnd);
74  } else if (g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropForwards)) {
75 
76  kinEnergyEnd = m_energyLossForExtrapolator->EnergyAfterStep(kinEnergyStart,
77  step_length,
78  aMaterial,
79  aParticleDef);
80  G4double kinEnergyHalfStep = (kinEnergyStart + kinEnergyEnd) * 0.5;
81  B2DEBUG(200, "ExtEnergyLoss::AlongStepDoIt() FWD end " << kinEnergyEnd << " halfstep " << kinEnergyHalfStep);
82 
83  // rescale to energy lost at midpoint of step
84  kinEnergyEnd = m_energyLossForExtrapolator->EnergyAfterStep(kinEnergyHalfStep,
85  step_length,
86  aMaterial,
87  aParticleDef);
88  kinEnergyEnd = kinEnergyStart - (kinEnergyHalfStep - kinEnergyEnd);
89  }
90 
91  G4double edepo = kinEnergyEnd - kinEnergyStart;
92 
93  B2DEBUG(300, "ExtEnergyLoss::AlongStepDoIt() Estart= " << kinEnergyStart << " Eend " << kinEnergyEnd
94  << " Ediff " << -edepo << " step= " << step_length << " mate= " << aMaterial->GetName()
95  << " particle= " << aParticleDef->GetParticleName());
96 
97  aParticleChange.ClearDebugFlag();
98  aParticleChange.ProposeLocalEnergyDeposit(edepo);
99  aParticleChange.SetNumberOfSecondaries(0);
100 
101  aParticleChange.ProposeEnergy(kinEnergyEnd);
102 
103  return &aParticleChange;
104 }
105 
106 G4double ExtEnergyLoss::GetContinuousStepLimit(const G4Track& aTrack,
107  G4double,
108  G4double currentMinimumStep,
109  G4double&)
110 {
111  G4double step = DBL_MAX;
112  if (m_StepLimit < 1.0) {
113  G4double kinEnergyStart = aTrack.GetKineticEnergy();
114  G4double kinEnergyLoss = kinEnergyStart;
115  const G4Material* aMaterial = aTrack.GetMaterial();
116  const G4ParticleDefinition* aParticleDef = aTrack.GetDynamicParticle()->GetDefinition();
117  G4ErrorPropagatorData* g4edata = G4ErrorPropagatorData::GetErrorPropagatorData();
118  if (g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropBackwards)) {
119  kinEnergyLoss = - kinEnergyStart +
120  m_energyLossForExtrapolator->EnergyBeforeStep(kinEnergyStart, currentMinimumStep, aMaterial, aParticleDef);
121  } else if (g4edata->GetMode() == G4ErrorMode(G4ErrorMode_PropForwards)) {
122  kinEnergyLoss = kinEnergyStart -
123  m_energyLossForExtrapolator->EnergyAfterStep(kinEnergyStart, currentMinimumStep, aMaterial, aParticleDef);
124  }
125  B2DEBUG(300, "ExtEnergyLoss::GetContinuousStepLimit() currentMinimumStep " << currentMinimumStep
126  << " kinEnergyLoss " << kinEnergyLoss << " kinEnergyStart " << kinEnergyStart);
127  if (kinEnergyLoss / kinEnergyStart > m_StepLimit) {
128  step = m_StepLimit / (kinEnergyLoss / kinEnergyStart) * currentMinimumStep;
129  B2DEBUG(300, "ExtEnergyLoss::GetContinuousStepLimit() limiting Step " << step
130  << " energy loss fraction " << kinEnergyLoss / kinEnergyStart << " > " << m_StepLimit);
131  }
132  }
133 
134  return step;
135 
136 }
137 
Belle2::Simulation::EnergyLossForExtrapolator::EnergyBeforeStep
G4double EnergyBeforeStep(G4double kinEnergy, G4double step, const G4Material *, const G4ParticleDefinition *)
Get kinetic energy before a step in given material by given particle.
Definition: EnergyLossForExtrapolator.cc:163
Belle2::Simulation::ExtEnergyLoss::m_StepLimit
G4double m_StepLimit
Step limit for this process (fraction of KE that could be lost in one step)
Definition: ExtEnergyLoss.h:65
Belle2::Simulation::EnergyLossForExtrapolator
Calculate energy loss, fluctuation, and multiple-scattering angle for extrapolator.
Definition: EnergyLossForExtrapolator.h:37
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::Simulation::ExtEnergyLoss::m_energyLossForExtrapolator
EnergyLossForExtrapolator * m_energyLossForExtrapolator
Pointer to the geant4e-specific energy-loss and mult-scat class.
Definition: ExtEnergyLoss.h:62
Belle2::Simulation::ExtEnergyLoss::AlongStepDoIt
G4VParticleChange * AlongStepDoIt(const G4Track &, const G4Step &)
Apply energy loss process along the step.
Definition: ExtEnergyLoss.cc:46
Belle2::Simulation::EnergyLossForExtrapolator::EnergyAfterStep
G4double EnergyAfterStep(G4double kinEnergy, G4double step, const G4Material *, const G4ParticleDefinition *)
Get kinetic energy after a step in given material by given particle.
Definition: EnergyLossForExtrapolator.cc:139
Belle2::Simulation::ExtEnergyLoss::GetContinuousStepLimit
G4double GetContinuousStepLimit(const G4Track &, G4double, G4double, G4double &)
Gets step limit for the particle being swum.
Definition: ExtEnergyLoss.cc:106
Belle2::Simulation::ExtEnergyLoss::~ExtEnergyLoss
virtual ~ExtEnergyLoss()
destructor
Definition: ExtEnergyLoss.cc:39