g4tools

多线程中为了使代码尽可能简单,因此每个线程都是独立的(没有共享数据):

目前在多线程程序中调用外部 CERN ROOT 并非易事,程序存在历史遗留问题

因此 GEANT4 中内置提供了 ROOT/CSV/XML 等格式的文件创建的工具包,g4tools,它包含基本的 文件,直方图,ntuple(tree)的存储功能。使用上与 CERN ROOT 接近。它有多种实例化方式,这里我们只介绍一个最通用的方式。

常用函数

#include "G4CsvAnalysisManager.hh"
#include "G4XmlAnalysisManager.hh"
#include "G4RootAnalysisManager.hh"
#include "G4VAnalysisManager.hh"
G4bool  OpenFile (const G4String &fileName="")
G4bool  Write ()
G4bool  CloseFile ()

G4int   CreateNtuple (const G4String &name, const G4String &title)
G4int   CreateNtupleIColumn (const G4String &name)
G4int   CreateNtupleFColumn (const G4String &name)
G4int   CreateNtupleDColumn (const G4String &name)
G4int   CreateNtupleSColumn (const G4String &name)
G4int   CreateNtupleIColumn (const G4String &name, std::vector< int > &vector)
G4int   CreateNtupleFColumn (const G4String &name, std::vector< float > &vector)
G4int   CreateNtupleDColumn (const G4String &name, std::vector< double > &vector)
void    FinishNtuple ()

G4bool  FillNtupleIColumn (G4int id, G4int value)
G4bool  FillNtupleFColumn (G4int id, G4float value)
G4bool  FillNtupleDColumn (G4int id, G4double value)
G4bool  FillNtupleSColumn (G4int id, const G4String &value)
G4bool  AddNtupleRow ()    


G4int   CreateNtupleIColumn (G4int ntupleId, const G4String &name)
G4int   CreateNtupleFColumn (G4int ntupleId, const G4String &name)
G4int   CreateNtupleDColumn (G4int ntupleId, const G4String &name)
G4int   CreateNtupleSColumn (G4int ntupleId, const G4String &name)
G4int   CreateNtupleIColumn (G4int ntupleId, const G4String &name, std::vector< int > &vector)
G4int   CreateNtupleFColumn (G4int ntupleId, const G4String &name, std::vector< float > &vector)
G4int   CreateNtupleDColumn (G4int ntupleId, const G4String &name, std::vector< double > &vector)
void    FinishNtuple (G4int ntupleId)    

G4bool  FillNtupleIColumn (G4int ntupleId, G4int columnId, G4int value)
G4bool  FillNtupleFColumn (G4int ntupleId, G4int columnId, G4float value)
G4bool  FillNtupleDColumn (G4int ntupleId, G4int columnId, G4double value)
G4bool  FillNtupleSColumn (G4int ntupleId, G4int id, const G4String &value)
G4bool  AddNtupleRow (G4int ntupleId)

关键:函数中的 IFDS 分别表示 int、float、double、string 类型。

示例代码

.hh 文件中添加头文件

#include "G4CsvAnalysisManager.hh"
#include "G4XmlAnalysisManager.hh"
#include "G4RootAnalysisManager.hh"
#include "G4VAnalysisManager.hh"

同时添加类的对象

G4VAnalysisManager* analysisManager;

获得线程中对象指针,通常放在构造函数或者该类中第一次使用之前

analysisManager = G4RootAnalysisManager::Instance();
  // analysisManager = G4CsvAnalysisManager::Instance();
  // analysisManager = G4XmlAnalysisManager::Instance();

打开文件

analysisManager->SetVerboseLevel(1);
  analysisManager->CreateNtuple("t", "Geant4 data !");


  analysisManager->CreateNtupleIColumn("EventID");// 0
  analysisManager->CreateNtupleIColumn("ParentID");// 1
  analysisManager->CreateNtupleIColumn("TrackID");// 2
  analysisManager->CreateNtupleSColumn("PName");// 3
  analysisManager->CreateNtupleSColumn("CreatorProcess");// 4
  analysisManager->CreateNtupleDColumn("EDep");// 5



  analysisManager->FinishNtuple();
  analysisManager->OpenFile("outputdata");//设置输出文件名

填充数据

// 这里 0-5 与前面创建的顺序
  analysisManager->FillNtupleIColumn(0, EventID);
  analysisManager->FillNtupleIColumn(1, ParentID);
  analysisManager->FillNtupleIColumn(2, TrackID);
  analysisManager->FillNtupleSColumn(3, PName);
  analysisManager->FillNtupleSColumn(4, CreatorProcess);
  analysisManager->FillNtupleDColumn(5, EDep);


  analysisManager->AddNtupleRow();  //相当于 Fill

关闭文件

analysisManager->Write();
  analysisManager->CloseFile();