从CERN ROOT的文本文件中绘制6个图形

时间:2018-04-05 18:17:53

标签: c++ c root-framework

我是root的新手。我的文本文件包含9列和96行。我想读第1列,第4列和第5列,第三列的值与x,y,ey相同。

我想绘制6个图,每个图依赖于第三列,其中点是{x =(raw = 1column = 1,raw = 7column = 1,raw = 13column = 1,raw = 19column = 1 .. .....)},{y =(raw = 1column = 4,raw = 7column = 4,raw = 13column = 4,raw = 19column = 4 .....)}和{ey =(raw = 1column) = 5,raw = 7column = 5,raw = 13column = 5,raw = 19column = 5 .....)}在第3列中具有相同的值(附加图片以显示我的数据)。 请让我知道怎么做。

非常感谢你!

enter image description here

1 个答案:

答案 0 :(得分:1)

您的任务有几个子步骤,对于每个子步骤,您可能有多个选项。

  1. 阅读csv
  2. stackoverflow has you covered here for standalone c++您可以使用标准c ++或使用root工具,for reading into a ttreeusing regular data science tools with rootwith a root tgraph constructor(但我不熟悉tgraph对象族不仅仅是阅读文档)。

    1. 选择第三列值
    2. 我最熟悉TTree,你可以在这里找到一些东西(取决于你实际创建树的方式)your_tree->Draw("fourth_column_for_y_axis:first_column_for_x_axis","third_column==-0.7")

      此处存在问题:您仍需要找出第三列值以选择并构建选择字符串(TTree::Draw的第二个参数)。 (以及下一点的其他内容),所以我建议在某些c ++数据结构中保留第三列值。用unique_set填写它们几乎可以满足您的需求。

      1. 绘图
      2. 在这里,我实际上认为TTree::Draw是一个糟糕的解决方案(两个变量图y:x实际上是一个二维直方图,而一个二维图则是一个代表 - 维度直方图,你可以通过填充权重TTree::Draw("first_column",Form("(third_column==%f)*fourth_column",-0.7))来欺骗,但是你仍然需要得到正确的误差条,并且数学计算可能比解决方案和不可维护的更多。

        1. 找出适合您的工具组合
        2. 所以我认为使用上面的任何标准c ++将数据加载到STL容器并使用STL算法来处理数据更有意义。一旦你有了某种形状,你就可以获得图形(这里没有好的代码点,只是简单描述如何使用未经测试的准代码构造TGraphErrors,我希望这些代码很容易用很少的先决条件读取):

          std::unique_set<float> third_column_unique_values = …
          std::vector<std::tuple<float,float,float,float> > rows_1_3_4_5 = …
          
          // loop over all unique values in the third column
          for (auto third_value : third_column_unique_values) {
            std::vector<float> x, y, ey;
            // now loop over all rows and skip the "currently wrong ones"
            for (auto row: rows_1_3_4_5) {
              // WARNING: indices of rows and tuples get confusing
              // WARNING: float point comparison here, that's bad
              if (std::get<1>(row) != third_value) continue;
          
              x.push_back(std::get<0>(row));
              y.push_back(std::get<2>(row));
              ey.push_back(std::get<3>(row));
            }
          
            /// I didn't find a TGraphError class with only errors in y direction,
            // but only searched for a few seconds, you might go more into
            // detail, I just set them all to 0 here
          
            std::vector<float> ex(0.f, x.size());
            TGraphErrors* graph = new TGraphErrors(x.size(), &x[0], &y[0], &ex[0], &ey[0]);
          }
          

          然后你可能想让graph退出循环。注意:无需担心指向xy,...向量的开头,TGraphErrors的构造函数会复制预期数组的内容。