将 C++ argv[] 解释为变量与 CERN 的 ROOT 之间的关系
Interpret C++ argv[] as relationship between variables with CERN's ROOT
我希望能够在命令行中调用带有变量或变量组合的函数,例如:
$ ./myFunction.exe "var1"
或
$ ./myFunction.exe "var1/var2"
稍后在我的脚本中,我定义了一个变量 float VAR,它应该根据用户输入来定义。对于第一种情况,我想要:
float VAR = var1;
...对于第二种情况,我想要:
float VAR = var1/var2;
CERN 的 ROOT 框架中有没有办法将这个用户定义的字符数组解释为这样的变量名之间的关系?我意识到这有点牵强,但现在每次我想更改 VAR 时都需要对其进行硬编码,我宁愿不必这样做。
请注意,这些变量是在我从外部 *.root 文件读取的 TTree 中命名的,所以我想可能有一种方法可以使用 gROOT 定义 VAR ->ProcessLine(),但我还没弄明白。我知道这在直接 C++ 中是不可能的,但我觉得这应该可以通过 ROOT 实现。
您在 ROOT 5 还是 6?对我来说,这适用于 ROOT 5.34:
在test.cpp
double x = 2;
double y = 3;
double z;
void test(const char* arg)
{
gROOT->ProcessLine(TString("z=")+arg);
cout << z << endl;
}
在 ROOT shell:
.x test.cpp("x/y")
输出:
0.666667
将 x
和 y
作为 test()
中的局部变量不起作用,这会导致
Error: Symbol x is not defined in current scope
Error: Symbol y is not defined in current scope
这个例子中的变量z
也是在全局范围内创建的,所以ProcessLine
函数似乎是在全局范围内运行的,而不是在调用函数的范围内。
我假设您只想将算术表达式传递到您的例程中。如果是这样,这是使用 ROOT 的 TFormula(在 ROOT6 中)的替代解决方案:
#include <iostream>
#include "TFormula.h"
#include "TString.h"
int main(int argc, char **argv)
{
TFormula my_formula("my_formula", TString(argv[argc-1]) );
my_formula.SetParNames("var1", "var2");
my_formula.SetParameter("var1", 3.45678);
my_formula.SetParameter("var2", 8.76543);
// The formula does not define any variable so input to TFormula::Eval() is
// irrelevant
double dummy = 0;
std::cout << "my_formula: " << my_formula.GetExpFormula("clingp") << "\n"
<< "result: " << my_formula.Eval(dummy) << std::endl;
return EXIT_SUCCESS;
}
需要注意的是,您需要将变量括在方括号 []
中,如下所示:
$ ./myFunction.exe "[var1]/[var2]"
$ ./myFunction.exe "[var1]"
$ ./myFunction.exe "[var1]/[var2]+[var1]*[var2]"
这是 TFormula 参数的表示法。
我希望能够在命令行中调用带有变量或变量组合的函数,例如:
$ ./myFunction.exe "var1"
或
$ ./myFunction.exe "var1/var2"
稍后在我的脚本中,我定义了一个变量 float VAR,它应该根据用户输入来定义。对于第一种情况,我想要:
float VAR = var1;
...对于第二种情况,我想要:
float VAR = var1/var2;
CERN 的 ROOT 框架中有没有办法将这个用户定义的字符数组解释为这样的变量名之间的关系?我意识到这有点牵强,但现在每次我想更改 VAR 时都需要对其进行硬编码,我宁愿不必这样做。
请注意,这些变量是在我从外部 *.root 文件读取的 TTree 中命名的,所以我想可能有一种方法可以使用 gROOT 定义 VAR ->ProcessLine(),但我还没弄明白。我知道这在直接 C++ 中是不可能的,但我觉得这应该可以通过 ROOT 实现。
您在 ROOT 5 还是 6?对我来说,这适用于 ROOT 5.34:
在test.cpp
double x = 2;
double y = 3;
double z;
void test(const char* arg)
{
gROOT->ProcessLine(TString("z=")+arg);
cout << z << endl;
}
在 ROOT shell:
.x test.cpp("x/y")
输出:
0.666667
将 x
和 y
作为 test()
中的局部变量不起作用,这会导致
Error: Symbol x is not defined in current scope
Error: Symbol y is not defined in current scope
这个例子中的变量z
也是在全局范围内创建的,所以ProcessLine
函数似乎是在全局范围内运行的,而不是在调用函数的范围内。
我假设您只想将算术表达式传递到您的例程中。如果是这样,这是使用 ROOT 的 TFormula(在 ROOT6 中)的替代解决方案:
#include <iostream>
#include "TFormula.h"
#include "TString.h"
int main(int argc, char **argv)
{
TFormula my_formula("my_formula", TString(argv[argc-1]) );
my_formula.SetParNames("var1", "var2");
my_formula.SetParameter("var1", 3.45678);
my_formula.SetParameter("var2", 8.76543);
// The formula does not define any variable so input to TFormula::Eval() is
// irrelevant
double dummy = 0;
std::cout << "my_formula: " << my_formula.GetExpFormula("clingp") << "\n"
<< "result: " << my_formula.Eval(dummy) << std::endl;
return EXIT_SUCCESS;
}
需要注意的是,您需要将变量括在方括号 []
中,如下所示:
$ ./myFunction.exe "[var1]/[var2]"
$ ./myFunction.exe "[var1]"
$ ./myFunction.exe "[var1]/[var2]+[var1]*[var2]"
这是 TFormula 参数的表示法。