Skip to content

Instantly share code, notes, and snippets.

@danielballan
Last active October 19, 2020 20:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielballan/73307287307a1f16b8018592363efef9 to your computer and use it in GitHub Desktop.
Save danielballan/73307287307a1f16b8018592363efef9 to your computer and use it in GitHub Desktop.
New BlueskyRun work
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A Better, Simpler in-memory `BlueskyRun`\n",
"\n",
"## User Stories\n",
"\n",
"1. I have an array/dataframe/dataset from some computation, and I want to wrap it up in the document model so I can store it in a \"databroker or analyzed/processed data\". I can use RunBuilder to make a BlueskyRun, and that push its documents through a Serializer.\n",
"2. I have a file of data *not* acquired using Bluesky that I want to \"ingest\" into databroker so I can use databroker's search and access tools. Similar to (1) I can write code that reads the file into standard data structures and then use RunBuilder from there.\n",
"3. I am writing a \"Best Effort Visualization\" GUI. I want to receive documents from Bluesky in a streaming fashion (e.g. via a Kafka message bus) and generate live-updating plots. I could do this directly using the documents (like LivePlot, LiveGrid in bluesky have done for years) but I don't know what the heck an \"Event Descriptor\" is, or a \"Start document\". However, I do know some pandas, so I can deal with copying an example that shows me I should call `run.primary.read().to_dataframe()` and write my plotting code from there.\n",
"\n",
"## Goals\n",
"\n",
"* Build a `BlueskyRun` using a stanard `pandas.DataFrame` or `xarray.Dataset` or dict-of-lists --- anything with a \"dataframe-like\" structure.\n",
"* Enable the `BlueskyRun` to be incrementally appended to, and provide a way for downstream code to be notified.\n",
"* Do not *require* notions like timestamps-per-each-reading and (hardware) configuration, which are somehwat acquisition-oriented notions, but *allow* them.\n",
"\n",
"This is implemented in the new experimental repository bluesky-widgets for intiial evaluation, but the constituent parts will be \"upstreamed\" into event-model, databroker, or wherever is appropriate."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from bluesky_live.run_builder import RunBuilder"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## BlueskyRun from a dict-of-arrays, a `pandas.DataFrame`, or an `xarray.Dataset`\n",
"\n",
"### Basic Example\n",
"\n",
"Suppose you have one of the above standard data structures and you want to construct a `BlueskyRun` which you can hand off to things that expect `BlueskyRun`s. The `RunBuilder` is a convenient way to do that."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='7e625610-2c0a-4101-86c4-1a822565ec10'\n",
" exit_status=None\n",
" 2020-10-19 16:20:58.271 -- ?\n",
" (No Streams)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"builder = RunBuilder()\n",
"run = builder.get_run() # Access a BlueskyRun at any point, including at the start.\n",
"run"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Provide metadata about a \"stream\", a logical table, of data to come."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"builder.add_stream(\n",
" \"primary\",\n",
" data_keys={\n",
" \"x\": {\"source\": \"made up\", \"dtype\": \"number\", \"shape\": []},\n",
" \"y\": {\"source\": \"made up\", \"dtype\": \"number\", \"shape\": []}\n",
" }\n",
") "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `BlueskyRun` is notified of this update and immediately reflects it."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='7e625610-2c0a-4101-86c4-1a822565ec10'\n",
" exit_status=None\n",
" 2020-10-19 16:20:58.271 -- ?\n",
" Streams:\n",
" * primary\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or, provide it with some `data` and it can infer the `data_keys`."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='7e625610-2c0a-4101-86c4-1a822565ec10'\n",
" exit_status=None\n",
" 2020-10-19 16:20:58.271 -- ?\n",
" Streams:\n",
" * primary\n",
" * baseline\n"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"builder.add_stream(\"baseline\", data={'a': [1, 1, 2, 3, 5, 8]})\n",
"run"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can access the data we have so far in any stream."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
" --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
" --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
" --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
" --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
" --xr-background-color: var(--jp-layout-color0, white);\n",
" --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
" --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
"}\n",
"\n",
"html[theme=dark],\n",
"body.vscode-dark {\n",
" --xr-font-color0: rgba(255, 255, 255, 1);\n",
" --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
" --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
" --xr-border-color: #1F1F1F;\n",
" --xr-disabled-color: #515151;\n",
" --xr-background-color: #111111;\n",
" --xr-background-color-row-even: #111111;\n",
" --xr-background-color-row-odd: #313131;\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: '►';\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: '▼';\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: '(';\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: ')';\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: ',';\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" display: none;\n",
" background-color: var(--xr-background-color) !important;\n",
" padding-bottom: 5px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt, dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2 {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt;\n",
"Dimensions: (time: 6)\n",
"Coordinates:\n",
" * time (time) float64 1.603e+09 1.603e+09 ... 1.603e+09 1.603e+09\n",
"Data variables:\n",
" a (time) int64 1 1 2 3 5 8\n",
" seq_num (time) int64 0 1 2 3 4 5\n",
" uid (time) &lt;U36 &#x27;f77a7ae6-8dbe-45de-8ad8-1d9d8a5f9b82&#x27; ... &#x27;22a1b9d4...</pre><div class='xr-wrap' hidden><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-c8afa97b-ac3f-4ff1-ba43-d70a8dafc3c2' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-c8afa97b-ac3f-4ff1-ba43-d70a8dafc3c2' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>time</span>: 6</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-6cff4a59-3c2d-4179-9d45-18bc2bc59972' class='xr-section-summary-in' type='checkbox' checked><label for='section-6cff4a59-3c2d-4179-9d45-18bc2bc59972' class='xr-section-summary' >Coordinates: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>1.603e+09 1.603e+09 ... 1.603e+09</div><input id='attrs-de94c143-6b63-4eec-aef4-3927ff2d6469' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-de94c143-6b63-4eec-aef4-3927ff2d6469' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-43b4e805-0dc5-44ed-aa36-8caeb9df0f1c' class='xr-var-data-in' type='checkbox'><label for='data-43b4e805-0dc5-44ed-aa36-8caeb9df0f1c' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([1.603139e+09, 1.603139e+09, 1.603139e+09, 1.603139e+09, 1.603139e+09,\n",
" 1.603139e+09])</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-c527c9ca-89e9-4e24-8028-f1c601538958' class='xr-section-summary-in' type='checkbox' checked><label for='section-c527c9ca-89e9-4e24-8028-f1c601538958' class='xr-section-summary' >Data variables: <span>(3)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>a</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>1 1 2 3 5 8</div><input id='attrs-0866939e-f4c6-4e58-8655-a52426475d9d' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-0866939e-f4c6-4e58-8655-a52426475d9d' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-c55cbace-d8f0-4b57-a861-342fb354cbd2' class='xr-var-data-in' type='checkbox'><label for='data-c55cbace-d8f0-4b57-a861-342fb354cbd2' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([1, 1, 2, 3, 5, 8])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>seq_num</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>0 1 2 3 4 5</div><input id='attrs-6e5a93ec-6255-416e-a0fc-319170a8408a' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-6e5a93ec-6255-416e-a0fc-319170a8408a' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-54108db4-4b3c-4b0e-93a8-abdea364f2f1' class='xr-var-data-in' type='checkbox'><label for='data-54108db4-4b3c-4b0e-93a8-abdea364f2f1' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([0, 1, 2, 3, 4, 5])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>uid</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>&lt;U36</div><div class='xr-var-preview xr-preview'>&#x27;f77a7ae6-8dbe-45de-8ad8-1d9d8a5...</div><input id='attrs-6f8aec63-3873-49f0-a424-c6931228726e' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-6f8aec63-3873-49f0-a424-c6931228726e' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-4289970d-f88a-43d1-b8d1-4bb179099336' class='xr-var-data-in' type='checkbox'><label for='data-4289970d-f88a-43d1-b8d1-4bb179099336' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([&#x27;f77a7ae6-8dbe-45de-8ad8-1d9d8a5f9b82&#x27;,\n",
" &#x27;e103ce6c-cdca-4935-84b9-ca860207e9b7&#x27;,\n",
" &#x27;c1195c5d-607a-4093-9501-75e30a747a18&#x27;,\n",
" &#x27;390f508d-fde7-4959-a2b7-8e65463aa9e9&#x27;,\n",
" &#x27;d14e7fed-4fc8-446a-984f-4786c5912209&#x27;,\n",
" &#x27;22a1b9d4-1f37-4684-b5f9-a20bf686ddd2&#x27;], dtype=&#x27;&lt;U36&#x27;)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-756614fc-a84f-402d-ad8e-e3f4d13e0b96' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-756614fc-a84f-402d-ad8e-e3f4d13e0b96' class='xr-section-summary' title='Expand/collapse section'>Attributes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'></dl></div></li></ul></div></div>"
],
"text/plain": [
"<xarray.Dataset>\n",
"Dimensions: (time: 6)\n",
"Coordinates:\n",
" * time (time) float64 1.603e+09 1.603e+09 ... 1.603e+09 1.603e+09\n",
"Data variables:\n",
" a (time) int64 1 1 2 3 5 8\n",
" seq_num (time) int64 0 1 2 3 4 5\n",
" uid (time) <U36 'f77a7ae6-8dbe-45de-8ad8-1d9d8a5f9b82' ... '22a1b9d4..."
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run.baseline.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can add data to any stream. It can be of several different types, and it's even OK to mix them. (They are normalized internally.)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"builder.add_data(\"primary\", {'x': [1, 2, 3], 'y': [10, 20, 30]}) # simple dict"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"import pandas\n",
"builder.add_data(\"primary\", pandas.DataFrame({'x': [4, 5, 6], 'y': [40, 50, 60]})) # accepts DataFrames too"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"import xarray\n",
"builder.add_data(\"primary\", xarray.Dataset({'x': xarray.DataArray([7, 8, 9]), 'y': xarray.DataArray([70, 80, 90])})) # and DataArrays"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='7e625610-2c0a-4101-86c4-1a822565ec10'\n",
" exit_status=None\n",
" 2020-10-19 16:20:58.271 -- ?\n",
" Streams:\n",
" * primary\n",
" * baseline\n"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"builder.close()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='7e625610-2c0a-4101-86c4-1a822565ec10'\n",
" exit_status='success'\n",
" 2020-10-19 16:20:58.271 -- 2020-10-19 16:21:05.291\n",
" Streams:\n",
" * primary\n",
" * baseline\n"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
" --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
" --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
" --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
" --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
" --xr-background-color: var(--jp-layout-color0, white);\n",
" --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
" --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
"}\n",
"\n",
"html[theme=dark],\n",
"body.vscode-dark {\n",
" --xr-font-color0: rgba(255, 255, 255, 1);\n",
" --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
" --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
" --xr-border-color: #1F1F1F;\n",
" --xr-disabled-color: #515151;\n",
" --xr-background-color: #111111;\n",
" --xr-background-color-row-even: #111111;\n",
" --xr-background-color-row-odd: #313131;\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: '►';\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: '▼';\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: '(';\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: ')';\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: ',';\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" display: none;\n",
" background-color: var(--xr-background-color) !important;\n",
" padding-bottom: 5px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt, dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2 {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt;\n",
"Dimensions: (time: 9)\n",
"Coordinates:\n",
" * time (time) float64 1.603e+09 1.603e+09 ... 1.603e+09 1.603e+09\n",
"Data variables:\n",
" x (time) int64 1 2 3 4 5 6 7 8 9\n",
" y (time) int64 10 20 30 40 50 60 70 80 90\n",
" seq_num (time) int64 0 1 2 0 1 2 0 1 2\n",
" uid (time) &lt;U36 &#x27;24c70420-5e13-4ff5-89bb-2bbe20a40d94&#x27; ... &#x27;8248670f...</pre><div class='xr-wrap' hidden><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-1136ed21-ed5b-4988-8e45-8c58d528fe43' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-1136ed21-ed5b-4988-8e45-8c58d528fe43' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>time</span>: 9</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-fee6f8d8-e46a-415b-8fc7-a3dd131435b7' class='xr-section-summary-in' type='checkbox' checked><label for='section-fee6f8d8-e46a-415b-8fc7-a3dd131435b7' class='xr-section-summary' >Coordinates: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>1.603e+09 1.603e+09 ... 1.603e+09</div><input id='attrs-1547a352-cb4f-45af-a7ec-38773ba73f65' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-1547a352-cb4f-45af-a7ec-38773ba73f65' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-530f7a69-64c1-4a25-96e3-06fe6bc26965' class='xr-var-data-in' type='checkbox'><label for='data-530f7a69-64c1-4a25-96e3-06fe6bc26965' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([1.603139e+09, 1.603139e+09, 1.603139e+09, 1.603139e+09, 1.603139e+09,\n",
" 1.603139e+09, 1.603139e+09, 1.603139e+09, 1.603139e+09])</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-58f3d1b0-58f2-45a1-8c73-2eabe6c8294e' class='xr-section-summary-in' type='checkbox' checked><label for='section-58f3d1b0-58f2-45a1-8c73-2eabe6c8294e' class='xr-section-summary' >Data variables: <span>(4)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>x</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>1 2 3 4 5 6 7 8 9</div><input id='attrs-1261adab-41ac-4b23-afd5-d331f4f83c64' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-1261adab-41ac-4b23-afd5-d331f4f83c64' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-e57ce733-ef1c-4aff-af96-c969f8c9b3f2' class='xr-var-data-in' type='checkbox'><label for='data-e57ce733-ef1c-4aff-af96-c969f8c9b3f2' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([1, 2, 3, 4, 5, 6, 7, 8, 9])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>y</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>10 20 30 40 50 60 70 80 90</div><input id='attrs-8fb34527-e209-443f-8ad5-04f90231e118' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-8fb34527-e209-443f-8ad5-04f90231e118' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-50d791e9-96e6-452f-b658-ffc915eadac2' class='xr-var-data-in' type='checkbox'><label for='data-50d791e9-96e6-452f-b658-ffc915eadac2' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([10, 20, 30, 40, 50, 60, 70, 80, 90])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>seq_num</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>0 1 2 0 1 2 0 1 2</div><input id='attrs-63e7882b-8cbb-4141-b8bb-27fef98df9f2' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-63e7882b-8cbb-4141-b8bb-27fef98df9f2' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-efcecf39-73ff-4bcd-abbf-261b0063200b' class='xr-var-data-in' type='checkbox'><label for='data-efcecf39-73ff-4bcd-abbf-261b0063200b' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([0, 1, 2, 0, 1, 2, 0, 1, 2])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>uid</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>&lt;U36</div><div class='xr-var-preview xr-preview'>&#x27;24c70420-5e13-4ff5-89bb-2bbe20a...</div><input id='attrs-2ec8ed97-990a-4bf5-9d80-280803eb8c54' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-2ec8ed97-990a-4bf5-9d80-280803eb8c54' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-a436f2a5-ba97-4224-b2d9-bf6011a93433' class='xr-var-data-in' type='checkbox'><label for='data-a436f2a5-ba97-4224-b2d9-bf6011a93433' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([&#x27;24c70420-5e13-4ff5-89bb-2bbe20a40d94&#x27;,\n",
" &#x27;d605fdf1-2eea-49c1-9bbf-d872de8ef194&#x27;,\n",
" &#x27;0f0c650d-d8e2-438d-92b4-993dffa02acc&#x27;,\n",
" &#x27;f67421eb-a1b3-49c7-9382-4ff71c82d514&#x27;,\n",
" &#x27;d2460b65-09de-488e-a81c-c469b771e4c3&#x27;,\n",
" &#x27;440a0c10-2f5e-44be-86c8-b7df02fccf2e&#x27;,\n",
" &#x27;2c0a29be-cfd8-4a9b-ab96-4375e48f6ca4&#x27;,\n",
" &#x27;7aee16b2-104d-4e2f-be4c-984231bc2dd4&#x27;,\n",
" &#x27;8248670f-ef67-4839-9c5c-2b07ba25146f&#x27;], dtype=&#x27;&lt;U36&#x27;)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-e61869e9-f9e4-4efd-af88-97991ce76771' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-e61869e9-f9e4-4efd-af88-97991ce76771' class='xr-section-summary' title='Expand/collapse section'>Attributes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'></dl></div></li></ul></div></div>"
],
"text/plain": [
"<xarray.Dataset>\n",
"Dimensions: (time: 9)\n",
"Coordinates:\n",
" * time (time) float64 1.603e+09 1.603e+09 ... 1.603e+09 1.603e+09\n",
"Data variables:\n",
" x (time) int64 1 2 3 4 5 6 7 8 9\n",
" y (time) int64 10 20 30 40 50 60 70 80 90\n",
" seq_num (time) int64 0 1 2 0 1 2 0 1 2\n",
" uid (time) <U36 '24c70420-5e13-4ff5-89bb-2bbe20a40d94' ... '8248670f..."
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run.primary.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### More metadata\n",
"\n",
"Metadata can (and should!) be added to the \"start\" and \"stop\" documents."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'start': Start({'operator': 'Dan',\n",
" 'sample': {'barcode': 12345, 'composition': 'Cu'},\n",
" 'time': 1603138866.643127,\n",
" 'uid': '8674bbc5-6056-48b4-8ed7-691f3c7e59ac'}),\n",
" 'stop': None}"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"builder = RunBuilder(metadata={\"sample\": {\"composition\": \"Cu\", \"barcode\": 12345}, \"operator\": \"Dan\"})\n",
"run = builder.get_run() # Access a BlueskyRun at any point, including at the start.\n",
"run.metadata"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'start': Start({'operator': 'Dan',\n",
" 'sample': {'barcode': 12345, 'composition': 'Cu'},\n",
" 'time': 1603138866.643127,\n",
" 'uid': '8674bbc5-6056-48b4-8ed7-691f3c7e59ac'}),\n",
" 'stop': Stop({'exit_status': 'abort',\n",
" 'num_events': {},\n",
" 'reason': 'sample_on_fire',\n",
" 'run_start': '8674bbc5-6056-48b4-8ed7-691f3c7e59ac',\n",
" 'time': 1603138867.118881,\n",
" 'uid': '0f76bf2d-4401-4d96-bd5e-d62d50bd78b6'})}"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"builder.close(exit_status=\"abort\", reason=\"sample_on_fire\")\n",
"run.metadata"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Context managers\n",
"\n",
"By using `RunBuilder` as a context manager, you can ensure that it is definitely closed even in the event of an error. The `exit_status` metadata reflects whether it closed successfully or in error."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='7d937931-d7d5-46fb-bf10-71d2c1b1f930'\n",
" exit_status='success'\n",
" 2020-10-19 16:21:07.994 -- 2020-10-19 16:21:07.998\n",
" Streams:\n",
" * primary\n"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with RunBuilder() as builder:\n",
" builder.add_stream(\"primary\", data={'x': [1, 2, 3], 'y': [10, 20, 30]})\n",
"builder.get_run()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# An example with a failure"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"ename": "ZeroDivisionError",
"evalue": "division by zero",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-18-b934215327d7>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mRunBuilder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mbuilder\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mbuilder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_stream\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"primary\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'x'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'y'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m20\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m30\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;36m1\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;31m# error!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mZeroDivisionError\u001b[0m: division by zero"
]
}
],
"source": [
"with RunBuilder() as builder:\n",
" builder.add_stream(\"primary\", data={'x': [1, 2, 3], 'y': [10, 20, 30]})\n",
" 1 / 0 # error!"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='32db5ac1-571d-47f4-80ca-4143cc70224b'\n",
" exit_status='fail'\n",
" 2020-10-19 16:21:08.772 -- 2020-10-19 16:21:08.775\n",
" Streams:\n",
" * primary\n"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run = builder.get_run()\n",
"run # Notice exit_status='fail'"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'start': Start({'time': 1603138868.7723176, 'uid': '32db5ac1-571d-47f4-80ca-4143cc70224b'}),\n",
" 'stop': Stop({'exit_status': 'fail',\n",
" 'num_events': {'primary': 2},\n",
" 'reason': \"ZeroDivisionError('division by zero')\",\n",
" 'run_start': '32db5ac1-571d-47f4-80ca-4143cc70224b',\n",
" 'time': 1603138868.7752395,\n",
" 'uid': '4fe96535-5305-4e63-ba4b-6435d8270bec'})}"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run.metadata # contains error message"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Optionally add timestamps, configuration\n",
"\n",
"These fit naturally into the context of data *acquistion* but less so in the context of storing data analysis results, so they are optional."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='9d2aae15-08f9-4896-937c-f5b33fb6be12'\n",
" exit_status='success'\n",
" 2020-10-19 16:21:10.768 -- 2020-10-19 16:21:10.770\n",
" Streams:\n",
" * primary\n"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with RunBuilder() as builder:\n",
" builder.add_stream(\n",
" \"primary\",\n",
" data_keys={\n",
" \"x\": {\"source\": \"made up\", \"dtype\": \"number\", \"shape\": []},\n",
" \"y\": {\"source\": \"made up\", \"dtype\": \"number\", \"shape\": []}\n",
" },\n",
" object_keys={'stage': ['x', 'y']}, # The 'x' and 'y' fields above are associated with one device, a 'stage'.\n",
" configuration={\n",
" 'stage': { # The 'stage' has some additional readings which help interpret 'x' and 'y'.\n",
" 'data_keys': {\n",
" 'tilt': {'source': 'made up', 'dtype': 'number', 'shape': []},\n",
" },\n",
" 'data': {\n",
" 'tilt': 5.0 \n",
" },\n",
" 'timestamps': {\n",
" 'tilt': 0.0\n",
" }\n",
" }\n",
" }\n",
" )\n",
" builder.add_data(\n",
" \"primary\",\n",
" data={'x': [1, 2, 3], 'y': [10, 20, 30]},\n",
" timestamps={'x': [1, 2, 3], 'y': [10, 20, 30]},\n",
" )\n",
"builder.get_run()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For very simple runs with:\n",
"* one stream (i.e. a spreadsheet)\n",
"* perhaps some \"Run Start\" metadata but no configuration or timestamps\n",
"* no need to add data incrementally\n",
"\n",
"there is a convenience function that is even simpler to use than `RunBuilder`."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BlueskyRun\n",
" uid='e348b2dd-2e1f-476a-a9f9-cadc72b16b45'\n",
" exit_status='success'\n",
" 2020-10-19 16:21:11.518 -- 2020-10-19 16:21:11.524\n",
" Streams:\n",
" * primary\n"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from bluesky_live.run_builder import build_simple_run\n",
"\n",
"build_simple_run({'x': [1, 2, 3], 'y': [4, 5, 6]}, metadata={'sample': 'Cu'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## BlueskyRun is observable\n",
"\n",
"Downstream code can subscribe to updates. Here I illustrate with prints, in lieu of a more exciting example like visualization."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"builder = RunBuilder()\n",
"run = builder.get_run()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<function __main__.<lambda>(event)>"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run.events.completed.connect(lambda event: print(\"update: done\"))\n",
"run.events.new_stream.connect(lambda event: print(f\"update: new stream named {event.name}\"))\n",
"run.events.new_data.connect(lambda event: print(\"update: new data\")) # not sure yet what this should contain..."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"update: new stream named primary\n"
]
}
],
"source": [
"builder.add_stream(\n",
" \"primary\",\n",
" data_keys={\n",
" \"x\": {\"source\": \"made up\", \"dtype\": \"number\", \"shape\": []},\n",
" \"y\": {\"source\": \"made up\", \"dtype\": \"number\", \"shape\": []}\n",
" }\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"update: new data\n"
]
}
],
"source": [
"builder.add_data(\"primary\", {'x': [1, 2, 3], 'y': [10, 20, 30]})"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"update: done\n"
]
}
],
"source": [
"builder.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## BlueskyRun from a stream of documents (e.g. Kafka, 0MQ, or a RunEngine in process)\n",
"\n",
"### Basic example: accmumlate BlueskyRuns in a `list`\n",
"\n",
"Suppose bluesky is streaming documents and you want to build a `BlueskyRun` around it that incrementally updates as new documents arrive. For this, you can use a `DocumentCache`. This is what `RunBuilder` uses under the hood."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"from bluesky_live.bluesky_run import DocumentCache, BlueskyRun\n",
"from event_model import RunRouter\n",
"\n",
"runs = []\n",
"\n",
"def factory(name, doc):\n",
" dc = DocumentCache()\n",
"\n",
" def add_run_to_list(event):\n",
" run = BlueskyRun(dc)\n",
" runs.append(run)\n",
"\n",
" dc.events.started.connect(add_run_to_list)\n",
" return [dc], []\n",
"\n",
"rr = RunRouter([factory])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can demonstrate this by subscribing it to RunEngine. It could equally well be subscribed to a messages bus consumer."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from bluesky import RunEngine\n",
"\n",
"RE = RunEngine()\n",
"RE.subscribe(rr)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('ff883e0c-add4-4789-8a47-b978d146e2eb',)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from ophyd.sim import det, motor\n",
"from bluesky.plans import count, scan\n",
"\n",
"RE(count([det]))"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[BlueskyRun\n",
" uid='ff883e0c-add4-4789-8a47-b978d146e2eb'\n",
" exit_status='success'\n",
" 2020-10-19 16:21:15.479 -- 2020-10-19 16:21:15.539\n",
" Streams:\n",
" * primary\n",
"]"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"runs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Now with an observable list"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"from bluesky_live.bluesky_run import DocumentCache, BlueskyRun\n",
"from bluesky_live.list import ListModel\n",
"from event_model import RunRouter\n",
"\n",
"runs = ListModel()\n",
"\n",
"def factory(name, doc):\n",
" dc = DocumentCache()\n",
"\n",
" def add_run_to_list(event):\n",
" run = BlueskyRun(dc)\n",
" runs.append(run)\n",
"\n",
" dc.events.started.connect(add_run_to_list)\n",
" return [dc], []\n",
"\n",
"rr.factories.clear()\n",
"rr.factories.append(factory)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('1a2b25e8-4bfb-4426-a1f2-507f674e916d',)"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"RE(count([det]))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ListModel([<BlueskyRun uid='1a2b25e8-4bfb-4426-a1f2-507f674e916d'>])"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"runs"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<function __main__.observe_run(event)>"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def observe_run(event):\n",
" run = event.item\n",
" run.events.completed.connect(lambda event: print(\"update: done\"))\n",
" run.events.new_stream.connect(lambda event: print(f\"update: new stream named {event.name}\"))\n",
" run.events.new_data.connect(lambda event: print(\"update: new data\")) # not sure yet what this should contain...\n",
" \n",
"runs.events.added.connect(observe_run)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"update: new stream named primary\n",
"update: new data\n",
"update: done\n"
]
},
{
"data": {
"text/plain": [
"('6f32a5e4-e09a-4479-9093-8b4a29538d75',)"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"RE(count([det]))"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
" --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
" --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
" --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
" --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
" --xr-background-color: var(--jp-layout-color0, white);\n",
" --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
" --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
"}\n",
"\n",
"html[theme=dark],\n",
"body.vscode-dark {\n",
" --xr-font-color0: rgba(255, 255, 255, 1);\n",
" --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
" --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
" --xr-border-color: #1F1F1F;\n",
" --xr-disabled-color: #515151;\n",
" --xr-background-color: #111111;\n",
" --xr-background-color-row-even: #111111;\n",
" --xr-background-color-row-odd: #313131;\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: '►';\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: '▼';\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: '(';\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: ')';\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: ',';\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" display: none;\n",
" background-color: var(--xr-background-color) !important;\n",
" padding-bottom: 5px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt, dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2 {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt;\n",
"Dimensions: (time: 1)\n",
"Coordinates:\n",
" * time (time) float64 1.603e+09\n",
"Data variables:\n",
" det (time) float64 1.0\n",
" seq_num (time) int64 1\n",
" uid (time) &lt;U36 &#x27;a90f0f01-b3df-40cc-a5df-dc6c309bb380&#x27;</pre><div class='xr-wrap' hidden><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-66a23cf8-27bb-447c-a1fa-aac39f52c8ae' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-66a23cf8-27bb-447c-a1fa-aac39f52c8ae' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>time</span>: 1</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-2c75091e-0569-416c-8da4-4661a9de2d24' class='xr-section-summary-in' type='checkbox' checked><label for='section-2c75091e-0569-416c-8da4-4661a9de2d24' class='xr-section-summary' >Coordinates: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>1.603e+09</div><input id='attrs-da1db303-9c5f-4493-a8a6-0fe94d8b67d2' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-da1db303-9c5f-4493-a8a6-0fe94d8b67d2' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-05d3f355-1e38-4acb-bfc3-175b2460b591' class='xr-var-data-in' type='checkbox'><label for='data-05d3f355-1e38-4acb-bfc3-175b2460b591' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([1.603139e+09])</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-a1e966e5-c888-4a5b-9e3c-9c3d46d31f1d' class='xr-section-summary-in' type='checkbox' checked><label for='section-a1e966e5-c888-4a5b-9e3c-9c3d46d31f1d' class='xr-section-summary' >Data variables: <span>(3)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>det</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>1.0</div><input id='attrs-2ed25936-7775-4637-a496-1f5fcda991d9' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-2ed25936-7775-4637-a496-1f5fcda991d9' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-2cb3e5f4-c0e3-4439-85d0-86ceef4e60ad' class='xr-var-data-in' type='checkbox'><label for='data-2cb3e5f4-c0e3-4439-85d0-86ceef4e60ad' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>object :</span></dt><dd>det</dd></dl></div><div class='xr-var-data'><pre>array([1.])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>seq_num</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>1</div><input id='attrs-9318414f-b2d7-43aa-a7cd-3b40bb111c0c' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-9318414f-b2d7-43aa-a7cd-3b40bb111c0c' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-437f2c1c-89f0-4680-8e17-fab3ca8bd09b' class='xr-var-data-in' type='checkbox'><label for='data-437f2c1c-89f0-4680-8e17-fab3ca8bd09b' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([1])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>uid</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>&lt;U36</div><div class='xr-var-preview xr-preview'>&#x27;a90f0f01-b3df-40cc-a5df-dc6c309...</div><input id='attrs-85d56798-1219-4a1a-9c79-c66a8d53a5d4' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-85d56798-1219-4a1a-9c79-c66a8d53a5d4' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-23c0056e-3e9e-4511-a860-d34f654f7105' class='xr-var-data-in' type='checkbox'><label for='data-23c0056e-3e9e-4511-a860-d34f654f7105' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([&#x27;a90f0f01-b3df-40cc-a5df-dc6c309bb380&#x27;], dtype=&#x27;&lt;U36&#x27;)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-f4915ea7-3cdb-4897-91d0-6ada306e77a8' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-f4915ea7-3cdb-4897-91d0-6ada306e77a8' class='xr-section-summary' title='Expand/collapse section'>Attributes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'></dl></div></li></ul></div></div>"
],
"text/plain": [
"<xarray.Dataset>\n",
"Dimensions: (time: 1)\n",
"Coordinates:\n",
" * time (time) float64 1.603e+09\n",
"Data variables:\n",
" det (time) float64 1.0\n",
" seq_num (time) int64 1\n",
" uid (time) <U36 'a90f0f01-b3df-40cc-a5df-dc6c309bb380'"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"runs[0].primary.read()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment