Representation of Bluesky Runs in Tiled#

Tiled is a data management system that allows for the storage and retrieval of structured data along with the associated metadata.

The TiledWriter callback is designed specifically for converting Bluesky run documents into a format suitable for storage in a Tiled database.

It implicitly distinguishes between “internal” and “external” data. The internal data are associated with the Event documents generated during a run; typically this represents scalar measurements from sensors, motor positions, etc., which are stored in a table with columns corresponding to different data keys and each row representing a measurement at a single timestamp.

On the other hand, the external data are written by detectors directly to disk and usually take the form of images or multidimensional arrays. The references to the external files are provided in StreamResource (Resource in legacy implementations) documents, which register the corresponding array-like DataSources in Tiled. StreamDatum (or Datum) documents are processed via the mechanism of Consolidators and determine the correspondence between the indexing within these external arrays and the physically-meaningful sequence of timestamps.

The time dimension (that is, the sequence of measurements) is usually shared between internal and external data. Tiled handles this by writing all data from the same Bluesky stream into a container with a dedicated "composite" spec, which tells the Tiled client how the data are aligned. Each stream node’s metadata includes the specifications for the related data keys as well as the configuration parameters provided in the EventDescriptor document.

Finally, nodes for multiple streams are grouped together and placed into a container for the entire run; its metadata contains the Start and Stop documents. The Run container created by TiledWriter is designated with the BlueskyRun version 3.0 spec to enable its back-compatibility with legacy code via bluesky-tiled-plugins.

An example of the Tiled catalog structure for a Bluesky run might look like this:

BlueskyRun <Container ("BlueskyRun_v3")>
│
├─ baseline <Container ("composite")>
│       ├─ internal <Table>   <-- data from Event documents
│       ├─ image_1 <Array>    <-- external (registered) data
│       │
│       │      ...
│       └─ image_n <Array>
│
├─ primary <Container ("composite")>
│       ├─ internal <Table>
│       ├─ image_1 <Array>
│       │
│       │      ...
│       └─ image_n <Array>
│
└─ third_stream <Container ("composite")>

Note

To be able to use TiledWriter, the Tiled server must be configured with an SQL catalog and an SQL-backed storage database for tabular data.