Skip to content

QoL improvements#26

Merged
icweaver merged 31 commits intomainfrom
access
Apr 11, 2026
Merged

QoL improvements#26
icweaver merged 31 commits intomainfrom
access

Conversation

@icweaver
Copy link
Copy Markdown
Member

@icweaver icweaver commented Mar 21, 2026

Some changes to the user-facing parts to hopefully reduce friction a bit. Happy to make any edits / drop what doesn't seem helpful.

1. File I/O load/save (depends on JuliaIO/FileIO.jl#427)

# Before
af = ASDF.load_file(...)

# After
af = load(...) # And same for save

To-do:

2. More permissive construction

# Before
doc = Dict{Any, Any}(...); save(..., doc)

# After
doc = Dict(...); save(..., doc)

3. Direct field access

# Before
af.metadata["field1"]

# After
af["field1"]

4. Support OrderedDict

# Before
julia> doc = Dict("field_$(i)" => rand(10) for i in 1:5); # Create some sample data

julia> save("myfile.asdf", doc)

julia> load("myfile.asdf")
myfile.asdf
├─ field_5::Vector{Float64} | shape = (10,)
├─ field_3::Vector{Float64} | shape = (10,)
├─ field_1::Vector{Float64} | shape = (10,)
├─ asdf/library::String
│  ├─ author::String | Erik Schnetter <schnetter@gmail.com>
│  ├─ homepage::String | https://github.com/JuliaAstro/ASDF.jl
│  ├─ name::String | ASDF.jl
│  └─ version::String | 2.0.0
├─ field_2::Vector{Float64} | shape = (10,)
└─ field_4::Vector{Float64} | shape = (10,)

# Åfter
julia> using OrderedCollections: OrderedDict

julia> doc = OrderedDict("field_$(i)" => rand(10) for i in 1:5); # Create some sample data

julia> save("myfile.asdf", doc)

julia> load("myfile.asdf")
myfile.asdf
├─ field_1::Vector{Float64} | shape = (10,)
├─ field_2::Vector{Float64} | shape = (10,)
├─ field_3::Vector{Float64} | shape = (10,)
├─ field_4::Vector{Float64} | shape = (10,)
├─ field_5::Vector{Float64} | shape = (10,)
└─ asdf/library::String
   ├─ author::String | Erik Schnetter <schnetter@gmail.com>
   ├─ homepage::String | https://github.com/JuliaAstro/ASDF.jl
   ├─ name::String | ASDF.jl
   └─ version::String | 2.0.0

5. Cleaned up show method a bit

# Before
ASDF.ASDFFile("test/blue_upchan_gain.00000000.asdf", Dict{Any, Any}(0 => Dict{Any, Any}("dish_index" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file test/blue_upchan_gain.00000000.asdf>), 649, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x62, 0x6c, 0x73, 0x63], 0x0000000000000041, 0x0000000000000041, 0x0000000000000200, UInt8[0xf6, 0x34, 0x97, 0x16, 0xb2, 0x55, 0x1e, 0xa7, 0x2f, 0xd5, 0xb9, 0xb6, 0x3a, 0x86, 0x7d, 0x32])]), nothing, Int32[-1 -1; 42 53; 43 54], [2, 3], "int32", "little", 0, [12, 4]), "buffer" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file test/blue_upchan_gain.00000000.asdf>), 649, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x62, 0x6c, 0x73, 0x63], 0x0000000000000041, 0x0000000000000041, 0x0000000000000200, UInt8[0xf6, 0x34, 0x97, 0x16, 0xb2, 0x55, 0x1e, 0xa7, 0x2f, 0xd5, 0xb9, 0xb6, 0x3a, 0x86, 0x7d, 0x32])]), 0, nothing, [256], "float16", "little", 0, [2]), "dim_names" => ["Fbar"]), "asdf/library" => Dict{Any, Any}("name" => "asdf-cxx", "author" => "Erik Schnetter", "homepage" => "https://github.com/eschnett/asdf-cxx", "version" => "7.2.0")), ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file test/blue_upchan_gain.00000000.asdf>), 649, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x62, 0x6c, 0x73, 0x63], 0x0000000000000041, 0x0000000000000041, 0x0000000000000200, UInt8[0xf6, 0x34, 0x97, 0x16, 0xb2, 0x55, 0x1e, 0xa7, 0x2f, 0xd5, 0xb9, 0xb6, 0x3a, 0x86, 0x7d, 0x32])]))
# After
blue_upchan_gain.00000000.asdf
├─ 0::Int64
│  ├─ buffer::ASDF.NDArray | shape = [256]
│  ├─ dim_names::Vector{String} | shape = (1,)
│  └─ dish_index::ASDF.NDArray | shape = [2, 3]
└─ asdf/library::String
   ├─ author::String | Erik Schnetter
   ├─ homepage::String | https://github.com/eschnett/asdf-cxx
   ├─ name::String | asdf-cxx
   └─ version::String | 7.2.0

