256{
257
259 G4cout <<
"Calling SampleSecondaries() of G4DNATripleIonisationModel"
261 }
262
263
265
266
268
269
270 const auto& pname = pdef->GetParticleName();
271
272
274
275
276
277
278 if (ekin < low_energy_lim) {
282 return;
283 }
284
285
286 constexpr G4int kNumSecondaries = 3;
287 constexpr G4double kDeltaTheta =
pi * 0.666666667;
288
289 G4int ioni_shell[kNumSecondaries] = {0, 0, 0};
290 G4double shell_energy[kNumSecondaries];
291
293 scale_param *= scale_param;
294
296 while (1) {
300 is_continue = (ioni_shell[0] == ioni_shell[1] &&
301 ioni_shell[1] == ioni_shell[2]);
302 if (!is_continue) { break; }
303 }
304
306 for (int i = 0; i < kNumSecondaries; i++) {
307 shell_energy[i] = ::water_structure.IonisationEnergy(ioni_shell[i]);
308 tot_ioni_energy += shell_energy[i];
309 }
310
312 return;
313 }
314
315
316 G4double theta{0.0}, phi{0.0}, tot_ekin2{0.0};
317 for (int i = 0; i < kNumSecondaries; i++) {
319 theta, phi, shell_energy[i]);
320 theta += kDeltaTheta;
321 }
322
323
325 G4Exception(
"G4DNATripleIonisatioModel::SampleSecondaries()",
327 }
328
329
330
333
334 const auto scattered_energy = ekin - tot_ioni_energy - tot_ekin2;
335
336
337 tot_ioni_energy = shell_energy[0] + shell_energy[1] + shell_energy[2];
338
342 ekin - scattered_energy);
343 } else {
346 }
347
348
349
353
354
355}
G4int RandomSelect(G4double energy, G4double scale_param, const G4String &pname)
G4double GenerateSecondaries(std::vector< G4DynamicParticle * > *vsec, const G4MaterialCutsCouple *couple, const G4DynamicParticle *particle, G4int ioni_shell, G4double &theta, G4double &phi, G4double &shell_energy)
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const