uproot3-methods icon indicating copy to clipboard operation
uproot3-methods copied to clipboard

Consistent method resolution order (MRO) issue with TLorentzVector

Open PerilousApricot opened this issue 4 years ago • 3 comments

I'm unsure if this belongs here or perhaps with awkward (though I think it is here).

The following reduced snippet:

import awkward
import uproot_methods
ex = awkward.JaggedArray.fromiter([ [1.0], [2.0, 3.0] ])
p4 = uproot_methods.TLorentzVectorArray.from_ptetaphim(ex, ex, ex, ex)
p4crossp4 = p4.cross(p4)
awkward.topandas(p4crossp4)

Throws

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    awkward.topandas(p4crossp4)
  File "/home/meloam/00-projects/tauid/venv/lib/python3.6/site-packages/awkward/util.py", line 225, in topandas
    return pandas.DataFrame({n: out[n] for n in out.columns}, columns=out.columns)
  File "/home/meloam/00-projects/tauid/venv/lib/python3.6/site-packages/awkward/util.py", line 225, in <dictcomp>
    return pandas.DataFrame({n: out[n] for n in out.columns}, columns=out.columns)
  File "/home/meloam/00-projects/tauid/venv/lib/python3.6/site-packages/awkward/array/jagged.py", line 514, in __getitem__
    cls = awkward.array.objects.Methods.maybemixin(type(content), self.JaggedArray)
  File "/home/meloam/00-projects/tauid/venv/lib/python3.6/site-packages/awkward/array/objects.py", line 29, in maybemixin
    return type(awkwardtype.__name__ + "Methods", allbases, {})
TypeError: Cannot create a consistent method resolution
order (MRO) for bases AwkwardSeries, ExtensionArray, JaggedSeries

with

awkward==0.12.21
awkward-numba==0.12.21
uproot==3.11.7
uproot-methods==0.7.4

There's a couple of different ways to trigger whatever's happening, but they all involve taking the cross product of a TLorentzVector (the same operation with floats succeeds).

PerilousApricot avatar Jul 06 '20 19:07 PerilousApricot

Seems like the pandas conversion is trying to create a new type that pandas will eat, but messes up. Depending on the use case, it might be worth moving to awkward1. An early implementation of vector types is now available in coffea.nanoevents.methods. Here's an example:

import awkward1
import coffea.nanoevents.methods  # the import registers the types in awkward1.behavior
ex = awkward1.Array([ [1.0], [2.0, 3.0] ])
p4 = awkward1.zip({"pt": ex, "eta": ex, "phi": ex, "mass": ex}, with_name="PtEtaPhiMLorentzVector")
print(awkward1.pandas.df(p4))
p4c = awkward1.cartesian([p4, p4])
# this should have worked but there seems to be a bug
awkward1.pandas.df(p4c)

nsmith- avatar Jul 13 '20 17:07 nsmith-

Made an issue: https://github.com/scikit-hep/awkward-1.0/issues/331

nsmith- avatar Jul 13 '20 17:07 nsmith-

Thanks for the response! I'll try moving this code forward to awkward1

PerilousApricot avatar Jul 13 '20 17:07 PerilousApricot