具有许多成员变量的类的最佳实践

时间:2015-05-04 17:33:05

标签: c++ class-design root-framework

简短问题: 如果你必须有许多(甚至超过200个)成员变量(每个变量都是我们分析中感兴趣的一些物理量的图)。宣布这些变量的最佳位置是什么?

长解释: 我用于分析的框架创建了一个循环事件的类,可以缩小到

constructor()
initialize()
execute()
finalize()

在标题中你会声明指针(这显然是我们必须使用的ROOT包的要求):

std::vector<double> *m_jet_pt;

和指向直方图类的指针:

TH1F *h_jet_pt;

然后在constructor中必须将指针初始化为某个确定的内存地址(据我所知,这是为了以后从文件中读取数据)

constructor()
{
  // this is data, will be associated to a TTree later
  m_jet_pt = 0;

  // this is a histogram
  h_jet_pt = new TH1F("name", "title", nbins, min_bin, max_bin); 
}

然后在initialize函数中打开一个包含先前存储的数据的文件,并将类成员的地址设置为指向文件中包含的对象(我不知道这是如何工作的或如果我的陈述是准确的):

TFile *file = new TFile("filename.root");

// The tree is where the data is (for some reason ROOT uses C style casts)
TTree *tree = (TTree*)file->Get("MyTree");

// this is how to set the address of the member class pointer
// to point to the data in the tree:
tree->SetBranchAddress("m_jet_pt", &jet_pt);

然后在循环中调用execute函数,每个事件一次,你会做你想要的物理选择

execute()
{
  // I omit here where the `i` index comes from as not relevant
  if(m_jet_pt->at(i) > 30)

    h_jet_pt->Fill();
}

最后在finalize函数中,您可以在选择后的每个事件中执行所有操作,例如将直方图存储在另一个文件中

finalize()
{
  h_jet_pt->Write();
}

现在想象一下,jets有20个量子,electrons有30个,muons有30个等等,你可以看到成员变量的数量是多少!很快代码变得混乱,那么专家程序员如何应对这种情况呢?希望这很清楚!

1 个答案:

答案 0 :(得分:0)

ROOT具有相当不错的I / O功能,支持从TTree读取和写入任意数据结构。通常,您需要做的就是编写一个具有与您的单个“测量”或“事件”相对应的数据结构的类。您可以自行决定如何在此类中组织多个物理量。该结构可以是平坦的,具有相同级别的200个数据成员,或者包含某些其他类类型的封装的非POD数据成员。好处是ROOT可以很好地处理所有不同类型,包括标量,数组,指针和stl容器作为数据成员。

创建类的对象后,它可以与TTree上的顶级分支关联:

tree->Branch(branchname, className, &p_object, bufsize, splitlevel)

有关详情,请参阅案例B:https://root.cern.ch/doc/master/classTTree.html

如果您为所有数据结构生成字典和流式传输,ROOT将自动创建子分支,从而节省大量手动工作。之后,您可以使用TTree的方法(如Fill()和GetEntry())通过将对象保存在树中或从树中读取值到对象来创建条目。