我正在执行一个叫做“LCIO”的particle physics library,它是C++代码,但是有一个名为PyrIO的Python包装器。你知道吗
当试图运行一个名为^ {CD1.>}的函数时,C++实现看起来是这样的:
void setMomentum (const float p[3])
简单的浮点数组。你知道吗
好吧,让我们试试这个:
particle.setMomentum([1.0,2.0,3.0])
现在这抛出了一个错误。以下是回溯:
Traceback (most recent call last):
File "driver.py", line 5, in <module>
particle.setMomentum(momentum)
File "/path/to/pyLCIO/base/HandleExceptions.py", line 17, in wrappedMethod
return method(*args, **kargs)
TypeError: none of the 2 overloaded methods succeeded. Full details:
void MCParticleImpl::setMomentum(const float* p) =>
could not convert argument 1
void MCParticleImpl::setMomentum(const double* p) =>
could not convert argument 1
现在这个函数要求一个#1常量,#2数组头的引用。我该怎么用python来做呢?你知道吗
< PythPosion是否使用Python的能力包了C++代码,知道如何在Python中创建^ {< CD2>}?你知道吗谢谢你的帮助。你知道吗
我试过:
particle.setMomentum((1.0,2.0,3.0))
无济于事;同样的错误。你知道吗
基于http://lcio.desy.de/v01-07/src/python/lcio_swig.i,它们似乎使用元组而不是数组来表示3个元素向量。你知道吗
你应该可以做一些像粒子.setMomentum((1.0,2.0,3.0)),让它工作。同样,getMomentum将返回一个3元素元组。你知道吗
我给开发者发了邮件,这是回复。你知道吗
使用swig的LCIO的python绑定在很久以前就已经停止了,它们与pyLCIO没有任何关系,因此您发现的文档是不相关的。你知道吗
pyLCIO构建在pyROOT绑定之上,利用LCIO提供的根字典,允许将LCIO对象直接存储在根文件中。这些字典还隐式地为所有类提供python接口。在pyROOT中,c样式数组(或任何其他指向基本类型的指针)必须作为python数组或相应类型的numpy数组传递(例如,请参见https://root.cern.ch/root/htmldoc/guides/users-guide/ROOTUsersGuide.html#using-pyroot中的“19.1.9.2编写树”)。 (另外,您应该使用IMPL.MCParticleImpl实现要手工构造MCParticles,请参见http://lcio.desy.de/v02-09/doc/doxygen_api/html/classIMPL_1_1MCParticleImpl.html。IOIMPL版本只从SIO流中添加了一个构造函数,而SIO流是从LCIO文件中读取它所需要的。你知道吗
在这种情况下你应该这样做
由于我从不喜欢LCIO的设计选择,将物理向量作为c风格的数组传递,因此我扩展了pyLCIO中的所有类接口,以支持根物理向量(TVector3)的使用。所有实际上是物理向量的setter和getter都有另一个版本setXxxVec()或getXxxVec(),它们接受或返回物理向量。如果一个对象有getEnergy和getMomentum,那么它在pyLCIO中也会有getLorentzVec,它返回一个根TLorentzVector对象。有关扩展接口,请参见https://github.com/iLCSoft/LCIO/blob/master/src/python/pyLCIO/base/DecorateLcioClasses.py。所以在你的例子中,你也可以用
由于您正在尝试创建LCIO文件,您可能会发现这个示例非常有用https://github.com/iLCSoft/LCIO/blob/master/examples/python/EventBuilder.py。事实上,它已经包含了一个如何创建MCParticle对象的示例。关于如何使用pyLCIO,请看一下其他示例。你知道吗
相关问题 更多 >
编程相关推荐