This can be additionally controlled with:

julia> ASDF.info(af; max_rows = 5) # Or max_rows = Inf for all rows
blue_upchan_gain.00000000.asdf
├─ 0::Int64
│  ├─ buffer::ASDF.NDArray | shape = [256]
│  ├─ dim_names::Vector{String} | shape = (1,)
│  └─ dish_index::ASDF.NDArray | shape = [2, 3]
    (5) more rows

Update: @cgarling, following up from our community call today, here's a quick comparison for some Roman data:

Currently
ASDF.ASDFFile("docs/data/roman.asdf", Dict{Any, Any}("history" => Dict{Any, Any}("extensions" => Dict{Any, Any}[Dict("software" => Dict{Any, Any}("name" => "asdf", "version" => "4.1.0"), "manifest_software" => Dict{Any, Any}("name" => "asdf_standard", "version" => "1.1.1"), "extension_class" => "asdf.extension._manifest.ManifestExtension", "extension_uri" => "asdf://asdf-format.org/core/extensions/core-1.6.0"), Dict("software" => Dict{Any, Any}("name" => "roman_datamodels", "version" => "0.23.1"), "manifest_software" => Dict{Any, Any}("name" => "rad", "version" => "0.23.1"), "extension_class" => "asdf.extension._manifest.ManifestExtension", "extension_uri" => "asdf://stsci.edu/datamodels/roman/extensions/datamodels-1.0"), Dict("software" => Dict{Any, Any}("name" => "gwcs", "version" => "0.22.1"), "manifest_software" => Dict{Any, Any}("name" => "asdf_wcs_schemas", "version" => "0.4.0"), "extension_class" => "asdf.extension._manifest.ManifestExtension", "extension_uri" => "asdf://asdf-format.org/astronomy/gwcs/extensions/gwcs-1.3.0"), Dict("software" => Dict{Any, Any}("name" => "asdf-astropy", "version" => "0.7.1"), "extension_class" => "asdf.extension._manifest.ManifestExtension", "extension_uri" => "asdf://astropy.org/astropy/extensions/units-1.0.0"), Dict("software" => Dict{Any, Any}("name" => "asdf-astropy", "version" => "0.7.1"), "manifest_software" => Dict{Any, Any}("name" => "asdf_transform_schemas", "version" => "0.5.0"), "extension_class" => "asdf.extension._manifest.ManifestExtension", "extension_uri" => "asdf://asdf-format.org/transform/extensions/transform-1.6.0"), Dict("software" => Dict{Any, Any}("name" => "asdf-astropy", "version" => "0.7.1"), "manifest_software" => Dict{Any, Any}("name" => "asdf_coordinates_schemas", "version" => "0.3.0"), "extension_class" => "asdf.extension._manifest.ManifestExtension", "extension_uri" => "asdf://asdf-format.org/astronomy/coordinates/extensions/coordinates-1.0.0"), Dict("software" => Dict{Any, Any}("name" => "asdf-astropy", "version" => "0.7.1"), "manifest_software" => Dict{Any, Any}("name" => "asdf_standard", "version" => "1.1.1"), "extension_class" => "asdf.extension._manifest.ManifestExtension", "extension_uri" => "asdf://asdf-format.org/astronomy/extensions/astronomy-1.0.0")]), "asdf_library" => Dict{Any, Any}("name" => "asdf", "author" => "The ASDF Developers", "homepage" => "http://github.com/asdf-format/asdf", "version" => "4.1.0"), "roman" => Dict{Any, Any}("dq_border_ref_pix_top" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 23, nothing, [4, 4096], "uint32", "little", 0, [16384, 4]), "data" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 12, nothing, [4088, 4088], "float32", "little", 0, [16352, 4]), "dq_border_ref_pix_bottom" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 24, nothing, [4, 4096], "uint32", "little", 0, [16384, 4]), "amp33" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 16, nothing, [5, 4096, 128], "uint16", "little", 0, [1048576, 256, 2]), "border_ref_pix_top" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 19, nothing, [5, 4, 4096], "float32", "little", 0, [65536, 16384, 4]), "dq" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 13, nothing, [4088, 4088], "uint32", "little", 0, [16352, 4]), "dq_border_ref_pix_left" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 21, nothing, [4096, 4], "uint32", "little", 0, [16, 4]), "var_rnoise" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 14, nothing, [4088, 4088], "float32", "little", 196656, [49152, 12]), "border_ref_pix_bottom" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 20, nothing, [5, 4, 4096], "float32", "little", 0, [65536, 16384, 4]), "border_ref_pix_right" => ASDF.NDArray(ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]), 18, nothing, [5, 4096, 4], "float32", "little", 0, [65536, 16, 4])…)), ASDF.LazyBlockHeaders(ASDF.BlockHeader[ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174593, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cc, 0x00000000000000cc, 0x0000000000000120, UInt8[0xfb, 0xa9, 0x9b, 0xe3, 0x9b, 0x93, 0x2d, 0x3b, 0xce, 0x1f, 0x01, 0x36, 0xc3, 0x4b, 0x1f, 0x4c], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 174851, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d0, 0x00000000000000d0, 0x0000000000000120, UInt8[0x6e, 0x1b, 0x06, 0xe0, 0xe2, 0x5e, 0xf7, 0x1e, 0xa7, 0x38, 0x7a, 0x0d, 0xb4, 0x49, 0x1e, 0xe1], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175113, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000d1, 0x00000000000000d1, 0x0000000000000120, UInt8[0x98, 0x2d, 0x75, 0x72, 0x70, 0xff, 0xb7, 0xfe, 0xee, 0x14, 0xce, 0xc2, 0xfb, 0x4b, 0x65, 0x9f], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175376, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x00000000000000cf, 0x00000000000000cf, 0x0000000000000120, UInt8[0x0e, 0x96, 0x10, 0xa9, 0xd8, 0x73, 0xce, 0x48, 0x78, 0xac, 0x6b, 0xc5, 0xe1, 0xca, 0xea, 0xe9], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175637, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175816, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000023, 0x0000000000000023, 0x0000000000000020, UInt8[0xaf, 0x3c, 0xeb, 0x00, 0xc5, 0x49, 0x49, 0xaf, 0xf4, 0xf0, 0x5b, 0x50, 0x18, 0x12, 0x59, 0x52], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175905, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000024, 0x0000000000000024, 0x0000000000000020, UInt8[0xef, 0x5b, 0xbd, 0x96, 0x5f, 0x64, 0x79, 0xd4, 0x4b, 0x19, 0x34, 0xde, 0x0e, 0xb9, 0xa3, 0x8e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 175995, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000002a, 0x000000000000002a, 0x0000000000000020, UInt8[0x61, 0x10, 0xb6, 0x1e, 0x07, 0x80, 0x9b, 0x69, 0x7c, 0xfa, 0x5a, 0x59, 0x34, 0xb8, 0xe9, 0x73], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 176091, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000000001a, 0x000000000000001a, 0x0000000000000010, UInt8[0x94, 0x80, 0x88, 0x98, 0x51, 0x4c, 0xfb, 0x51, 0xf2, 0x5e, 0x92, 0x71, 0xf3, 0xf8, 0x3f, 0x31], false)  …  ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338409315, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000005075, 0x0000000000005075, 0x0000000000500000, UInt8[0x5f, 0x36, 0x3e, 0x0e, 0x58, 0xa9, 0x5f, 0x06, 0xcb, 0xe9, 0xbb, 0xc6, 0x62, 0xc5, 0xdf, 0xb6], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338429966, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338431323, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338432680, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338434037, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000517, 0x0000000000000517, 0x0000000000050000, UInt8[0x1a, 0xca, 0x77, 0xe2, 0x18, 0x8f, 0x52, 0xa6, 0x26, 0x74, 0xfe, 0x8a, 0x87, 0x3b, 0xda, 0xba], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435394, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338435726, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436058, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436390, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x0000000000000116, 0x0000000000000116, 0x0000000000010000, UInt8[0x4d, 0x54, 0xd5, 0x61, 0xbe, 0x32, 0x4c, 0x5f, 0x0f, 0xad, 0x2e, 0x65, 0xb4, 0x21, 0x4a, 0x5e], false), ASDF.BlockHeader(IOStream(<file docs/data/roman.asdf>), 338436722, UInt8[0xd3, 0x42, 0x4c, 0x4b], 0x0030, 0x00000000, UInt8[0x6c, 0x7a, 0x34, 0x00], 0x000000000004012d, 0x000000000004012d, 0x0000000003fc0100, UInt8[0x95, 0xfd, 0xd5, 0x53, 0x69, 0x08, 0xe1, 0x9f, 0x63, 0xa3, 0x60, 0xda, 0xcd, 0x7a, 0x28, 0x70], false)]))
This PR
roman.asdf
├─ history::String
│  └─ extensions::Vector{Dict{Any, Any}} | shape = (7,)
├─ asdf_library::String
│  ├─ author::String | The ASDF Developers
│  ├─ homepage::String | http://github.com/asdf-format/asdf
│  ├─ name::String | asdf
│  └─ version::String | 4.1.0
└─ roman::String
   ├─ amp33::ASDF.NDArray | shape = [5, 4096, 128]
   ├─ border_ref_pix_bottom::ASDF.NDArray | shape = [5, 4, 4096]
   ├─ border_ref_pix_left::ASDF.NDArray | shape = [5, 4096, 4]
   ├─ border_ref_pix_right::ASDF.NDArray | shape = [5, 4096, 4]
   ├─ border_ref_pix_top::ASDF.NDArray | shape = [5, 4, 4096]
   ├─ data::ASDF.NDArray | shape = [4088, 4088]
   ├─ dq::ASDF.NDArray | shape = [4088, 4088]
   ├─ dq_border_ref_pix_bottom::ASDF.NDArray | shape = [4, 4096]
   ├─ dq_border_ref_pix_left::ASDF.NDArray | shape = [4096, 4]
   ├─ dq_border_ref_pix_right::ASDF.NDArray | shape = [4096, 4]
   ├─ dq_border_ref_pix_top::ASDF.NDArray | shape = [4, 4096]
   ├─ err::ASDF.NDArray | shape = [4088, 4088]
   ├─ meta::String
   │  ├─ asn::String
   │  ├─ cal_logs::Vector{String} | shape = (817,)
   │  ├─ cal_step::String
   │  │  ├─ assign_wcs::String | COMPLETE
   │  │  ├─ dark::String | COMPLETE
   │  │  ├─ dq_init::String | COMPLETE
   │  │  ├─ flat_field::String | COMPLETE
   │  │  ├─ flux::String | INCOMPLETE
   │  │  ├─ linearity::String | COMPLETE
   │  │  ├─ outlier_detection::String | INCOMPLETE
   │  │  ├─ photom::String | COMPLETE
   │  │  ├─ ramp_fit::String | COMPLETE
   │  │  ├─ refpix::String | COMPLETE
   │  │  ├─ saturation::String | COMPLETE
   │  │  ├─ skymatch::String | INCOMPLETE
   │  │  ├─ source_catalog::String | COMPLETE
   │  │  └─ tweakreg::String | COMPLETE
   │  ├─ calibration_software_name::String | RomanCAL
   │  ├─ calibration_software_version::String | 0.18.0
   │  ├─ coordinates::String
   │  │  └─ reference_frame::String | ICRS
   │  ├─ ephemeris::String
   │  │  ├─ earth_angle::Int64 | -999999
   │  │  ├─ ephemeris_reference_frame::String | ?
   │  │  ├─ moon_angle::Int64 | -999999
   │  │  ├─ spatial_x::Float64 | 1.1814930392300647e8
   │  │  ├─ spatial_y::Float64 | 8.171086593471536e7
   │  │  ├─ spatial_z::Float64 | 3.5433691335827544e7
   │  │  ├─ sun_angle::Int64 | -999999
   │  │  ├─ time::Float64 | 61344.0
   │  │  ├─ type::String | DEFINITIVE
   │  │  ├─ velocity_x::Float64 | -18.474060504144184
   │  │  ├─ velocity_y::Float64 | 21.671509956074864
   │  │  └─ velocity_z::Float64 | 9.394886442040915
   │  ├─ exposure::String
   │  │  ├─ data_problem::Bool | false
   │  │  ├─ effective_exposure_time::Float64 | 45.6
   │  │  ├─ end_time::String | 2026-10-31T00:00:51.680
   │  │  ├─ exposure_time::Float64 | 51.68
   │  │  ├─ frame_time::Float64 | 3.04
   │  │  ├─ ma_table_name::String | ?
   │  │  ├─ ma_table_number::Int64 | 3
   │  │  ├─ mid_time::String | 2026-10-31T00:00:25.840
   │  │  ├─ nresultants::Int64 | 5
   │  │  ├─ read_pattern::Vector{Vector{Int64}} | shape = (5,)
   │  │  ├─ start_time::String | 2026-10-31T00:00:00.000
   │  │  ├─ truncated::Bool | false
   │  │  └─ type::String | WFI_IMAGE
   │  ├─ exptype::String | SCIENCE
   │  ├─ file_date::String | 2020-01-01T00:00:00.000
   │  ├─ filename::String | r0003201001001001004_0001_wfi01_f106_cal.asdf
   │  ├─ group_id::String | 00032010010010010040001
   │  ├─ guide_star::String
   │  │  ├─ centroid_rms::Int64 | -999999
   │  │  ├─ centroid_x::Int64 | -999999
   │  │  ├─ centroid_x_uncertainty::Int64 | -999999
   │  │  ├─ centroid_y::Int64 | -999999
   │  │  ├─ centroid_y_uncertainty::Int64 | -999999
   │  │  ├─ data_end::String | 2020-01-01T01:00:00.000
   │  │  ├─ data_start::String | 2020-01-01T00:00:00.000
   │  │  ├─ dec::Int64 | -999999
   │  │  ├─ dec_uncertainty::Int64 | -999999
   │  │  ├─ epoch::String | ?
   │  │  ├─ fgs_magnitude::Int64 | -999999
   │  │  ├─ fgs_magnitude_uncertainty::Int64 | -999999
   │  │  ├─ gsc_version::String | ?
   │  │  ├─ guide_mode::String | WSM-ACQ-2
   │  │  ├─ guide_star_id::String | ?
   │  │  ├─ guide_window_id::String | ?
   │  │  ├─ parallax::Int64 | -999999
   │  │  ├─ proper_motion_dec::Int64 | -999999
   │  │  ├─ proper_motion_ra::Int64 | -999999
   │  │  ├─ ra::Int64 | -999999
   │  │  ├─ ra_uncertainty::Int64 | -999999
   │  │  ├─ window_xsize::Int64 | 16
   │  │  ├─ window_xstart::Int64 | -999999
   │  │  ├─ window_xstop::Int64 | -999999
   │  │  ├─ window_ysize::Int64 | 16
   │  │  ├─ window_ystart::Int64 | -999999
   │  │  └─ window_ystop::Int64 | -999999
   │  ├─ instrument::String
   │  │  ├─ detector::String | WFI01
   │  │  ├─ name::String | WFI
   │  │  └─ optical_element::String | F106
   │  ├─ model_type::String | ImageModel
   │  ├─ observation::String
   │  │  ├─ execution_plan::Int64 | 1
   │  │  ├─ exposure::Int64 | 1
   │  │  ├─ observation::Int64 | 1
   │  │  ├─ observation_id::String | 00032010010010010040001
   │  │  ├─ pass::Int64 | 1
   │  │  ├─ program::Int64 | 32
   │  │  ├─ segment::Int64 | 1
   │  │  ├─ visit::Int64 | 4
   │  │  ├─ visit_file_activity::String | 01
   │  │  ├─ visit_file_group::Int64 | 1
   │  │  ├─ visit_file_sequence::Int64 | 1
   │  │  └─ visit_id::String | 0003201001001001004
   │  ├─ origin::String | STSCI/SOC
   │  ├─ photometry::String
   │  │  ├─ conversion_megajanskys::Float64 | 0.7417487930165987
   │  │  ├─ conversion_megajanskys_uncertainty::Float64 | 0.028857321159254122
   │  │  └─ pixel_area::Float64 | 2.8083389953727505e-13
   │  ├─ pointing::String
   │  │  ├─ dec_v1::Float64 | 0.2959999999347126
   │  │  ├─ pa_v3::Float64 | 59.99907035922454
   │  │  ├─ ra_v1::Float64 | 270.93999195229344
   │  │  ├─ target_aperture::String | WFI_CEN
   │  │  ├─ target_dec::Float64 | -0.2
   │  │  └─ target_ra::Float64 | 270.94
   │  ├─ prd_version::String | 8.8.8
   │  ├─ product_type::String | l2
   │  ├─ program::String
   │  │  ├─ category::String | ?
   │  │  ├─ continuation_id::Int64 | -999999
   │  │  ├─ investigator_name::String | ?
   │  │  ├─ science_category::String | ?
   │  │  ├─ subcategory::String | None
   │  │  └─ title::String | ?
   │  ├─ rcs::String
   │  │  ├─ active::Bool | false
   │  │  ├─ bank::String | 1
   │  │  ├─ counts::Int64 | -999999
   │  │  ├─ electronics::String | A
   │  │  └─ led::String | 1
   │  ├─ ref_file::String
   │  │  ├─ area::String | N/A
   │  │  ├─ crds::String
   │  │  │  ├─ context::String | roman_0027.pmap
   │  │  │  └─ version::String | 12.1.4
   │  │  ├─ dark::String | crds://roman_wfi_dark_0444.asdf
   │  │  ├─ distortion::String | crds://roman_wfi_distortion_0014.asdf
   │  │  ├─ flat::String | crds://roman_wfi_flat_0175.asdf
   │  │  ├─ gain::String | crds://roman_wfi_gain_0022.asdf
   │  │  ├─ inverse_linearity::String | N/A
   │  │  ├─ linearity::String | crds://roman_wfi_linearity_0003.asdf
   │  │  ├─ mask::String | crds://roman_wfi_mask_0030.asdf
   │  │  ├─ photom::String | crds://roman_wfi_photom_0040.asdf
   │  │  ├─ readnoise::String | crds://roman_wfi_readnoise_0024.asdf
   │  │  ├─ refpix::String | crds://roman_wfi_refpix_0013.asdf
   │  │  └─ saturation::String | crds://roman_wfi_saturation_0031.asdf
   │  ├─ sdf_software_version::String | 7.7.7
   │  ├─ source_catalog::String
   │  │  └─ tweakreg_catalog_name::String | r0003201001001001004_0001_wfi01_f106_cat.asdf
   │  ├─ telescope::String | ROMAN
   │  ├─ velocity_aberration::String
   │  │  ├─ dec_reference::Float64 | -0.16439949970729792
   │  │  ├─ ra_reference::Float64 | 270.8719766359773
   │  │  └─ scale_factor::Float64 | 1.0
   │  ├─ visit::String
   │  │  ├─ dither::String
   │  │  │  ├─ executed_pattern::Vector{Int64} | shape = (9,)
   │  │  │  ├─ primary_name::Nothing | nothing
   │  │  │  └─ subpixel_name::Nothing | nothing
   │  │  ├─ end_time::String | 2020-01-01T00:00:00.000
   │  │  ├─ engineering_quality::String | OK
   │  │  ├─ internal_target::Bool | false
   │  │  ├─ nexposures::Int64 | -999999
   │  │  ├─ pointing_engineering_source::String | CALCULATED
   │  │  ├─ start_time::String | 2020-01-01T00:00:00.000
   │  │  ├─ status::String | SUCCESSFUL
   │  │  └─ type::String | PRIME_TARGETED_FIXED
   │  ├─ wcs::String
   │  │  ├─ name::String | FIT-LVL2-GAIADR3
   │  │  ├─ pixel_shape::Nothing | nothing
   │  │  └─ steps::Vector{Dict{Any, Any}} | shape = (5,)
   │  ├─ wcs_fit_results::String
   │  │  ├─ <rot>::Float64 | -3.8550664171942765e-6
   │  │  ├─ <scale>::Float64 | 1.0
   │  │  ├─ center::Vector{Float64} | shape = (2,)
   │  │  ├─ fitgeom::String | rshift
   │  │  ├─ mae::Float64 | 0.0016960513501491892
   │  │  ├─ matrix::Vector{Vector{Float64}} | shape = (2,)
   │  │  ├─ nmatches::Int64 | 1399
   │  │  ├─ proper::Bool | true
   │  │  ├─ proper_rot::Float64 | -3.8550664171942765e-6
   │  │  ├─ rmse::Float64 | 0.001967154556791072
   │  │  ├─ rot::Vector{Float64} | shape = (2,)
   │  │  ├─ scale::Vector{Float64} | shape = (2,)
   │  │  ├─ shift::Vector{Float64} | shape = (2,)
   │  │  ├─ skew::Float64 | 0.0
   │  │  └─ status::String | SUCCESS
   │  └─ wcsinfo::String
   │     ├─ aperture_name::String | WFI01_FULL
   │     ├─ dec_ref::Float64 | -0.16439949970729792
   │     ├─ pa_aperture::Float64 | 0.0
   │     ├─ ra_ref::Float64 | 270.8719766359773
   │     ├─ roll_ref::Float64 | 59.99991238605934
   │     ├─ s_region::String | POLYGON ICRS  270.934669679 -0.225719501 270.934611821 -0.102755795
   │     │  270.809021726 -0.102451279 270.809744086 -0.225310345
   │     ├─ v2_ref::Float64 | 1312.9491452484797
   │     ├─ v3_ref::Float64 | -1040.7853726755036
   │     ├─ v3yangle::Float64 | -60.0
   │     └─ vparity::Int64 | -1
   ├─ var_flat::ASDF.NDArray | shape = [4088, 4088]
   ├─ var_poisson::ASDF.NDArray | shape = [4088, 4088]
   └─ var_rnoise::ASDF.NDArray | shape = [4088, 4088]

