ROOT中带有变量的命令
Commands with Variables in ROOT
我正在尝试创建一个简单的循环,从顺序通道调用数据。我有编号为1-8的通道(命名为qL1-qL8),需要为所有通道调用qL*->Draw();
命令。
有没有办法使用循环来不断更新命令中的数字?我相信c shell中的等效代码是:
for {set i 1} {$i <= 8} {incr i} {
qL$i->Draw();
}
正如标题中所说,我正在尝试为ROOT编写一个宏。谢谢
将所有内容放入数组/向量中
好吧,你可以先把你的通道(我假设这里是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的目录机制并使用字符串操作
可能更适合的是使用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();
}
相关文章:
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- 命令行参数,cant 或两个变量
- 提供变量作为 MATLAB 系统命令的输入参数,以便C++可执行文件
- 为什么发出空asm命令会交换变量
- 在 MinGW 和 MinGW-64 上执行命令后变量为空?
- 使用 for 循环并将更改命令作为变量
- 如何将makefile变量用作g 命令中包含的文件
- 如何在Xdotool命令中使用变量
- std::cin 无法将命令行中的用户输入传递给具有 char 类型的变量吗?
- C 错误:从命令行输入更改为变量输入
- 如何将所选行的第一列值绑定到变量并在 QT 的 SQL 命令中使用它?
- 在预处理器命令中使用 qmake 变量 #include
- 如何将 c ++ 变量的值传递给 hadoop HDFS 的 bash 系统命令?
- 尝试使某些 gobal 变量链接器命令失败
- 在 gdb 中,我按 tab 后,它可以完成我的命令以及局部变量,但为什么 lldb 不能
- 运行CMD命令并将结果获取到字符串变量
- 如何将linux命令的输出复制到C++变量中
- 如何在C++中从命令行参数分配成员变量