Extract history from the internal G4CascadeHistory Navigates: this->collider->theIntraNucleiCascader->theCascadeHistory.
280 {
281
282 if (!collider) return;
283
284 G4IntraNucleiCascader* cascader = collider->theIntraNucleiCascader;
285 if (!cascader) return;
286
287 G4CascadeHistory* g4_history = cascader->theCascadeHistory;
288 if (!g4_history) return;
289
291
292 if (cascader->tnuclei) {
294 cascader->tnuclei->getZ());
295 }
296
297 const std::vector<G4CascadeHistory::HistoryEntry>& entries =
298 g4_history->theHistory;
299
300 if (entries.empty()) {
301 return;
302 }
303
304
305 std::vector<int> parent_ids(entries.size(), -1);
306
307 for (size_t i = 0; i < entries.size(); ++i) {
308 const auto& entry = entries[i];
309 for (int d = 0; d < entry.n && d < 10; ++d) {
310 int daughter_id = entry.dId[d];
311 if (daughter_id >= 0 &&
312 static_cast<size_t>(daughter_id) < entries.size()) {
313 parent_ids[daughter_id] = static_cast<int>(i);
314 }
315 }
316 }
317
318
319 std::vector<ldmx::CascadeStep> steps;
320 steps.reserve(entries.size());
321
322 for (size_t i = 0; i < entries.size(); ++i) {
323 const auto& entry = entries[i];
324 int parent_id = parent_ids[i];
325
327
328 const G4CascadParticle& cpart = entry.cpart;
329 const G4InuclElementaryParticle& particle = cpart.getParticle();
330
331 step.setHistoryId(cpart.getHistoryId());
332 step.setParentId(parent_id);
333 step.setPdgId(getPdgCode(particle.type()));
334
335
336 G4LorentzVector mom = cpart.getMomentum();
337 step.setMomentum(mom.px() * 1000.0, mom.py() * 1000.0, mom.pz() * 1000.0,
338 mom.e() * 1000.0);
339
340 const G4ThreeVector& pos = cpart.getPosition();
341 step.setPosition(pos.x(), pos.y(), pos.z());
342
343 step.setGeneration(cpart.getGeneration());
344 step.setZone(cpart.getCurrentZone());
345
346 std::vector<int> daughter_ids;
347 for (int d = 0; d < entry.n && d < 10; ++d) {
348 daughter_ids.push_back(entry.dId[d]);
349 }
350 step.setDaughterIds(daughter_ids);
351
352 bool interacted = (entry.n > 0);
353 step.setInteracted(interacted);
354
355
356
357 bool escaped = !interacted && cpart.getGeneration() >= 0;
358 step.setEscaped(escaped);
359 step.setTargetPdgId(0);
360
362 int generation = cpart.getGeneration();
363
364 if (generation == 0) {
365 stage = ldmx::CascadeStage::INCIDENT;
366 } else if (generation == 1) {
367 stage = ldmx::CascadeStage::PRIMARY;
368 } else if (!interacted && !escaped) {
369 stage = ldmx::CascadeStage::ABSORBED;
370 } else if (escaped && generation <= 2) {
371 stage = ldmx::CascadeStage::PREEQUILIBRIUM;
372 } else {
373 stage = ldmx::CascadeStage::CASCADE;
374 }
375 step.setStage(stage);
376
377 steps.push_back(std::move(step));
378 }
379
380
381 for (auto& step : steps) {
382 if (!step.didInteract()) continue;
383
384 int bullet_charge = getCharge(step.getPdgId());
385 int bullet_baryon = getBaryonNumber(step.getPdgId());
386 int daughter_charge = 0;
387 int daughter_baryon = 0;
388
389 for (int daughter_id : step.getDaughterIds()) {
390 for (const auto& s : steps) {
391 if (s.getHistoryId() == daughter_id) {
392 daughter_charge += getCharge(s.getPdgId());
393 daughter_baryon += getBaryonNumber(s.getPdgId());
394 break;
395 }
396 }
397 }
398
399 int delta_charge = daughter_charge - bullet_charge;
400 int delta_baryon = daughter_baryon - bullet_baryon;
401 step.setTargetPdgId(inferTargetPdg(delta_charge, delta_baryon));
402 }
403
405 for (auto& step : steps) {
407 }
408
409
410 double total_escaped_energy = 0.0;
411 int escaped_protons = 0;
412 int escaped_neutrons = 0;
413
415 if (step.didEscape()) {
416 total_escaped_energy += step.getKineticEnergy();
417 int pdg = step.getPdgId();
418 if (pdg == 2212)
419 escaped_protons++;
420 else if (pdg == 2112)
421 escaped_neutrons++;
422 }
423 }
424
425 double excitation_energy =
427 if (excitation_energy < 0) excitation_energy = 0;
429
432 int residual_a = target_a - escaped_protons - escaped_neutrons;
433 int residual_z = target_z - escaped_protons;
434 if (residual_a < 0) residual_a = 0;
435 if (residual_z < 0) residual_z = 0;
437}
CascadeStage
Classification of cascade particle stages.