On-disk format#
TreeData is written to .h5td (HDF5) and .zarr stores using the same
hierarchical, self-describing layout as AnnData. A TreeData file is an
AnnData file with a few extra top-level elements, so almost everything is
covered by the AnnData on-disk format — read that first. This
page documents only what TreeData adds.
Top-level#
The root group carries encoding-type: "treedata" and, in addition to the
standard AnnData elements (X, obs, var, obsm, uns, …), stores:
Element |
Type |
Description |
|---|---|---|
|
scalar (string) or absent |
Column in |
|
scalar (bool) |
Whether trees may share nodes |
|
scalar (string) |
One of |
|
see below |
Trees aligned to observations |
|
see below |
Trees aligned to variables |
obst and vart are mappings of a key to a :class:networkx.DiGraph. They are
the only elements stored differently from AnnData, and the layout depends on the
backend.
Trees in HDF5 (.h5td)#
Each of obst/vart is stored as a single JSON string dataset mapping tree
key → {"nodes": {...}, "edges": {...}}, with node and edge attributes inline:
{"tree1": {"nodes": {"root": {"depth": 0}, "0": {}},
"edges": {"root": {"0": {"length": 1.5}}}}}
Trees in zarr#
zarr cannot store a single arbitrarily large string, so each of obst/vart is
a group with one subgroup per tree, stored columnar:
obst/
tree1/
nodes # 1-D array of node IDs
edges # (n_edges, 2) array of (source, target) pairs
node_attrs/ # one array per node-attribute key (optional)
depth
characters
edge_attrs/ # one array per edge-attribute key (optional)
length
The number of arrays scales with the number of attribute keys, not the number of nodes.
Each attribute column has one entry per node (or edge), in the order of nodes
(or edges), and is encoded one of two ways:
Native — a dense column whose values are all a single numeric or boolean type is stored with the corresponding native array dtype (e.g.
int64,float64,bool).JSON — any other column (strings, ragged/nested values, mixed types, columns missing from some nodes) is stored as a string array of per-element JSON. The empty string
""marks an absent attribute, so a value explicitly set tonullis preserved and kept distinct from a missing one.
Note
zarr files written before treedata 0.3.0 stored obst/vart as a single JSON
string (as in HDF5). Such files are still read correctly; the format is detected
at read time.