36.7. G4AnalysisManager Cheat Sheet
Table of Contents
Overview
The G4AnalysisManager class provides a simple, uniform interface to create histograms and ntuples, fill them during the simulation, and write them to file. It hides the details of specific backends such as ROOT, CSV, or XML and is designed to be used in user action classes, especially RunAction.
This cheat sheet summarizes the typical usage pattern and the most common methods you need in basic Geant4 applications.
Getting the Analysis Manager
G4AnalysisManager is a singleton. You never construct it directly with new. Instead you obtain the instance through the static Instance() method.
In a source file (for example RunAction.cc), include the header and get the instance:
#include "g4analysis.hh" // or "G4AnalysisManager.hh" depending on version
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
You normally acquire the pointer inside the constructor or in the BeginOfRunAction and EndOfRunAction methods of your RunAction class. The same singleton instance can be accessed in other user action classes such as EventAction or SteppingAction, always through Instance().
If you use multithreading, keep in mind that G4AnalysisManager is a per-thread object, not shared, so each worker thread has its own instance.
Configuring Output and Verbosity
Before creating histograms or ntuples, you should configure the analysis manager. This is usually done in the constructor of your RunAction or in BeginOfRunAction.
Typical configuration includes setting the output file name, choosing output type, and adjusting verbosity.
Basic configuration looks like this:
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
// Set default file type, for example "root", "csv", or "hbook" depending on build
analysisManager->SetDefaultFileType("root");
// Set the base file name (extension is added automatically by the backend)
analysisManager->SetFileName("myOutput");
// Set verbosity level (0 = silent, larger = more messages)
analysisManager->SetVerboseLevel(1);
// Optionally, enable or disable ntuple merging in multithreaded runs
analysisManager->SetNtupleMerging(true);
You can also control automatic file opening and closing. In most simple applications, you explicitly call OpenFile at the start of the run and Write followed by CloseFile at the end of the run.
Important rule
Always ensure that you call OpenFile() before filling any histograms or ntuples, and call Write() and CloseFile() at the end of the run. Otherwise, your data will not be saved.
Creating Histograms
You normally create histograms once per job, typically in the RunAction constructor or in BeginOfRunAction. Histograms are identified by an integer ID and optionally by a string name.
The most frequently used method creates one-dimensional histograms:
G4int id = analysisManager->CreateH1(
"Edep", // name (optional identifier string)
"Energy dep.", // title (for plots)
100, // number of bins
0.*keV, // lower edge
10.*MeV // upper edge
);You can also create 2D histograms for distributions in two variables, for example position:
analysisManager->CreateH2(
"XY", // name
"Hit position", // title
100, -5.*cm, 5.*cm, // x bins, x min, x max
100, -5.*cm, 5.*cm // y bins, y min, y max
);The return value is the numeric ID assigned to the histogram. It usually starts from 0 and increases with each call. You can either store this ID in a variable or rely on the order of creation and remember that the first histogram has ID 0, the second ID 1, and so on.
Important rule
Histogram IDs are integers assigned in the order of creation. Use consistent IDs when filling histograms. If you change the order of creation, you must also update all fill calls that use numeric IDs.
Filling Histograms
You fill histograms during the simulation, usually from EventAction, SteppingAction, or SensitiveDetector code, after you have accumulated some quantity such as energy deposition or position.
To fill a one-dimensional histogram run:
auto analysisManager = G4AnalysisManager::Instance();
G4double edep = ...; // some energy value in MeV, for example
analysisManager->FillH1(0, edep); // 0 is the histogram IDFor 2D histograms:
G4double x = ...;
G4double y = ...;
analysisManager->FillH2(1, x, y); // 1 is the 2D histogram ID
You can call FillH1 or FillH2 as many times as needed during an event. Geant4 increments the bin content corresponding to the given value.
If your values are not in the same units as the histogram range, convert them using Geant4 units before filling. This ensures consistent interpretation of the axes.
Creating Ntuples
Ntuples store per-event or per-hit data row by row. You define an ntuple and its columns once, then fill rows during the simulation.
You typically create ntuples and columns in the RunAction constructor or in BeginOfRunAction:
auto analysisManager = G4AnalysisManager::Instance();
// Create ntuple with ID 0 and name "Event"
analysisManager->CreateNtuple("Event", "Event data");
// Add columns with names and types
analysisManager->CreateNtupleIColumn("eventID"); // integer
analysisManager->CreateNtupleDColumn("Edep"); // double (energy)
analysisManager->CreateNtupleDColumn("x"); // position x
analysisManager->CreateNtupleDColumn("y");
analysisManager->CreateNtupleDColumn("z");
// Finish the ntuple definition
analysisManager->FinishNtuple();Common column-creation methods include:
| Method | Description |
|---|---|
CreateNtupleIColumn(name) | Integer column |
CreateNtupleFColumn(name) | Float column |
CreateNtupleDColumn(name) | Double column |
CreateNtupleSColumn(name) | String column |
There are also overloaded methods that attach columns to user-provided arrays or vectors, but for simple beginners applications the basic versions are usually enough.
If you need more than one ntuple, you can call CreateNtuple again and then define a separate set of columns, followed by FinishNtuple. Each ntuple has a numeric ID, starting from 0.
Important rule
Call FinishNtuple() after defining all columns for a given ntuple. Without this, the ntuple definition is incomplete and cannot be written correctly.
Filling Ntuples
You typically fill an ntuple row once per event in EndOfEventAction, or once per hit in the ProcessHits method of a sensitive detector.
The typical sequence is to set column values, then call AddNtupleRow:
auto analysisManager = G4AnalysisManager::Instance();
G4int eventID = ...;
G4double edep = ...;
G4double x = ...;
G4double y = ...;
G4double z = ...;
// ntuple ID 0, column IDs follow creation order
analysisManager->FillNtupleIColumn(0, eventID);
analysisManager->FillNtupleDColumn(1, edep);
analysisManager->FillNtupleDColumn(2, x);
analysisManager->FillNtupleDColumn(3, y);
analysisManager->FillNtupleDColumn(4, z);
// Finalize this row
analysisManager->AddNtupleRow();
The first argument to FillNtuple...Column is the column ID, which corresponds to the order in which you created the columns, starting at 0. For multiple ntuples, some versions of the interface provide overloaded methods that take ntuple ID and column ID separately. Consult the version of g4analysis.hh that you are using for the exact signatures.
You can fill only a subset of columns for a row if desired, but typically you fill all defined columns. Each call to AddNtupleRow() writes the current row into memory and resets any internal buffers for the next row.
Important rule
Always call AddNtupleRow() after filling columns for a row. Without this, the values set by FillNtuple...Column() will not be stored.
Opening, Writing, and Closing Files
The life cycle of the analysis file is usually controlled in BeginOfRunAction and EndOfRunAction. The usual pattern is:
In BeginOfRunAction:
auto analysisManager = G4AnalysisManager::Instance();
// The file name and type should already be set
analysisManager->OpenFile();
In EndOfRunAction:
auto analysisManager = G4AnalysisManager::Instance();
// Write all histograms and ntuples to the file
analysisManager->Write();
// Close the file properly
analysisManager->CloseFile();
You can also pass a file name to OpenFile directly:
analysisManager->OpenFile("run1");This overrides the default file name for that run.
If you perform several runs in the same session and want separate output files, you can change the file name before each call to OpenFile, for example by appending the run ID.
Important rule
Call Write() before CloseFile() to ensure that all buffered data are flushed to disk. Forgetting Write() may result in empty or incomplete output files.
Common Usage Pattern in RunAction
The following compact example shows a typical way to integrate G4AnalysisManager in a simple application. The example omits error checks and focuses on key calls.
In the RunAction.hh:
#include "G4UserRunAction.hh"
class RunAction : public G4UserRunAction {
public:
RunAction();
~RunAction() override;
void BeginOfRunAction(const G4Run*) override;
void EndOfRunAction(const G4Run*) override;
};
In RunAction.cc:
#include "RunAction.hh"
#include "g4analysis.hh"
RunAction::RunAction() : G4UserRunAction() {
auto analysisManager = G4AnalysisManager::Instance();
analysisManager->SetVerboseLevel(1);
analysisManager->SetFileName("output");
// Create histograms
analysisManager->CreateH1("Edep", "Energy deposition", 100, 0., 10.*MeV);
// Create ntuple
analysisManager->CreateNtuple("Event", "Event data");
analysisManager->CreateNtupleIColumn("eventID");
analysisManager->CreateNtupleDColumn("Edep");
analysisManager->FinishNtuple();
}
RunAction::~RunAction() {
delete G4AnalysisManager::Instance();
}
void RunAction::BeginOfRunAction(const G4Run*) {
auto analysisManager = G4AnalysisManager::Instance();
analysisManager->OpenFile();
}
void RunAction::EndOfRunAction(const G4Run*) {
auto analysisManager = G4AnalysisManager::Instance();
analysisManager->Write();
analysisManager->CloseFile();
}
In EventAction or SteppingAction, you then call FillH1, FillNtuple...Column, and AddNtupleRow as needed, always via G4AnalysisManager::Instance().
Selecting and Building Analysis Backends
G4AnalysisManager supports several output formats. Which ones are available depends on how Geant4 was configured when built. Common backends include:
| Backend | File type string | Typical file extension |
|---|---|---|
| ROOT | "root" | .root |
| CSV | "csv" | .csv |
| XML | "xml" | .xml |
You select the default type with:
analysisManager->SetDefaultFileType("root");
To enable a specific backend, Geant4 must be compiled with the corresponding option. For example, for ROOT output you usually configure CMake with -DGEANT4_USE_G4ROOT=ON. For CSV, use -DGEANT4_USE_G4CSV=ON. If a backend is not built, trying to use it will either fail at compile time or give a runtime error.
In many beginner setups, the examples are already configured for ROOT output if ROOT is available. Check the Geant4 build configuration or example documentation for your installation.
Useful Additional Methods
Beyond the basic creation, filling, and writing operations, G4AnalysisManager provides several utility methods that can be helpful in more involved applications.
You can adjust histogram activation status to enable or disable certain histograms at runtime:
analysisManager->SetActivation(true); // enable activation control
analysisManager->SetH1Activation(0, true); // activate histogram with ID 0
analysisManager->SetH1Activation(1, false); // deactivate histogram with ID 1You can get the number of histograms and ntuples that have been created:
G4int nH1 = analysisManager->GetNofH1s();
G4int nNtp = analysisManager->GetNofNtuples();In multithreaded applications, some versions allow you to enable ntuple merging:
analysisManager->SetNtupleMerging(true);This lets the master thread automatically merge per-thread ntuples at the end of the run.
Finally, you can change the base file name or type at runtime if you want to separate output by run:
G4int runID = run->GetRunID();
std::ostringstream fname;
fname << "output_run" << runID;
analysisManager->SetFileName(fname.str());
analysisManager->OpenFile();
This cheat sheet focuses on the most common patterns for beginners. For more advanced features such as profile histograms, weighted filling, or vector-linked columns, refer to the Geant4 Application Developers Guide and the example codes in the examples/extended/analysis directory.
Views: 9
KAHIBARO