gpt4 book ai didi

c++ - ROOT 中带有变量的命令

转载 作者:行者123 更新时间:2023-11-28 02:03:07 26 4
gpt4 key购买 nike

我正在尝试创建一个简单的循环来调用来自顺序 channel 的数据。我有编号为 1-8 的 channel (名为 qL1 - qL8),需要为所有 channel 调用 qL*->Draw(); 命令。

有没有办法使用循环不断更新命令中的数字?我相信 c shell 中的等效代码是:

for {set i 1} {$i <= 8} {incr i} {
qL$i->Draw();
}

如标题所述,我正在尝试为 ROOT 编写一个宏。谢谢。

最佳答案

将所有内容放入数组/vector 中

好吧,你可以填充你的 channel (我假设 TH1 在这里,但对于 TGraphTTree 等它应该类似地工作)到首先是数组/vector ,因为无论如何它们都是指针:

TH1* qL[9];  // nine elements to have indices matching
qL[1] = qL1;
qL[2] = qL2;
qL[3] = qL3;
qL[4] = qL4;
qL[5] = qL5;
qL[6] = qL6;
qL[7] = qL7;
qL[8] = qL8;

for (int i = 1 ; i <= 8 ; i++) { qL[i]->Draw() ; }

虽然这可能不会给你带来太多。

使用ROOT的目录机制,使用字符串操作

可能更适合使用 root 的目录管理(如果您无论如何从输入文件获取 channel ,那应该是一个直接的解决方案):

for (int i = 1 ; i <= 8 ; i++) {
TH1* localhist = (TH1*) gDirectory->Get(Form("qL%d",i));
localhist->Draw();
}

这里,Form(...) 是一个 cstring,Form 的语法与 printf 的语法相同(google 是你的 friend )。 Get 查找名称 是提供的 cstring 的对象。 (注意 TH1* variablename = new TH1F( NAME, TITLE , ...) 中的混淆空间,重要的是 NAME 而不是 变量名)

预处理器宏

您可以使用预处理器(例如 boost)将变量的字符串部分 (qL) 与数字连接起来,并在将数字作为参数的预处理器宏中使用它。

#include <boost/preprocessor/cat.hpp>
#define qL(i) BOOST_PP_CAT(qL, i)


TH1* qL1 = new TH1F("test","test",1,0,1);
qL(1)->GetName();

这个问题是,参数必须在编译时已知,如果你把它放在 for 循环中,你会得到错误,因为 qLi 是未知的。这可以在预处理器中完成,但不确定从长远来看这是否会非常有效

#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#define HHHHH(z,n,zz) BOOST_PP_CAT(qL, n) zz
BOOST_PP_REPEAT_FROM_TO(1,3,HHHHH,->Draw();)

关于c++ - ROOT 中带有变量的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38594985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com