1

从使用 zlib 压缩的树中读取数据时uproot,我发现 zlib 存在一些压缩错误,例如:Error -3 while decompressing data: incorrect data check或者Error -5 while decompressing data: incomplete or truncated stream.当我在 ROOT 中打开文件时,我从 zlib 中得到类似的错误:

R__unzip: error -3 in inflate (zlib)
Error in <TBasket::ReadBasketBuffers>: fNbytes = 20102, fKeylen = 199, fObjlen = 28540, noutot = 0, nout=0, nin=19903, nbuf=28540
Error in <TBranchElement::GetBasket>: File: Stage_1_files/AnalysisResults.31.root at byte:51212830, branch:data.fJetConstituents.fPt, entry:133851, badread=1, nerrors=1, basketnumber=189
...

但是,ROOT 会跳过有问题的条目(或多个条目)并继续尝试读取文件。在 uproot 中,zlib 异常被向上传递。我抓住了它,但我无法继续处理该文件。该文件显然存在潜在问题(似乎来自我无法控制的 ROOT 合并问题),但是有没有办法让根目录识别并跳过有问题的条目并继续处理其余数据?我可以想象在阅读时限制条目,但我如何在不反复试验的情况下通过根目录识别它们?我只能通过在根目录中逐个读取每个分支来识别有问题的分支,并且仍然无法识别哪些条目是问题(或通过检查 ROOT)。

谢谢!

4

1 回答 1

1

TTrees 中的数据由篮子压缩,因此如果篮子的压缩被破坏,则无法从该篮子中读取数据,但所有其他篮子都可能正常。

如果任何篮子引发错误,Uproot 的数组读取函数就会放弃,但您可以使用更底层的TBranch.basket方法一个一个地读取篮子,并在此过程中捕获任何异常。从 TTree 中获取一个具有类似 dict 访问权限的 TBranch 对象(例如mytree["branch_name"]),并basket(i, ...)使用您传递给的相同参数进行调用,TTree.array但另外使用篮子编号i。(他们从开始0并上升到但不包括TBranch.numbaskets。)

还有一个TBranch.iterate_baskets, 但在这里它不会帮助你,因为它会在遇到异常时停止迭代。您需要控制篮子上的循环以将其包装在 try-catch 逻辑中。

还有一个问题:您可能需要关联来自不同分支的数据,并且它们的篮子可能不会以相同的条目编号开始和结束。如果您询问TTree.clusters(branches_list)您感兴趣的分支,它将在篮子边界处为您提供您提供的分支集共有的进入开始和停止编号。在正常方法entrystart中使用这些条目号只会读取请求的篮子,您可以在其周围放置 try-catch 逻辑。entrystopTTree.arrays

于 2020-03-11T12:48:15.480 回答