So, not great, but at least more readable. I'm thinking now it would probably be better to have a max_rows cut-off by default, and then hand-off more display control to a dedicated info function like the Python library does

Update: Mkay, just added in a simple info function to control how much output to show (full snippet below):

ASDF.jl/src/ASDF.jl

Lines 518 to 557 in 21a5c4f

struct ASDFTreeNode
key::Any
value::Any
end
AbstractTrees.children(n::ASDFTreeNode) =
n.value isa ASDFFile ? [ASDFTreeNode(k, v) for (k, v) in n.value.metadata] :
n.value isa Dict ? [ASDFTreeNode(k, v) for (k, v) in sort(collect(n.value); by = first)] : ()
AbstractTrees.printnode(io::IO, n::ASDFTreeNode) =
n.key === nothing ? print(io, n.value.filename) :
n.value isa Dict ? print(io, n.key, "::", typeof(n.key)) :
n.value isa NDArray ? print(io, n.key, "::", typeof(n.value), " | shape = ", n.value.shape) :
n.value isa AbstractVector ? print(io, n.key, "::" , typeof(n.value), " | shape = ", size(n.value)) :
print(io, n.key, "::", typeof(n.value), " | ", n.value)
"""
info(io::IO, af::ASDFFile; max_rows = 20)
Display up to `max_rows` lines of `af` tree. `Base.show` calls this function internally to display this type.
"""
function info(io::IO, af::ASDFFile; max_rows = 20)
root = ASDFTreeNode(nothing, af)
n_rows = sum(1 for _ in AbstractTrees.PostOrderDFS(root))
if n_rows max_rows
AbstractTrees.print_tree(io, root)
else
# Store entire tree in `buf`
buf = IOBuffer()
AbstractTrees.print_tree(buf, root)
# Only print up to `n_rows` lines from that buffer
lines = split(String(take!(buf)), '\n', keepempty = false)
foreach(l -> println(io, l), Iterators.take(lines, max_rows))
println(io, " ⋮ (", n_rows - max_rows, ") more rows")
end
end
info(af; kwargs...) = info(stdout, af; kwargs...)
Base.show(io::IO, ::MIME"text/plain", af::ASDFFile) = info(io, af) # Display up to `max_rows` by default

