Skip to content

Add a hardcoded reader for TMatrixTSym<T> (no file ever carries its StreamerInfo) #73

Open

Description

@nsmith-

🤖 AI generated content

Line item of #9: Missing derived class streamer for TMatrixTSym<double> (uproot-issue-359.root; formerly "unknown type TMatrixTSym3cdouble3e"). Currently a special-cased NotImplementedError at src/rootfilespec/dynamic.py:95-100.

Spec: Matrices and vectors §2.2 — TMatrixTSym<Element>::Streamer passes ReadClassBuffer the TClass of TMatrixTBase<Element>, not its own, so "the file carries no streamer info for TMatrixTSym<T> at all … a reader … must dispatch on the name." The error message's premise (a missing derived streamer) is therefore wrong: it is never there. Confirmed: this file's entire streamer-info list is one entry, TMatrixTBase<double> v5.

§4 gives the read procedure: read the frame (the version word is TMatrixTBase's, 5), decode the base's members from the base's info, then — past the end implied by the byte count — read fNrows × (fNrows + 1) / 2 values of T in row order, row i holding fNcols − i of them. TMatrixTSym is one of the three extending classes of Buffer framing §2.4: "A byte count is a lower bound on the length of the object." The spec uses this very file as its independent witness: five records, 29×29 and 58×58, accounting to the byte. data/classes/matrix.root in the vendored spec is a second test vector.

Suggested fix: one hardcoded class in bootstrap/ dispatched on the name prefix TMatrixTSym<, which reads its base via the file's TMatrixTBase<T> info and then the packed triangle; element width from the template argument (double → 8, float → 4).

Severity / size: low, S–M, self-contained. Clears 1 xfail. The "object may extend past its byte count" handling overlaps #98.

Related: #9, #101.

Assisted-by: claude-code:claude-fable-5-1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions