ROOT中带有变量的命令

Commands with Variables in ROOT

本文关键字:命令 变量 ROOT      更新时间:2023-10-16

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

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

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

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

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

好吧,你可以先把你的通道(我假设这里是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查找名称是所提供的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();)

否。如果只有你的频道名称是一个数组,例如qL[N],其中N=0, 1, ..., 7,那么使用之类的东西是可能的

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