Ntuple columns based on user-defined number of detectors

Hi all,

In my UserDetectorConstruction, I place detectors whose number/properties are set by user-defined values in a macro. In my output file, I’d like to save an Ntuple with a number of columns determined by the actual number of detectors placed, so that the output rows look something like:

event ID, energy deposit in detector 1, …, energy deposit in detector N

But I’m not sure how to set the correct number of branches in the Ntuple to be based on the number of placed detectors N.

Currently, I initialize Ntuples in the constructor of UserRunAction; however, when pulling the number of placed detectors from UserDetectorConstruction, a zero is returned. Therefore, I just use some value large enough (20) that every detector gets a column:

RunAction::RunAction(DetectorConstruction *dc, PrimaryGenerator *pg) : geometry(dc), source(pg) {
    auto aMan = G4AnalysisManager::Instance();
    aMan->SetDefaultFileType("root");
    aMan->SetVerboseLevel(0);
    aMan->SetNtupleMerging(true);
    aMan->SetFileName("output");
    aMan->Clear();
    aMan->Reset();

    aMan->CreateNtuple("test_name", "test_name");

    aMan->CreateNtupleIColumn("nevt"); // event ID
    aMan->CreateNtupleFColumn("ene"); // initial energy

    aMan->CreateNtupleFColumn("posx"); // initial position
    aMan->CreateNtupleFColumn("posy");
    aMan->CreateNtupleFColumn("posz");

    aMan->CreateNtupleFColumn("momx"); // initial direction
    aMan->CreateNtupleFColumn("momy");
    aMan->CreateNtupleFColumn("momz");

    //// record energy in each detector
    for( G4int i = 0; i < 20; i++ ) { 
        std::stringstream num;
        num << i;
        G4String id = "edep_" + num.str();
        aMan->CreateNtupleFColumn(id);
    }
    aMan->FinishNtuple(0);
}

But that can mean a lot of unused columns every event. Does anyone have advices for ways around this? Is it possible to delete unused columns before writing? Or initialize the TTrees after everything has been placed?

Thank you!