标签: root-framework

如何从用户输入修改C++代码

我目前正在编写一个位于C++解释器之上的程序.用户在运行时输入C++命令,然后将其传递给解释器.对于某些模式,我想用修改后的表单替换给出的命令,以便我可以提供其他功能.

我想替换任何形式的东西

A->Draw(B1, B2)
Run Code Online (Sandbox Code Playgroud)

MyFunc(A, B1, B2).
Run Code Online (Sandbox Code Playgroud)

我首先想到的是正则表达式,但是这将是相当容易出错,因为任何的A,B1或者B2可以是任意的C++表达式.由于这些表达式本身可能包含带引号的字符串或括号,因此将所有情况与正则表达式匹配将非常困难.此外,此表达式可能有多种嵌套形式

我的下一个想法是将clang称为子进程,使用"-dump-ast"获取抽象语法树,修改它,然后将其重建为一个命令以传递给C++解释器.但是,这需要跟踪任何环境更改,例如包含文件和转发声明,以便为clang提供足够的信息来解析表达式.由于口译员没有公开这些信息,这似乎也是不可行的.

第三个想法是使用C++解释器自己的内部解析转换为抽象语法树,然后从那里构建.但是,这个解释器不会以任何我能够找到的方式揭示ast.

是否有任何关于如何继续进行的建议,无论是沿着其中一条规定的路线,还是完全沿着不同的路线?

c++ clang root-framework

19
推荐指数
1
解决办法
1615
查看次数

Clion或cmake没有看到环境变量

我正在使用CLion IDE,Cmake并尝试使用CERN ROOT库编写Hello world.

CMakeLists.txt:

message(STATUS $ENV{ROOTSYS})

〜/ .bashrc:

export ROOTSYS="$HOME/tools/root-build/"

在构建期间,$ENV{ROOTSYS}由于某种原因,CLion 是空的.但$ENV{PATH}回报正确$PATH.

我做错了什么?

cmake environment-variables root-framework clion

13
推荐指数
2
解决办法
1万
查看次数

在emacs中为文件系统之外的其他东西实现dired接口?

通常用于高能物理的ROOT数据分析框架使用二进制文件格式,其具有内部结构,如真实文件系统(即文件夹和文件).程序的ls()方法输出如下所示:

  KEY: TH1D     name1
  KEY: TH1D     name2
  KEY: TH2D     name3
....
Run Code Online (Sandbox Code Playgroud)

"TH1D"和"TH2D"等只是对象类型.在emacs中以类似dired的界面浏览文件真是太好了.我当然没有时间从头开始编写一个dired接口的能量/时间(即使在dired.el源的帮助下).我的问题是:如果可能的话,我怎样才能通过重新实现一些函数来加入到dired接口中,为上面的输出创建一个类似于dired的界面?

我当然不期待这里有完整的解决方案,而是指向示例,教程和其他有用信息的指针.

emacs physics elisp root-framework

7
推荐指数
1
解决办法
276
查看次数

Python/Numpy/Scipy - 将字符串转换为数学函数

我有点不幸尝试将程序从CERN ROOT的深度转换为python.在ROOT代码中(CINT本身就是一个憎恶的imo),人们可以将数学函数存储为"字符串"并将它们传递给ROOT以进行拟合,绘图等,因为ROOT将这些定义为"字符串".

目前,数学函数作为一条线存储在简单的文本文件中,即

(1+[1])^(1+[1])/TMath::Gamma(1+[1]) * x^[1]/[0]^(1+[1]) * exp(-(1+[1])*x/[0])
Run Code Online (Sandbox Code Playgroud)

然后在读取文件时由C++提取为字符串.python中有类似的东西吗?我知道的是numexpr,但我似乎无法使用相同的上述工具,即

(1+p[1])**(1+p[1])/scipy.special.Gamma(1+p[1]) * x**p[1]/p[0]**(1+p[1]) * numpy.exp(-(1+p[1])*x/p[0])
Run Code Online (Sandbox Code Playgroud)

提前感谢一堆.

python numpy scipy root-framework

