ROOT中带变量的命令

时间:2016-07-26 16:13:45

标签: c++ root-framework

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

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

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

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

2 个答案:

答案 0 :(得分:2)

将所有内容放入数组/向量

好吧,你可以在这里填充你的频道(我假设TH1,但它应该同样适用于TGraphTTree等)到数组/向量中,因为它们是指点无论如何:

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目录管理(如果你无论如何从输入文件获取你的频道,这应该是一个直接的解决方案):

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

此处,Form(...)是一个cstring,Form的语法与printf的语法相同(谷歌是你的朋友)。并且Get查找 name 是提供的cstring的对象。 (请注意TH1* variablename = new TH1F( NAME, TITLE , ...)中存在混淆的余地,重要的是NAME而不是variablename

预处理器宏

您可以使用预处理器(例如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();)

答案 1 :(得分:0)

没有。如果只有你的频道名称是一个数组,例如qL[N],其中N=0, 1, ..., 7,可以使用类似

的内容
for (Int_t i=0; i<8; i++)
{
    qL[i]->Draw();
}