我是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列中具有相同的值(附加图片以显示我的数据)。 请让我知道怎么做。
非常感谢你!
答案 0 :(得分:1)
您的任务有几个子步骤,对于每个子步骤,您可能有多个选项。
stackoverflow has you covered here for standalone c++您可以使用标准c ++或使用root工具,for reading into a ttree或using regular data science tools with root或with a root tgraph constructor(但我不熟悉tgraph对象族不仅仅是阅读文档)。
我最熟悉TTree,你可以在这里找到一些东西(取决于你实际创建树的方式)your_tree->Draw("fourth_column_for_y_axis:first_column_for_x_axis","third_column==-0.7")
此处存在问题:您仍需要找出第三列值以选择并构建选择字符串(TTree::Draw
的第二个参数)。
(以及下一点的其他内容),所以我建议在某些c ++数据结构中保留第三列值。用unique_set
填写它们几乎可以满足您的需求。
在这里,我实际上认为TTree::Draw
是一个糟糕的解决方案(两个变量图y:x
实际上是一个二维直方图,而一个二维图则是一个代表 - 维度直方图,你可以通过填充权重TTree::Draw("first_column",Form("(third_column==%f)*fourth_column",-0.7))
来欺骗,但是你仍然需要得到正确的误差条,并且数学计算可能比解决方案和不可维护的更多。
所以我认为使用上面的任何标准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
退出循环。注意:无需担心指向x
,y
,...向量的开头,TGraphErrors
的构造函数会复制预期数组的内容。