It truncates to 20 lines by default now

This was referenced Mar 21, 2026
@codecov
Copy link
Copy Markdown

codecov bot commented Mar 23, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.75%. Comparing base (5e5154b) to head (280abb0).
⚠️ Report is 32 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main      #26   +/-   ##
=======================================
  Coverage   99.74%   99.75%           
=======================================
  Files           1        1           
  Lines         389      401   +12     
=======================================
+ Hits          388      400   +12     
  Misses          1        1           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@icweaver icweaver mentioned this pull request Mar 23, 2026
8 tasks
@cgarling
Copy link
Copy Markdown
Member

Nice! I would draw attention to the ability to display the whole structure with info(af; max_rows=Inf) in the docs by including it in an example if possible.

@icweaver
Copy link
Copy Markdown
Member Author

Thanks, Chris! This pushed me to finally start trying the doctest-as-a-test workflow. It seemed like getting the show method tests to be OS-agnostic would be a pain, so I just modified the top-level root to display the file name instead of its path. efbfb46

@cgarling
Copy link
Copy Markdown
Member

Cool to have the doctests run in the test suite! And nice docstring!

@icweaver
Copy link
Copy Markdown
Member Author

icweaver commented Mar 30, 2026

Thanks! I guess the next thing would be to have the ouptut of the underlying dict be deterministic / preserve insertion order. I have an experimental branch for that here with OrderedDict https://github.com/JuliaAstro/ASDF.jl/tree/ordered. On the flipside, idk what implications this would have for performance yet. Maybe just displaying the keys as sorted but leaving the underlying data as an ordinary dict would work better

Heading out the door now, but can try implementing it here sometime tomorrow to see how things shake out

@icweaver
Copy link
Copy Markdown
Member Author

icweaver commented Mar 31, 2026

Ok, ran some things. This is not a comprehensive benchmark by any means and is probably just mostly measuring YAML.jl's I/O, but I think I am seeing the following for loading/saving modest payloads:

Summary

Write

number of rows main ordered ordered / main
10 13.168 ms 14.118 ms 1.07
100 150.620 ms 153.041 ms 1.02
1000 1753.000 ms 1841.000 ms 1.05

Load

number of rows main ordered ordered / main
10 153.268 ms 154.631 ms 1.01
100 1559.000 ms 1572.000 ms 1.01
1000 16420.000 ms 16472.000 ms 1.00

So about 2% - 7% increase in write times and maybe 1% increase in load times when using an OrderedDict to store our data. This makes me inclined to just stick with an unordered dict and save the sorting for display only when Base.show or ASDF.info is called, but having things unordered still kind of bugs me. Idk, do y'all have a sense on which behavior would be preferred?

Here's the benchmark code too in case I am missing something more subtle.

Details

Setup

using ASDF
using OrderedCollections: OrderedDict
using BenchmarkTools: @btime

make_doc(n_rows) = Dict{Any, Any}("field_$(i)" => rand(3, 4, 500) for i in 1:n_rows)

