0

所以我使用pyroot来做数据分析。分析代码链在数据上运行不同的插件并将它们输出到根文件,将每个插件的输出存储到根文件中它们自己的 TDirectoryFile 中。我写了一个函数,它接受根文件的名称和插件的名称,并且应该返回插件 TDirectoryFile。然而,它返回一个 NoneType,然后在我尝试对该对象执行任何操作时立即崩溃。

from ROOT import *

def getPluginData(fName,pName):
    tfile=TFile("Analyzer.root")
    plugin= tfile.Get("MuIndNeuSpallPlugin")
    #outputs <class 'ROOT.TDirectoryFile'>
    print type(MuIndNeuSpallPlugin)
    return plugin


#This should be a  <class 'ROOTTDirectoryFile'.>, but is a NoneType instead
MuIndNeuSpallPlugin=getPluginData("Analyzer.root","MuIndNeuSpallPlugin")
4

1 回答 1

0

所以在我关于根谈话的帖子(https://root.cern.ch/phpBB3/viewtopic.php?f=14&t=23242 )上,一张海报解释了为什么会发生这种情况。基本上 tfile 是在函数中定义的,当函数 descopes 时,它的使用计数减少到 0 并且它的 c++ 版本被删除。插件,即 TDirectoryFile,包含在 tfile 中,所以当 tfile 被删除时,它会随之而来。解决方案是在全局范围内定义 tfile,传递它而不是它的文件名字符串。

根导入 *

def getPluginData(tfile,pName):
    plugin= tfile.Get(pName)
    print type(MuIndNeuSpallPlugin)
    return plugin
tfile=TFile("Analyzer.root")
MuIndNeuSpallPlugin=getPluginData(tfile,"MuIndNeuSpallPlugin")

这行得通,但我觉得这种反直觉或至少不是非常pythonic,并且有点打破python。

于 2017-02-22T23:46:45.070 回答