107 const G4Track* track = fastTrack.GetPrimaryTrack();
108 const G4ThreeVector& position = track->GetPosition();
109 const G4ThreeVector& direction = track->GetMomentumDirection();
112 input.
pdg = track->GetDefinition()->GetPDGEncoding();
113 input.
position[0] = position.x() / CLHEP::cm;
114 input.
position[1] = position.y() / CLHEP::cm;
115 input.
position[2] = position.z() / CLHEP::cm;
119 input.
kineticEnergy = track->GetKineticEnergy() / CLHEP::GeV;
120 input.
mass = track->GetDefinition()->GetPDGMass() / CLHEP::GeV;
121 input.
time = track->GetGlobalTime() / CLHEP::ns;
125 const G4int
level = envelopeDepth(track);
126 const G4VTouchable* touchable = track->GetTouchable();
127 const G4AffineTransform& toLocal =
128 touchable->GetHistory()->GetTransform(touchable->GetHistoryDepth() -
level);
129 const G4VSolid* envelopeSolid = touchable->GetVolume(
level)->GetLogicalVolume()->GetSolid();
131 input.
exitDistance = envelopeSolid->DistanceToOut(toLocal.TransformPoint(position),
132 toLocal.TransformAxis(direction)) /
135 const std::vector<FastSimOutput> outgoing =
sample(input);
137 fastStep.KillPrimaryTrack();
138 fastStep.ProposePrimaryTrackPathLength(input.
exitDistance * CLHEP::cm);
148 double outgoingKineticEnergy = 0.;
149 fastStep.SetNumberOfSecondaryTracks(outgoing.size());
150 for (
const auto& out : outgoing) {
151 const G4ParticleDefinition* definition =
152 G4ParticleTable::GetParticleTable()->FindParticle(out.pdg);
153 if (definition ==
nullptr) {
154 LOG(error) <<
"fast simulation: model " << GetName() <<
" returned unknown pdg " << out.pdg
155 <<
"; particle dropped";
158 const G4ThreeVector momentum(out.momentum[0] * CLHEP::GeV, out.momentum[1] * CLHEP::GeV,
159 out.momentum[2] * CLHEP::GeV);
160 G4DynamicParticle particle(definition, momentum);
161 outgoingKineticEnergy += particle.GetKineticEnergy();
162 fastStep.CreateSecondaryTrack(particle,
163 G4ThreeVector(out.position[0] * CLHEP::cm,
164 out.position[1] * CLHEP::cm,
165 out.position[2] * CLHEP::cm),
166 out.time * CLHEP::ns,
false);
170 fastStep.ProposeTotalEnergyDeposited(
171 std::max(0., track->GetKineticEnergy() - outgoingKineticEnergy));