make_doc_ordered(n_rows) = OrderedDict{Any, Any}("field_$(i)" => rand(3, 4, 500) for i in 1:n_rows)

function write_file(n_rows)
    doc = make_doc(n_rows)
    path = string(tempname(), ".asdf")
    ASDF.write_file(path, doc)
    return path
end

function write_file_ordered(n_rows)
    doc = make_doc_ordered(n_rows)
    path = string(tempname(), ".asdf")
    ASDF.write_file(path, doc)
    return path
end

Unordered Dict (main branch)

Write

julia> @btime ASDF.write_file(path, make_doc(10)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  13.168 ms (315520 allocations: 32.35 MiB)

julia> @btime ASDF.write_file(path, make_doc(100)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  150.620 ms (3154378 allocations: 323.46 MiB)

julia> @btime ASDF.write_file(path, make_doc(1_000)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  1.753 s (31544057 allocations: 3.16 GiB)

Load

julia> @btime ASDF.load_file(path) setup = (path = write_file(10)) teardown = (rm(path; force = true)) evals = 1;
  153.268 ms (481148 allocations: 35.64 MiB)

julia> @btime ASDF.load_file(path) setup = (path = write_file(100)) teardown = (rm(path; force = true)) evals = 1;
  1.559 s (4807425 allocations: 256.82 MiB)

julia> @btime ASDF.load_file(path) setup = (path = write_file(1_000)) teardown = (rm(path; force = true)) evals = 1;
  16.420 s (48072067 allocations: 2.41 GiB)

OrderedDict (ordered branch)

Write

julia> @btime ASDF.write_file(path, make_doc_ordered(10)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  14.118 ms (315586 allocations: 32.35 MiB)

julia> @btime ASDF.write_file(path, make_doc_ordered(100)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  153.041 ms (3155000 allocations: 323.48 MiB)

julia> @btime ASDF.write_file(path, make_doc_ordered(1_000)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  1.841 s (31552824 allocations: 3.16 GiB)

Load

julia> @btime ASDF.load_file(path) setup = (path = write_file_ordered(10)) teardown = (rm(path; force = true)) evals = 1;
  154.631 ms (481147 allocations: 35.64 MiB)

julia> @btime ASDF.load_file(path) setup = (path = write_file_ordered(100)) teardown = (rm(path; force = true)) evals = 1;
  1.572 s (4807375 allocations: 256.81 MiB)

julia> @btime ASDF.load_file(path) setup = (path = write_file_ordered(1_000)) teardown = (rm(path; force = true)) evals = 1;
  16.472 s (48071814 allocations: 2.41 GiB)

@cgarling
Copy link
Copy Markdown
Member

cgarling commented Mar 31, 2026

Preserving insertion order is nice, in multi-step reduction pipelines (take ASDF file -> do something to it -> add new metadata describing what you did) it allows you to more easily track the flow of alterations. I think using OrderedDict would probably be nice for this

Edit: I'm not sure whether the ASDF specification defines if insertion order should be maintained or not. Particularly in the case that you read ASDF file -> add entries to tree -> write tree out. Might be worth checking what the python implementation does and just mirroring that choice for cross-language consistency.

@icweaver
Copy link
Copy Markdown
Member Author

icweaver commented Mar 31, 2026

For sure. It's my understanding that python dicts are ordered by default these days, so they get this for free

It might be nice to swap OrderedDict for Dictionaries.jl one day, which looks to also support ordered dicts by default in its impl, but I think that would require a more comprehensive integration with YAML.jl

@icweaver
Copy link
Copy Markdown
Member Author

icweaver commented Mar 31, 2026

Ok, I got curious and tried it by getting Claude to monkey-patching YAML.jl to use Dictionaries.jl, and then calling that from a modified branch of ASDF.jl. It didn't really seem to make a difference compared to OrderedDict in the initial benchmarks I tried, oh well.

Details
julia> make_doc(n_rows) = Dictionary{Any, Any}(["field_$(i)" for i in 1:n_rows], [rand(3, 4, 500) for i in 1:n_rows])
make_doc (generic function with 1 method)

julia> @btime ASDF.write_file(path, make_doc(10)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  14.258 ms (315574 allocations: 32.35 MiB)

julia> @btime ASDF.write_file(path, make_doc(100)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  153.420 ms (3154807 allocations: 323.47 MiB)

julia> @btime ASDF.write_file(path, make_doc(1_000)) setup = (path = string(tempname(), ".asdf")) teardown = (rm(path; force = true)) evals = 1
  1.783 s (31551037 allocations: 3.16 GiB)

julia> @btime ASDF.load_file(path) setup = (path = write_file(10)) teardown = (rm(path; force = true)) evals = 1;
  159.012 ms (481180 allocations: 35.64 MiB)

julia> @btime ASDF.load_file(path) setup = (path = write_file(100)) teardown = (rm(path; force = true)) evals = 1;
  1.620 s (4807592 allocations: 256.83 MiB)

julia> @btime ASDF.load_file(path) setup = (path = write_file(1000)) teardown = (rm(path; force = true)) evals = 1;
  17.013 s (48072570 allocations: 2.41 GiB)

It's also vibe coded as hell and I would be hesitant to submit it even as a draft PR, at least in its current form. Idk if it's worth pursuing further, but it's there if we ever want to try picking it up in the future I guess

@cgarling
Copy link
Copy Markdown
Member

I've never used Dictionaries.jl so I don't have any insight to add. I would probably opt for OrderedDict myself, seems like the performance hit is minimal and it will replicate the python behavior as people may expect it to.

@icweaver
Copy link
Copy Markdown
Member Author

Sounds good. Things are looking green now

@icweaver icweaver changed the title Some potential QoL improvements QoL improvements Apr 4, 2026
@icweaver
Copy link
Copy Markdown
Member Author

icweaver commented Apr 11, 2026

Okie doke, things are merged in FileIO.jl now. I'm going to start staging things in the main branch so that we'll just have a single PR to make the switch from using their master branch to using their release

@icweaver icweaver merged commit 32fa708 into main Apr 11, 2026
16 checks passed
@icweaver icweaver deleted the access branch April 11, 2026 04:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants