Geant4--root和csv文件存储

时间:2022-07-26
本文章向大家介绍Geant4--root和csv文件存储,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

root直方图适合数据统计;csv文件适合原始数据保存。

01

Geant4调用root/csv文件存储格式方法

a) 在/include/中添加文件MYHistoManager.hh:

#ifndefMYHistoManager_h
#defineMYHistoManager_h 1
#include"globals.hh"

#include"g4root.hh" //选择root
//#include"g4csv.hh"//选择csv
//#include"g4xml.hh"   
#endif

b) 在/src/MYRunAction.cc中#include"MYHistoManager.hh":

MYRunAction初始化结构体中:

MYRunAction::MYRunAction()
: G4UserRunAction()
{
auto analysisManager =G4AnalysisManager::Instance();
G4cout << "Using " <<analysisManager->GetType() << G4endl;
//analysisManager->SetNtupleMerging(true);
analysisManager->SetVerboseLevel(1);
analysisManager->SetFileName("myfile");
analysisManager->CreateH1("Eabs","Edepin absorber", 100, 0., 200*MeV); 
//analysisManager->CreateH3("Eabstest","Edepin test", 100, 0., 200*MeV,100, 0., 200*MeV,100, 0., 200*MeV); 
analysisManager->CreateNtuple("tuple","Edep"); 
analysisManager->CreateNtupleDColumn("Eabs"); 
analysisManager->FinishNtuple(); 
}
       在run开始之前打开文件输出流:
void B1RunAction::BeginOfRunAction(constG4Run*)
{
auto analysisManager =G4AnalysisManager::Instance();
// Open an output file, its name can beoverwritten in a macro
analysisManager->OpenFile();
}
       在run结束时将统计量写入文件:
void B1RunAction::EndOfRunAction(constG4Run* run)
{
auto analysisManager =G4AnalysisManager::Instance();
analysisManager->Write();
analysisManager->CloseFile();
}

c) 在/src/MYSteppingAction.cc或MYEventAction.cc读取数据:

void MYEventAction::EndOfEventAction(const G4Event*evt)
{
auto analysisManager =G4AnalysisManager::Instance();
if (fEdep>0.)
{
analysisManager->FillH1(0, fEdep);
analysisManager->FillNtupleDColumn(0,fEdep);
analysisManager->AddNtupleRow();
}
}

d) 对于csv文件,不支持*.mac中修改名字,也不支持NTuple多线程合并,但支持histogram合并:

假设有8个线程G4WT0~7,运行完* run1.mac之后将会生成一个myfile_h1_Eabs.csv,其中存储了一个直方图;还有一个myfile_nt_tuple.csv(数据内容为空),和8个myfile_nt_tuple_t0~7.csv,对应存放了各个线程的抽取信息。

--与root直方图相对应,打开myfile_h1_Eabs.csv会看见数值格式的直方图。

图1 root直方图内容

图2 csv文件存储的直方图内容

其中,

entries:当前bin获取了多少个满足信息抽取条件的数据,对应hist中的Y轴counts;

Sw:每个数据填充时配置权重weight(默认为1),当前bin中所有数据的权重和;

Sw2:当前bin中所有填充数据权重平方的和;

Sxw0:当前bin中所有数据的和,w0表示w的0次幂(=1);

Sx2w0:当前bin中所有数据的平方的和;

--而8个myfile_nt_tuple_t0~7.csv中的数据个数总共为17个,对应hist中的Entries。

02

扩展阅读

a) Geant4 User's Guide->Analysis->g4tools

b) https://geant4-forum.web.cern.ch/t/making-more-than-one-csv-file/1933

c) Analysis Tools in Geant4 10.2 and10.3:https://gbarrand.github.io/documents/g4analysis_2.pdf

d) https://www.slac.stanford.edu/xorg/geant4/CNL2019/HandsOn4/

03

多线程下NTuple生成多个的csv文件的处理

a) 删除多个线程生成的多个csv文件的标头:

将目标*.csv移到同一个文件夹下;

find*.csv |xargs sed -i '1,5d'。

b) 合并多个csv文件:

cat*.csv > full.csv。

流程示意如图3图4所示:

图3 命令行演示csv数据文件的处理

图4 多个csv文件中的数据合并

04

总结展望

Root和csv文件流的优点在于它们的多线程管理能力,对于直方图两者均能在EndofRunAction中实现数据合并;而对于ntuple原始数据的存储,root总会在数据流实例打开的时候自动存入数据,如果不满足条件则填充0,csv则是每个线程互不干涉,只保存筛选数据,后期经过简单处理每个线程的csv文件,即可获得预期数据列表。

总结来看:如果倾向数据统计,则root直方图直接存储合理;倾向于保存原始数据,csv文件存储更高效,方便后续做集中数据处理分析。

下期内容:

1)通过ParticleGun实现球(壳)状体积源的模拟。

图5 球状体积源

2)给一个brain模型,包括了左右脑、小脑、垂体等6个小模块,obj格式。

图6 人脑模型