84 G4FastStep& fastStep) {
86 G4ThreeVector localdir = fastTrack.GetPrimaryTrackLocalDirection();
87 G4ThreeVector localpos = fastTrack.GetPrimaryTrackLocalPosition();
89 double ekin_MeV = fastTrack.GetPrimaryTrack()->GetKineticEnergy() / MeV;
90 double globalTime = fastTrack.GetPrimaryTrack()->GetGlobalTime();
92 G4String particleName =
93 fastTrack.GetPrimaryTrack()->GetParticleDefinition()->GetParticleName();
95 fastStep.KillPrimaryTrack();
96 fastStep.SetPrimaryTrackPathLength(0.0);
98 if (particleName ==
"kaon+") {
100 }
else if (particleName ==
"kaon-") {
102 }
else if (particleName ==
"anti_proton") {
103 particleName =
"anti-proton";
106 fGarfieldPhysics->DoIt(
107 particleName, ekin_MeV, globalTime, localpos.x() / CLHEP::cm,
108 localpos.y() / CLHEP::cm, localpos.z() / CLHEP::cm,
109 localdir.x(), localdir.y(), localdir.z());
111 fastStep.SetTotalEnergyDeposited(fGarfieldPhysics->GetEnergyDeposit_MeV());
113 if (!fGarfieldPhysics->GetCreateSecondariesInGeant4())
return;
114 const auto& secondaryParticles = fGarfieldPhysics->GetSecondaryParticles();
116 if (secondaryParticles.empty())
return;
117 fastStep.SetNumberOfSecondaryTracks(secondaryParticles.size());
119 G4double totalEnergySecondaries_MeV = 0.;
121 for (
const auto& sp : secondaryParticles) {
122 G4double eKin_MeV = sp.getEkin_MeV();
123 G4double time = sp.getTime();
124 G4ThreeVector momentumDirection(sp.getDX(), sp.getDY(), sp.getDZ());
125 G4ThreeVector position(sp.getX_mm(), sp.getY_mm(), sp.getZ_mm());
126 if (sp.getParticleName() ==
"e-") {
127 G4DynamicParticle particle(G4Electron::ElectronDefinition(),
128 momentumDirection, eKin_MeV);
129 fastStep.CreateSecondaryTrack(particle, position, time,
true);
130 totalEnergySecondaries_MeV += eKin_MeV;
131 }
else if (sp.getParticleName() ==
"gamma") {
132 G4DynamicParticle particle(G4Gamma::GammaDefinition(),
133 momentumDirection, eKin_MeV);
134 fastStep.CreateSecondaryTrack(particle, position, time,
true);
135 totalEnergySecondaries_MeV += eKin_MeV;