g4tools 中介绍了如何在多线程中存储 ROOT/TTree 结构的数据
该类有三个虚函数,G4RunManager会为每次运行调用它们:
class G4UserRunAction
{
public:
G4UserRunAction();
virtual ~G4UserRunAction();
public:
virtual G4Run* GenerateRun();
virtual void BeginOfRunAction(const G4Run*);
virtual void EndOfRunAction(const G4Run*);
};
以下是我们提供示例代码中的截图
在 BeginOfRunAction() 函数中,创建 tree,打开文件;在 EndOfRunAction() 函数中将缓存中的数据写入磁盘,关闭文件。
假设每次开启程序运行 10000000 个事件(为了避免单个文件过大),总共需要模拟 100000000 个事件,那需要运行 10 次。我们希望这 10 次运行输出的文件名分别是 data0000,data0001,...,data0009。一个较为容易的实现方式如下:
将文件名通过 main.cc 传递给 RunAction, 然后通过以下方式运行。
./wu -l data0003
代码修改如下:
main.cc
// 这里的代码省略
if(argc >= 3)
{
G4String commandfile = argv[2];
mtrunManager->SetUserInitialization(new wuActionInitialization(commandfile));
}
else
mtrunManager->SetUserInitialization(new wuActionInitialization("outputdata"));
// 这里的代码省略
wuActionInitialization.hh
// 添加头文件
#include "G4String.hh"
// 构造函数修改如下
wuActionInitialization(G4String file = "outputdata");
//添加变量
G4String filename;
wuActionInitialization.cc
// 进行如下修改
wuActionInitialization::wuActionInitialization(G4String file)
: G4VUserActionInitialization()
{
filename = file;
}
void wuActionInitialization::Build() const
{
// 这里的代码省略
actsRun->push_back(G4UserRunActionUPtr(new wuRunActionAll(filename)));
// 这里的代码省略
}
wuRunActionAll.hh
// 添加头文件
#include "G4String.hh"
// 构造函数修改如下
wuRunActionAll(G4String file = "outputdata");
//添加变量
G4String filename;
wuRunActionAll.cc
// 进行如下修改
wuRunActionAll::wuRunActionAll(G4String file)
{
filename = file;
}
void wuRunActionAll::BeginOfRunAction(const G4Run* /*aRun*/)
{
// 这里的代码省略
analysisManager->OpenFile(filename);//输出文件名
}
用户将参数传递给 main.cc,然后传递给 wuActionInitialization,再传递给 wuRunActionAll。
这只是一个参数传递的一般示例,大家可以改成传递多个参数,或者使用其它类型的数据。
G4String 类是继承于 std::string,添加了一些功能函数。所以简单的可以当成 std::string 来使用。详细可以查看文件 G4String.hh。
!date
!jupyter nbconvert RunAction.ipynb --to html
2022年 05月 08日 星期日 12:44:40 CST [NbConvertApp] Converting notebook RunAction.ipynb to html [NbConvertApp] Writing 569315 bytes to RunAction.html