6
推荐指数
1
解决办法
1528
查看次数

使用自定义析构函数时出现"未定义的引用"错误

我正在尝试编写一个需要释放一些内存的类,所以我已经定义了一个自定义析构函数.这被编译为共享库.但是,当我尝试编译一个基本程序来使用该库时,我找不到定义时通常的"未定义引用"错误.如果我删除析构函数,则不会发生这种情况.

这是一个精简的例子:

头文件:

#ifndef _SKYMAP_H_
#define _SKYMAP_H_

#include <vector>
#include "TCanvas.h"

class BL_Skymap {
 public:
   BL_Skymap();
   ~BL_Skymap();

 protected:
   TCanvas mCanvas;
};

#endif //_BENSLIBRARY_SKYMAP_H_
Run Code Online (Sandbox Code Playgroud)

源文件:

\#include "BL_Skymap.h"

BL_Skymap::BL_Skymap()
{
}

BL_Skymap::~BL_Skymap()
{
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用的程序就是这样:

\#include "BL_Skymap.h"

int main()
{
  BL_Skymap map;
  return(0);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在使用ROOT分析包(即TCanvas对象).当我编译上面的小程序时,我得到以下错误(Skymap类被编译成libMyLibrary.so):

g++ test.cpp -o test -lMyLibrary `root-config --cflags --glibs`
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libMyLibrary.so: undefined reference to 'TCanvas::~TCanvas()'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libMyLibrary.so: undefined reference to 'TCanvas::TCanvas(bool)'
Run Code Online (Sandbox Code Playgroud)

请注意,root包提供了一个实用程序来生成所需的编译器标志,这是root-config --cflags --glibs上面的目的.我在这里错过了什么?

更新:我编写了一个Makefile来执行我的库的编译,它执行以下操作:

g++ -Wall -Wextra -ansi -pedantic --std=c++11 -Isrc -Ihdr -MM -MT 'obj/BL_Skymap.o' src/BL_Skymap.cpp -MF …
Run Code Online (Sandbox Code Playgroud)

c++ root-framework

6
推荐指数
1
解决办法
502
查看次数

Python C API:省略变量赋值会导致意外行为

当使用python与pyroot(一个名为ROOT的CERN数据分析包的python接口)时,我遇到了以下奇怪的行为:

print ROOT.TFile(fname).GetListOfKeys()
Run Code Online (Sandbox Code Playgroud)

输出None而看似语义上等效的代码

f=ROOT.TFile(fname)
print f.GetListOfKeys()
Run Code Online (Sandbox Code Playgroud)

输出预期的<ROOT.THashList object ("THashList") at 0x13f0fa0>.

虽然这不是我在使用ROOT时遇到的第一个错误,但这次我很困惑python允许这个错误发生.

我认为,不知何故,TFile对象的引用计数在第一个示例中出错,并且在实际调用GetListOfKeys之前它被删除.(设置ROOT.TFile.__del__为某些打印命令后,确实会发生这种情况.)

我看到它的方式,在执行ROOT.TFile(fname)之后,但在调用GetListOfKeys()之前,指向TFile对象的指针位于堆栈上.因此,引用计数不应为零,并且在GetListOfKeys()返回之前不应调用析构函数.

谁能解释为什么会发生这种情况?

在一个相关的说明,有没有办法禁止python del隐藏我的对象只是因为引用计数变为零?我尝试了gc.disable(),并没有改变结果.是否有比将对象附加到某些全局定义的只写列表更优雅的解决方案?

python python-2.7 root-framework pyroot

6
推荐指数
0
解决办法
95
查看次数

使用IDE设置CERN ROOT

我有兴趣为使用C++和ROOT的项目设置IDE(最好是Eclipse或Netbeans),并让它能够为我编译.这可能吗?

源代码是可以ROOT,所以应该有挂钩这些东西放在一起的一些方法...

c++ root-framework

5
推荐指数
1
解决办法
3481
查看次数

Pycharm SSH远程解释器:编辑器无法识别模块

我目前正在尝试通过SSH使用远程解释器运行PyCharm。

连接本身运行良好,但是编辑器无法识别我导入的模块之一“ ROOT”(“ import ROOT”语句中的“ No module named ROOT”)。

在可以在任何python会话中导入“ ROOT”之前(使用Terminal而不是PyCharm时),必须调用带有环境变量等的“ thisroot.sh”文件。因此,借助于.bash_profile / .bashrc文件,它是在每次ssh登录时获得的。因此,如果在SSH终端中启动python之前未获取.sh文件,则python无法找到该模块。

因此,我认为问题在于,建立连接后,PyCharm不会调用.bashrc文件(因此不会提供“ thisroot.sh”文件的源代码)。如果我直接在PyCharm中打开远程Python控制台,则也找不到“ ROOT”模块。

对于不太复杂的模块,可以手动将环境变量添加到PyCharm设置中。但是对于我的模块,这实际上是不可行的。

有没有办法让PyCharm在编辑器中识别模块(并在远程Python控制台中找到它)?我曾尝试使用PyCharm StartUp脚本设置来采购“ thisroot”文件,但直到现在仍无法使用。

python ssh pycharm root-framework pyroot

5
推荐指数
0
解决办法
1564
查看次数

如何将 CERN Root 与 C++17 一起使用?

显然,CERN 的“Root”软件(自版本 6.12 起)与 C++17 兼容。然而,我完全无法让它与最新版本(6.20)一起工作,而且我之前发现的关于这个主题的所有问题都是几年前的。

\n

有 Root 经验的人知道是否有特定的编译器选项可以让它与 C++17 一起工作吗?

\n
\n

尝试编译一个简单的“Hello world”程序时遇到的错误示例:

\n
    \n
  • 以下是(我认为)由于“TFile.h”标头隐式加载“TString.h”:
  • \n
\n
/usr/local/bin/root_v6.20.02/include/ROOT/RStringView.hxx:32:84: error: conflicting declaration of template \xe2\x80\x98template<class _CharT, class _Traits> using basic_string_view = std::experimental::__ROOT::basic_string_view<_CharT, _Traits>\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 另一个(更神秘的,至少对我来说)错误的例子是:
  • \n
\n
/usr/include/c++/7/ext/concurrence.h:53:16: error: \xe2\x80\x98_Lock_policy\xe2\x80\x99 does not name a type                            \n   static const _Lock_policy __default_lock_policy =                                                              \n                ^~~~~~~~~~~~                                                                                      \nIn file included from /usr/include/c++/7/iostream:38:0,                                                           \n                 from test.cpp:1:                                                                                 \n/usr/include/c++/7/ext/concurrence.h: In function \xe2\x80\x98void std::__throw_concurrence_lock_error()\xe2\x80\x99:                   \n/usr/include/c++/7/ext/concurrence.h:102:5: error: \xe2\x80\x98__concurrence_lock_error\xe2\x80\x99 was not declared in this scope …
Run Code Online (Sandbox Code Playgroud)

c++ root-framework c++17

5
推荐指数
1
解决办法
3385
查看次数

在 PyRoot 中声明一个 TTree 分支

我试图简单地使用 python 定义一个 Root TTree 并给它一个 TBranch。听起来很合理,对吧?我试过:

from ROOT import *
myvar = int()
mytree = TTree('mytree', 'mytree')
tree.Branch('myvar', AddressOf(myvar), 'myvar/I')
exit(0)
Run Code Online (Sandbox Code Playgroud)

这会因错误而崩溃:

ValueError: invalid argument for AddressOf().
Run Code Online (Sandbox Code Playgroud)

我怀疑 AddressOf() 的参数可能需要像 Int_t 这样的 Root 类型,但我不认为 python 数据类型需要明确——而且我无法弄清楚如何强制int 为 Int_t。最后,如果你做同样的事情,除了用 'TString' 替换 'int' 和用 '/S' 替换 '/I' ,事情不会崩溃。任何建议表示赞赏。

python root-framework pyroot

4
推荐指数
1
解决办法
4340
查看次数