我正在尝试创建一个从顺序通道调用数据的简单循环。我有编号为1-8的通道(名为qL1 - qL8),需要为所有通道调用qL*->Draw();
命令。
有没有办法使用循环来不断更新命令中的数字?我相信c shell中的等效代码是:
for {set i 1} {$i <= 8} {incr i} {
qL$i->Draw();
}
正如标题中所述,我正在尝试为ROOT编写一个宏。感谢。
答案 0 :(得分:2)
好吧,你可以在这里填充你的频道(我假设TH1
,但它应该同样适用于TGraph
,TTree
等)到数组/向量中,因为它们是指点无论如何:
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目录管理(如果你无论如何从输入文件获取你的频道,这应该是一个直接的解决方案):
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();
}