多线程中为了使代码尽可能简单,因此每个线程都是独立的(没有共享数据):
目前在多线程程序中调用外部 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)
关键:函数中的 I、F、D、S 分别表示 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();
!jupyter nbconvert g4tools.ipynb --to html
[NbConvertApp] Converting notebook g4tools.ipynb to html [NbConvertApp] Writing 583021 bytes to g4tools.html