RunAction

g4tools 中介绍了如何在多线程中存储 ROOT/TTree 结构的数据

该类有三个虚函数,G4RunManager会为每次运行调用它们:

class G4UserRunAction
{
  public:
    G4UserRunAction();
    virtual ~G4UserRunAction();

  public:
    virtual G4Run* GenerateRun();
    virtual void BeginOfRunAction(const G4Run*);
    virtual void EndOfRunAction(const G4Run*);
};

以下是我们提供示例代码中的截图

ra1

在 BeginOfRunAction() 函数中,创建 tree,打开文件;在 EndOfRunAction() 函数中将缓存中的数据写入磁盘,关闭文件。

ra2

如何给不同次运行设置不同的文件名?

假设每次开启程序运行 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。