scikit-hep / uproot3-methods

Pythonic behaviors for non-I/O related ROOT classes.
BSD 3-Clause "New" or "Revised" License
21 stars 28 forks source link

Consistent method resolution order (MRO) issue with TLorentzVector #88

Open PerilousApricot opened 4 years ago

PerilousApricot commented 4 years ago

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).

nsmith- commented 4 years ago

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- commented 4 years ago

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

PerilousApricot commented 4 years ago

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