add Spawning ntuple recording secondary births per step

Each step that spawns secondaries now writes one row per secondary to a
new Spawning ntuple (event_id, parent_track_id, parent_step_no,
child_track_id). This enables direct shower-tree reconstruction without
position joins. Requires the companion Geant4 submodule change that
pre-assigns track IDs in ProcessSecondariesFromParticleChange.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 10:25:08 +02:00
parent 718f9361f7
commit 9ea0718139
3 changed files with 21 additions and 1 deletions
+8
View File
@@ -112,6 +112,14 @@ RunAction::RunAction()
analysisManager->CreateNtupleDColumn("Ey"); // col 25 [V/m]
analysisManager->CreateNtupleDColumn("Ez"); // col 26 [V/m]
analysisManager->FinishNtuple();
// Spawning ntuple (one row per secondary born, ntuple id=2)
analysisManager->CreateNtuple("Spawning", "Spawning");
analysisManager->CreateNtupleIColumn("event_id"); // col 0
analysisManager->CreateNtupleIColumn("parent_track_id"); // col 1
analysisManager->CreateNtupleIColumn("parent_step_no"); // col 2
analysisManager->CreateNtupleIColumn("child_track_id"); // col 3
analysisManager->FinishNtuple();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+12
View File
@@ -87,6 +87,18 @@ void SteppingAction::UserSteppingAction(const G4Step* step)
auto track = step->GetTrack();
int evtId = G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID();
// Write one Spawning row per secondary born in this step (track IDs pre-assigned)
const auto* secondaries = step->GetSecondaryInCurrentStep();
if (secondaries) {
for (const G4Track* sec : *secondaries) {
analysisManager->FillNtupleIColumn(2, 0, evtId);
analysisManager->FillNtupleIColumn(2, 1, track->GetTrackID());
analysisManager->FillNtupleIColumn(2, 2, track->GetCurrentStepNumber());
analysisManager->FillNtupleIColumn(2, 3, sec->GetTrackID());
analysisManager->AddNtupleRow(2);
}
}
analysisManager->FillNtupleIColumn(1, 0, evtId);
analysisManager->FillNtupleIColumn(1, 1, track->GetTrackID());
analysisManager->FillNtupleIColumn(1, 2, track->GetCurrentStepNumber());