uproot5 icon indicating copy to clipboard operation
uproot5 copied to clipboard

How can I "dump" / get the content of objects of "experiment specific" / "custom" classes (from a TTree)

Open jpivarski opened this issue 1 year ago • 0 comments

Discussed in https://github.com/scikit-hep/uproot5/discussions/948

Originally posted by JacekHoleczek August 24, 2023 I need to "move" (to here) my original StackOverflow topic: How can I "dump" / get the content of objects of "experiment specific" / "custom" classes (from a TTree) Apparently, they do not allow any discussions there (they simply deleted my follow-up).

Many thanks for your reply on the StackOverflow.

The standard ROOT provides the TFile::MakeProject method, which can generate "source code" for classes present in the file (only "data members" are "recovered" from the "streamer info", of course). I understand uproot does not provide such functionality (i.e., I cannot get "automatically generated" Python classes).

To start, I'd now like to play with a small "header" tree with just a single branch:

POTInfo_v2                      | Header                               | AsObjects(Model_Header)

The root_directory.file.show_streamers('Header') returns:

Header (v1)
    _POT_CountedPerFile: double (TStreamerBasicType)
    _POT_NoCut: double (TStreamerBasicType)
    _POT_BadBeam: double (TStreamerBasicType)
    _POT_BadND280: double (TStreamerBasicType)
    _POT_GoodBeamGoodND280: double (TStreamerBasicType)
    _POT_0KA: double (TStreamerBasicType)
    _POT_200KA: double (TStreamerBasicType)
    _POT_250KA: double (TStreamerBasicType)
    _POT_m250KA: double (TStreamerBasicType)
    _POT_OtherKA: double (TStreamerBasicType)
    _POTInfo: double (TStreamerBasicType)
    _Spill_NoCut: int (TStreamerBasicType)
    _Spill_BadBeam: int (TStreamerBasicType)
    _Spill_BadND280: int (TStreamerBasicType)
    _Spill_GoodBeamGoodND280: int (TStreamerBasicType)
    _SpillInfo: int (TStreamerBasicType)
    _IsMC: bool (TStreamerBasicType)
    _SoftwareVersion: string (TStreamerSTLstring)
    _pot_def_counter: int (TStreamerBasicType)
    _spill_def_counter: int (TStreamerBasicType)

So, there are just some double, some int, one bool, and one std::string ordinary variables (no arrays at all).

When I try to retrieve just the first entry:

root_directory['header']['POTInfo_v2'].array(entry_stop=1)

I get (note: it now thinks _POTInfo and _SpillInfo are arrays):

(...)
DeserializationError: while reading

    Header version 6792 as uproot.dynamic.Model_Header_v1 (71320410 bytes)
        _POT_CountedPerFile: 2.6612249000050942e-110
        _POT_NoCut: 0.0
        _POT_BadBeam: 0.0
        _POT_BadND280: 0.0
        _POT_GoodBeamGoodND280: 0.0
        _POT_0KA: 0.0
        _POT_200KA: 0.0
        _POT_250KA: 0.0
        _POT_m250KA: 0.0
        _POT_OtherKA: 3.7076069415964e-310
        _POTInfo: array([7.67844769e-239, 0.00000000e+000, 0.00000000e+000, 3.70760694e-310,
       7.67844769e-239, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
       0.00000000e+000], dtype='>f8')
        _Spill_NoCut: 0
        _Spill_BadBeam: 0
        _Spill_BadND280: 96
        _Spill_GoodBeamGoodND280: -1051394048
        _SpillInfo: array([          0,           0,          96, -1051394048,         320,
              2304], dtype='>i4')
        _IsMC: True
Members for Header: (_POT_CountedPerFile), (_POT_NoCut), (_POT_BadBeam), (_POT_BadND280), (_POT_GoodBeamGoodND280), (_POT_0KA), (_POT_200KA), (_POT_250KA), (_POT_m250KA), (_POT_OtherKA), (_POTInfo), (_Spill_NoCut), (_Spill_BadBeam), (_Spill_BadND280), (_Spill_GoodBeamGoodND280), (_SpillInfo), (_IsMC), _SoftwareVersion, _pot_def_counter, _spill_def_counter

attempting to get bytes 234:283
outside expected range 0:246 for this Chunk
in file NumuCCMultiPi_MCrun4.root
in object /header;1

It seems I'm missing something again (adding "library='ak'", "library='np'", or "library='pd'" does not help).

There's nothing exotic about this class definition, so Uproot should be able to read it. I've labeled it "bug (unverified)" as a reminder to try to reproduce it and fix whatever the problem is.

jpivarski avatar Aug 24 '23 17:08 jpivarski