Uproot:将分支添加到根文件中的现有 TTree
Uproot: Add branch to existing TTree in root file
我正在尝试使用 uproot 将分支添加到我在 .root 文件中的现有 TTree。连根拔起有可能吗?
不,这不可能。
第一个困难是打开任意 ROOT 文件并以可靠的方式向其中添加任何内容(即结果可以由 ROOT 读回,但更多内容可以由 ROOT 添加,而不会出现段错误)。如果你想要长话短说,它在 scikit-hep/uproot#381,但简短的故事是,如果 Uproot 自己制作文件,Uproot 控制初始条件并可以将文件置于已知的良好状态。我们(Uproot 的开发者)可以在不了解 100% 状态的情况下知道一些好的状态 space。但是如果我们想接受来自 ROOT 的文件,修改它们,然后将它们还给 ROOT,那么我们必须了解它的 filesystem-inside-a-file 碎片整理算法可以进入的所有可能状态,然后我们才能相信我们对这些状态的修改保持在 space 的良好状态。了解状态 space 需要大量研究,因为 (1) 它是一个可以回收免费 space 和所有内容的完整文件系统,并且 (2) 格式的这方面没有规范.它由 C++ 代码的作用定义。
第二个难点是向现有的TTree 添加一个TBranch。这还没有实现,但更易于管理:我们只需制作一个带有额外 TBranch 的 TTree 元数据的新副本,并将 link 新元数据复制到旧的 TBaskets(数据)。主要困难是将任何对象添加到预先存在的 ROOT 文件中。
我正在尝试使用 uproot 将分支添加到我在 .root 文件中的现有 TTree。连根拔起有可能吗?
不,这不可能。
第一个困难是打开任意 ROOT 文件并以可靠的方式向其中添加任何内容(即结果可以由 ROOT 读回,但更多内容可以由 ROOT 添加,而不会出现段错误)。如果你想要长话短说,它在 scikit-hep/uproot#381,但简短的故事是,如果 Uproot 自己制作文件,Uproot 控制初始条件并可以将文件置于已知的良好状态。我们(Uproot 的开发者)可以在不了解 100% 状态的情况下知道一些好的状态 space。但是如果我们想接受来自 ROOT 的文件,修改它们,然后将它们还给 ROOT,那么我们必须了解它的 filesystem-inside-a-file 碎片整理算法可以进入的所有可能状态,然后我们才能相信我们对这些状态的修改保持在 space 的良好状态。了解状态 space 需要大量研究,因为 (1) 它是一个可以回收免费 space 和所有内容的完整文件系统,并且 (2) 格式的这方面没有规范.它由 C++ 代码的作用定义。
第二个难点是向现有的TTree 添加一个TBranch。这还没有实现,但更易于管理:我们只需制作一个带有额外 TBranch 的 TTree 元数据的新副本,并将 link 新元数据复制到旧的 TBaskets(数据)。主要困难是将任何对象添加到预先存在的 ROOT 文件中。