“ 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 人脑模型