pyLCIO setMomentum:python中的错误常量float* 背景: 我正在执行一个叫做C++代码的LCIO,但是有一个Python包装器叫做PalcIO .< /P> 当试图运行一个名为 StimeMimube()/Cuff>的函数时,C++实现看起来是这样的: void setMomentum (const float p[3])

pyLCIO setMomentum:python中的错误常量float* 背景: 我正在执行一个叫做C++代码的LCIO,但是有一个Python包装器叫做PalcIO .< /P> 当试图运行一个名为 StimeMimube()/Cuff>的函数时,C++实现看起来是这样的: void setMomentum (const float p[3]),python,c++,pyroot,Python,C++,Pyroot,简单浮点数组 好的,让我们试试这个: 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", lin

简单浮点数组

好的,让我们试试这个:

 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
无济于事;同样的错误。

基于,看起来他们使用元组而不是数组来表示3个元素向量


您应该能够执行类似“particle.setMomentum((1.0,2.0,3.0))”的操作,并让它工作。同样,getMomentum将返回一个3元素的元组。

我给开发人员发了电子邮件,这就是响应

使用swig的LCIO的python绑定很久以前就停止了,它们与pyLCIO没有任何关系,因此您找到的文档并不相关

pyLCIO构建在pyROOT绑定之上,利用LCIO提供的根字典,允许将LCIO对象直接存储在根文件中。这些字典还隐式地为所有类提供python接口。在pyROOT中,c样式数组(或任何其他指向基本类型的指针)必须作为python数组或相应类型的numpy数组传递(例如,请参见中的“19.1.9.2编写树”)。 (另外,您应该使用IMPL.MCParticleImpl手动构造MCParticles,请参阅。IOIMPL版本仅从SIO流中添加一个构造函数,而从LCIO文件中读取它需要该构造函数)

在这种情况下,你应该这样做

from pyLCIO import IMPL
from array import array
particle=IMPL.MCParticleImpl()
p = array('f', [1.0, 2.0, 3.0])    # the type ‘f’ has the length of a C++ float, for a double use ‘d'
particle.setMomentum(p)
由于我从不喜欢LCIO的设计选择,即将物理向量作为c样式数组传递,因此我扩展了pyLCIO中的所有类接口,以支持根物理向量(TVector3)的使用。所有实际上是物理向量的setter和getter都有另一个版本,称为setXxxVec()或getXxxVec(),它们接受或返回物理向量。如果一个对象有getEnergy和getMomentum,那么它在pyLCIO中也会有getLorentzVec,它返回一个根TLorentzVector对象。有关扩展接口,请参阅。因此,在您的示例中,您还可以使用

from pyLCIO import IMPL
from ROOT import TVector3
particle=IMPL.MCParticleImpl()
p = TVector3(1.0, 2.0, 3.0)
particle.setMomentumVec(p)

由于您正在尝试创建LCIO文件,因此可能会发现此示例很有用。事实上,它已经包含了一个如何创建MCParticle对象的示例。请看一下其他示例,了解如何使用pyLCIO。

在python中使用c数据类型的ctypes模块在哪里。我在您引用的文档中看到了该注释。非常感谢你找到这个!然而,它没有起作用,尽管该文档和Swig都表示元组应该起作用。我给欧洲核子研究中心的某个人发了一封电子邮件,询问这件事。这似乎比使用c_类型更正确。
from pyLCIO import IMPL
from ROOT import TVector3
particle=IMPL.MCParticleImpl()
p = TVector3(1.0, 2.0, 3.0)
particle.setMomentumVec(p)