pyLCIO setMomentum:python中的error const float*

2024-03-29 10:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:

我正在执行一个叫做“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>}?你知道吗

谢谢你的帮助。你知道吗

编辑180314

我试过:

particle.setMomentum((1.0,2.0,3.0))

无济于事;同样的错误。你知道吗


Tags: 函数代码inpy错误line数组float
2条回答

基于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文件中读取它所需要的。你知道吗

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

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对象。有关扩展接口,请参见https://github.com/iLCSoft/LCIO/blob/master/src/python/pyLCIO/base/DecorateLcioClasses.py。所以在你的例子中,你也可以用

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

由于您正在尝试创建LCIO文件,您可能会发现这个示例非常有用https://github.com/iLCSoft/LCIO/blob/master/examples/python/EventBuilder.py。事实上,它已经包含了一个如何创建MCParticle对象的示例。关于如何使用pyLCIO,请看一下其他示例。你知道吗

相关问题 更多 >