From f860de610fec865572bfc5e01a22dbd9fa29cb21 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Mon, 26 Aug 2024 15:24:57 -0700 Subject: [PATCH 01/17] WIP --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 231b75b..cc53e85 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,11 @@ # ts_logging_and_reporting Project-wide Logging and Reporting + +## Development + +This repository uses Pre-commit to keep notebooks formatted and clean. Install Pre-commit by running: + +```bash +pip install pre-commit +pre-commit install +``` From f3e1d454e35ec57f418d81868c71fed098e451f9 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Mon, 26 Aug 2024 15:33:52 -0700 Subject: [PATCH 02/17] WIP --- .pre-commit-config.yaml | 14 + notebooks_tsqr/README.md | 5 + notebooks_tsqr/logrep_proto_1.ipynb | 987 ++++++++++++++++++++++++++++ notebooks_tsqr/logrep_proto_1.yaml | 16 + notebooks_tsqr/requirements.txt | 6 + notebooks_tsqr/scaffolding.org | 71 ++ requirements.txt | 7 + times-square.yaml | 4 + 8 files changed, 1110 insertions(+) create mode 100644 .pre-commit-config.yaml create mode 100644 notebooks_tsqr/README.md create mode 100644 notebooks_tsqr/logrep_proto_1.ipynb create mode 100644 notebooks_tsqr/logrep_proto_1.yaml create mode 100644 notebooks_tsqr/requirements.txt create mode 100644 notebooks_tsqr/scaffolding.org create mode 100644 requirements.txt create mode 100644 times-square.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..d302149 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,14 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-toml + - id: check-yaml + - id: trailing-whitespace + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.5.5 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format diff --git a/notebooks_tsqr/README.md b/notebooks_tsqr/README.md new file mode 100644 index 0000000..3efda5a --- /dev/null +++ b/notebooks_tsqr/README.md @@ -0,0 +1,5 @@ +Times Square notebooks for (potential) use in project-wide Logging & Reporting + +See [offical +documentation](https://rsp.lsst.io/v/usdfdev/guides/times-square/index.html) +on creating notebooks for use by Times Square. diff --git a/notebooks_tsqr/logrep_proto_1.ipynb b/notebooks_tsqr/logrep_proto_1.ipynb new file mode 100644 index 0000000..563c013 --- /dev/null +++ b/notebooks_tsqr/logrep_proto_1.ipynb @@ -0,0 +1,987 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "e5b65509-9611-4493-8916-77a4c37489f0", + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters. Set defaults here.\n", + "# Times Square replaces this cell with the user's parameters.\n", + "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", + "log_name = 'narrativelog'\n", + "record_limit = '999'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c2017a15-e054-4a4e-a522-28deff6d2a7a", + "metadata": {}, + "outputs": [], + "source": [ + "# Only use packages available in the Rubin Science Platform\n", + "import requests\n", + "from collections import defaultdict\n", + "import pandas as pd\n", + "from pprint import pp\n", + "from urllib.parse import urlencode\n", + "from IPython.display import FileLink\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2a310c90-7c5a-4cc2-a3b2-cc9d8291d245", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://usdf-rsp-dev.slac.stanford.edu'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log = log_name\n", + "limit = int(record_limit)\n", + "response_timeout = 3.05 # seconds, how long to wait for connection\n", + "read_timeout = 20 # seconds\n", + "\n", + "timeout = (float(response_timeout), float(read_timeout))\n", + "\n", + "# Env list comes from drop-down menu top of:\n", + "# https://rsp.lsst.io/v/usdfdev/guides/times-square/\n", + "envs = dict(\n", + " #rubin_usdf_dev = '',\n", + " #data_lsst_cloud = '',\n", + " #usdf = '',\n", + " #base_data_facility = '',\n", + " summit = 'https://summit-lsp.lsst.codes',\n", + " usdf_dev = 'https://usdf-rsp-dev.slac.stanford.edu',\n", + " #rubin_idf_int = '',\n", + " tucson = 'https://tucson-teststand.lsst.codes',\n", + ")\n", + "server = envs[env]\n", + "server" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "59b7f58f-7a39-42dc-a57d-cc890f5d3375", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/narrativelog/messages?is_human=either&is_valid=either&limit=999'\n", + "numr=999 numf=24\n" + ] + } + ], + "source": [ + "recs = None\n", + "ok = True\n", + "\n", + "# is_human=either&is_valid=either&offset=0&limit=50' \n", + "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", + "# tags=love&exclude_tags=ignore_message\n", + "qparams = dict(is_human='either',\n", + " is_valid='either',\n", + " limit=limit,\n", + " )\n", + "qstr = urlencode(qparams)\n", + "url = f'{server}/{log}/messages?{qstr}'\n", + "print(f'\\nAttempt to get logs from {url=}')\n", + "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", + " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", + " 'date_invalidated', 'date_begin', 'date_end',\n", + " 'time_lost', # float\n", + " #'systems','subsystems','cscs', # values are lists, special handling\n", + " ])\n", + "try:\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " facflds = flds - ignore_fields\n", + " # facets(field) = set(value-1, value-2, ...)\n", + " facets = {fld: set([str(r[fld])\n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + "except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + "numf = len(flds) if ok else 0\n", + "numr = len(recs) if ok else 0\n", + "print(f'{numr=} {numf=}')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d7fedb0b-02fc-4843-8607-cf593ea3fb91", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'category',\n", + " 'components',\n", + " 'cscs',\n", + " 'date_added',\n", + " 'date_begin',\n", + " 'date_end',\n", + " 'date_invalidated',\n", + " 'id',\n", + " 'is_human',\n", + " 'is_valid',\n", + " 'level',\n", + " 'message_text',\n", + " 'parent_id',\n", + " 'primary_hardware_components',\n", + " 'primary_software_components',\n", + " 'site_id',\n", + " 'subsystems',\n", + " 'systems',\n", + " 'tags',\n", + " 'time_lost',\n", + " 'time_lost_type',\n", + " 'urls',\n", + " 'user_agent',\n", + " 'user_id'}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "flds" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d0432b3b-4270-4702-b79d-ed7a4a2800e3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'level': {'0', '100'},\n", + " 'category': {'None', 'SCIENCE'},\n", + " 'subsystems': {'None'},\n", + " 'user_agent': {'LOVE'},\n", + " 'primary_software_components': {'None'},\n", + " 'is_valid': {'False', 'True'},\n", + " 'is_human': {'True'},\n", + " 'systems': {'None'},\n", + " 'primary_hardware_components': {'None'},\n", + " 'cscs': {'None'},\n", + " 'components': {'None'},\n", + " 'site_id': {'summit'},\n", + " 'time_lost_type': {'None', 'fault'}}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "facets" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0720e2cc-d68c-4830-92c1-74ae5180f057", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'id': '0005d0e0-6de7-4857-b658-cfca7147374a',\n", + " 'site_id': 'summit',\n", + " 'message_text': 'The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r\\nwe try the parameter with uppercase now\\r\\n\\r\\n\\r\\n open: False\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nError in run\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 500, in wait_for\\r\\n return fut.result()\\r\\n ^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 239, in _get_next_ackcmd\\r\\n await self._next_ack_event.wait()\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", line 213, in wait\\r\\n await fut\\r\\nasyncio.exceptions.CancelledError\\r\\n\\r\\n\\r\\nThe above exception was the direct cause of the following exception:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 189, in next_ackcmd\\r\\n ackcmd = await self._wait_task\\r\\n ^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 214, in _basic_next_ackcmd\\r\\n ackcmd = await asyncio.wait_for(\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 502, in wait_for\\r\\n raise exceptions.TimeoutError() from exc\\r\\nTimeoutError\\r\\n\\r\\n\\r\\nDuring handling of the above exception, another exception occurred:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", line 603, in do_run\\r\\n await self._run_task\\r\\n File \"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", line 170, in run\\r\\n await getattr(self.remote, f\"cmd_{self.cmd}\").start(\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\\r\\n return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 205, in next_ackcmd\\r\\n raise base.AckTimeoutError(\\r\\nlsst.ts.salobj.base.AckTimeoutError: msg=\\'Timed out waiting for command acknowledgement\\', ackcmd=(ackcmd private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: -301>, error=0, result=\\'No command acknowledgement seen\\')\\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-03-20T04:15:26.769000',\n", + " 'user_id': 'cmorales@summit-lsp.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-03-20T04:16:06.976595',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-03-20T04:15:26.769000',\n", + " 'components': ['AuxTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "recs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "343f9f9c-ffc2-4b06-b18c-3086fe17885f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
date_addedtime_lost
02024-03-20T04:16:06.9765950.0
12024-04-24T20:54:19.3466460.0
22024-06-19T01:59:58.7013430.0
32024-08-21T04:22:26.2326530.0
42023-11-21T19:55:36.7871050.0
.........
9942023-11-16T02:57:08.8861320.0
9952024-04-19T23:27:40.2327910.0
9962024-01-05T20:16:07.1721730.0
9972024-07-15T19:40:15.7077530.0
9982024-02-21T16:11:05.7723510.0
\n", + "

999 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " date_added time_lost\n", + "0 2024-03-20T04:16:06.976595 0.0\n", + "1 2024-04-24T20:54:19.346646 0.0\n", + "2 2024-06-19T01:59:58.701343 0.0\n", + "3 2024-08-21T04:22:26.232653 0.0\n", + "4 2023-11-21T19:55:36.787105 0.0\n", + ".. ... ...\n", + "994 2023-11-16T02:57:08.886132 0.0\n", + "995 2024-04-19T23:27:40.232791 0.0\n", + "996 2024-01-05T20:16:07.172173 0.0\n", + "997 2024-07-15T19:40:15.707753 0.0\n", + "998 2024-02-21T16:11:05.772351 0.0\n", + "\n", + "[999 rows x 2 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cols = ['date_added', 'time_lost']\n", + "df = pd.DataFrame(recs)[cols]\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "72f1a445-c5b9-4efa-a5fc-77e1c4cee84e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "tl.csv
" + ], + "text/plain": [ + "/home/pothiers/sandbox/ts_notebooks/logging/tl.csv" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Allow download of CSV version of DataFrame\n", + "csvfile = 'tl.csv'\n", + "df.to_csv(csvfile)\n", + "myfile = FileLink(csvfile)\n", + "display(myfile)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a74d281f-952d-42d3-bf35-949a17000b49", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqYAAAGdCAYAAADALrFsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAeVklEQVR4nO3df3DdZb3g8U9K27SFJlBpG0qDFnHR+gPcihjwR3E6FIZ15coyOq5KlQHXbd0LdXToiDCg2FmGQdRbKd6FVkdYXPeuoFy2UisWdymgdbsI0l6rSGtr0vKjSVtofjRn/3B7khNSmtPk5Hlyzus1c2ZyTs735IG0ybvP833Ot65QKBQCAAASG5d6AAAAECFMAQDIhDAFACALwhQAgCwIUwAAsiBMAQDIgjAFACALwhQAgCyMTz2AWtHb2xs7d+6MqVOnRl1dXerhAABDUCgUYu/evTFr1qwYN858XqUJ01Gyc+fOaG5uTj0MAOAobN++PWbPnp16GFVPmI6SqVOnRsTf/mA3NDQkHg0AMBQdHR3R3Nxc/D1OZQnTUXJo+b6hoUGYAsAY4zS80eFkCQAAsiBMAQDIgjAFACALwhQAgCwIUwAAsiBMAQDIgjAFACALwhQAgCwIUwAAsiBMAQDIgjAFACALwhQAgCwIU6rGge6D8Y+P/Cm27tp7VMc//qcX4pdbdo3wqBgpu/YeiHuf2BYvd/WkHgoAFSJMqRrf+eUf46YHn4kFtz5S9rGFQiE++t3HYtGqX8fz+zorMDqG66N3PBbX/I/fxVcfeCb1UACoEGFK1fg/21466mMLhb6PX9zfNQKjYaQ9+/z+iIj4+TNtiUcCQKUIUwAAsiBMISIKR34KAFBhwhTib+eYAgBpCVMAALIgTCEs5QNADoQpROmufAAgDWEKAEAWhClERMFiPgAkJ0whLOUDQA6EKQAAWRCmAABkQZhCWMoHgBwIUwAAsiBMIezKB4AcCFMIS/kAkANhCuGSpACQA2EKAEAWhClERMFaPgAkJ0whLOUDQA6EKQAAWRCmEHblA0AOhClEWMsHgAwI04hYvnx5nHXWWTF16tSYMWNGXHzxxbFly5aS5xw4cCAWL14cr3vd6+K4446LSy65JNra2hKNGACg+gjTiFi/fn0sXrw4HnvssVi7dm10d3fH+eefH/v37y8+5+qrr46f/vSn8aMf/SjWr18fO3fujI985CMJR81IcuUnAEhvfOoB5GDNmjUl91evXh0zZsyIjRs3xvvf//5ob2+PO++8M+6555744Ac/GBERq1atire85S3x2GOPxXve854Uw2YEOccUANIzYzqI9vb2iIiYNm1aRERs3Lgxuru7Y8GCBcXnvPnNb45TTjklNmzYkGSMAADVxozpAL29vXHVVVfFueeeG29729siIqK1tTUmTpwYxx9/fMlzZ86cGa2trYO+TmdnZ3R2dhbvd3R0VGzMDJ8JUwBIz4zpAIsXL46nnnoq7r333mG9zvLly6OxsbF4a25uHqERUgmu/AQA6QnTfpYsWRIPPPBAPPzwwzF79uzi401NTdHV1RV79uwpeX5bW1s0NTUN+lrLli2L9vb24m379u2VHDoAwJgnTONvs2VLliyJH//4x/GLX/wi5syZU/L5efPmxYQJE2LdunXFx7Zs2RLbtm2LlpaWQV+zvr4+GhoaSm7ky3wpAKTnHNP42/L9PffcE/fff39MnTq1eN5oY2NjTJ48ORobG+Pyyy+PpUuXxrRp06KhoSE+//nPR0tLix35VaL/Sr5VfQBIQ5hGxO233x4REfPnzy95fNWqVbFo0aKIiPjGN74R48aNi0suuSQ6Oztj4cKF8Z3vfGeUR0qleB9TAEhPmMbQNr5MmjQpVqxYEStWrBiFEZGSSAWANJxjChElJ5laygeANIQphM1PAJADYQoDmDEFgDSEKcSAXfnmTwEgCWEKIUYBIAfCFAawlA8AaQhTCDEKADkQphB25QNADoQpDGD2FADSEKYQpVf/shEKANIQphAD3i5KlwJAEsIUAIAsCFMYwIQpAKQhTCEGLuVLUwBIQZhC2PAEADkQpjCARAWANIQphF35AJADYQphlhQAciBM4VVkKgCkIEwhBlz5SZcCQBLCFMIcKQDkQJjCACIVANIQphB25QNADoQpRIR5UgBIT5jCAC5JCgBpCFOIAUv56YYBADVNmEKIUQDIgTCFsPkJAHIgTGGAgvlTAEhCmEIMiFFdCgBJCFMIy/cAkANhCgNoVABIQ5hC2PwEADkQphA2PAFADoQpDCBSASANYQphKR8AciBMAQDIgjCFAUyYAkAawhRi4FK+NAWAFIQphA1PAJADYQoDSFQASEOYQgzYia9MASAJYQqhRQEgB8IUonTDk/NNASANYQoD2JQP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whQAgCwIU8hEnbV8AGqcMIVMyFIAap0wBQAgC8IUMmElH4BaJ0whE84xBaDWCVMAALIgTAEAyIIwBQAgC8IUAIAs1HyY/vnPf47LL7885syZE5MnT443vvGNcf3110dXV1fJ85588sl43/veF5MmTYrm5ua4+eabE40YAKA6jU89gNQ2b94cvb29cccdd8Rpp50WTz31VFxxxRWxf//+uOWWWyIioqOjI84///xYsGBBrFy5Mn73u9/FZz7zmTj++OPjyiuvTPxfAABQHWo+TC+44IK44IILivdPPfXU2LJlS9x+++3FML377rujq6sr7rrrrpg4cWK89a1vjU2bNsWtt94qTAEARkjNL+UPpr29PaZNm1a8v2HDhnj/+98fEydOLD62cOHC2LJlS7z00kuDvkZnZ2d0dHSU3AAAODxhOsDWrVvj29/+dnz2s58tPtba2hozZ84sed6h+62trYO+zvLly6OxsbF4a25urtygAQCqQNWG6TXXXBN1dXWvedu8eXPJMTt27IgLLrggLr300rjiiiuG9fWXLVsW7e3txdv27duH9XoAANWuas8x/cIXvhCLFi16zeeceuqpxY937twZ5513Xpxzzjnx3e9+t+R5TU1N0dbWVvLYoftNTU2DvnZ9fX3U19cfxcgBAGpT1Ybp9OnTY/r06UN67o4dO+K8886LefPmxapVq2LcuNKJ5JaWlvjyl78c3d3dMWHChIiIWLt2bZx++ulxwgknjPjYAQBqUdUu5Q/Vjh07Yv78+XHKKafELbfcErt3747W1taSc0c//vGPx8SJE+Pyyy+Pp59+On74wx/GN7/5zVi6dGnCkQMAVJeqnTEdqrVr18bWrVtj69atMXv27JLPFQqFiIhobGyMhx56KBYvXhzz5s2LE088Ma677jpvFQUAMIJqPkwXLVp0xHNRIyLe8Y53xK9+9avKDwgAoEbV/FI+AAB5EKYAAGRBmAIAkAVhCgBAFoQpAABZEKYAAGRBmAIAkAVhCgBAFoQpAABZEKYAAGRBmAIAkAVhCgBAFoQpAABZEKYAAGRBmAIAkAVhCgBAFoQpAABZEKYAAGRBmAIAkAVhCgBAFoQpAABZEKaQ0JwTj009BADIxvjUA4Ba9s5TTohvfuzMOGXalNRDAYDkhCkk9uEzT049BADIgqV8AACyIEwBAMiCMAUAIAvCFACALAhTAACyIEwBAMiCMAUAIAvCFACALAhTAACyIEwBAMiCMAUAIAvCFACALAhTAACyMD71AGpFoVCIiIiOjo7EIwEAhurQ7+1Dv8epLGE6Svbu3RsREc3NzYlHAgCUa+/evdHY2Jh6GFWvruCfAKOit7c3du7cGVOnTo26uroRfe0dO3bE3LlzR/Q1AWAs2r59ezQ0NIzY6xUKhdi7d2/MmjUrxo1zBmSlmTEdJePGjYvZs2dX5LWdHgAAf9PQ0DCiYRoRZkpHkfQHACALwhQAgCxYyq8CDQ0Nce6550ZPT0/xXNZD58IMvB8RQ3rsaI8bydcaK8flMIaxclwOYxgrx+UwhrFyXA5jGCvH5TCGSh03fvz4+MAHPhD19fXB2GXzEwAAWbCUDwBAFoQpAABZEKYAAGRBmAIAkIWyduUvX748brjhhujs7KzUeAAAqAIXXHBB3HnnnTFr1qwhH1PWjOn69eujp6cnjjnmmLIHBwBA7fj5z38el1xySVnHDOvtonbv3h0zZsw42sMBAKhidXV10dnZGRMmTBjS84f1Bvvt7e3DORwAgCo1YcKEOOuss4YcpRHD2PzU29sbn//854/2cAAAqthpp50WP/nJT8o65qjDdPHixfGzn/3saA8HAKCKPffcc/GJT3wiyjlr9KjCdMmSJXHHHXeU9YUAAKgdBw8ejDVr1sRjjz025GPKCtNCoRCf+9znYsWKFaIUAIBXOXRO6aFWLOdtRssK08WLF8fKlSvLOQQAgBrS3d0dERE9PT1x0kknxemnnz7kY8t6u6i6urryRwcAQM1atWpVLFq0aEjPLevtoizfAwBQKUe9Kx8AAEaSMAUAIAvCFACALAhTAACyIEwBAMiCMAUAIAvCFACALAhTAACyIEwBAMiCMAUAIAvCFACALAhTAACy8P8AoPdysIIaqGcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = [r['date_added'] for r in recs]\n", + "y = [r['time_lost'] for r in recs]\n", + "plt.plot(x, y) \n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "138e5496-e058-417a-881e-8450e20af0f9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "0cb5feca-620b-49a0-b25b-835a6d38843a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'id': '0005d0e0-6de7-4857-b658-cfca7147374a',\n", + " 'site_id': 'summit',\n", + " 'message_text': 'The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r\\nwe try the parameter with uppercase now\\r\\n\\r\\n\\r\\n open: False\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nError in run\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 500, in wait_for\\r\\n return fut.result()\\r\\n ^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 239, in _get_next_ackcmd\\r\\n await self._next_ack_event.wait()\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", line 213, in wait\\r\\n await fut\\r\\nasyncio.exceptions.CancelledError\\r\\n\\r\\n\\r\\nThe above exception was the direct cause of the following exception:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 189, in next_ackcmd\\r\\n ackcmd = await self._wait_task\\r\\n ^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 214, in _basic_next_ackcmd\\r\\n ackcmd = await asyncio.wait_for(\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 502, in wait_for\\r\\n raise exceptions.TimeoutError() from exc\\r\\nTimeoutError\\r\\n\\r\\n\\r\\nDuring handling of the above exception, another exception occurred:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", line 603, in do_run\\r\\n await self._run_task\\r\\n File \"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", line 170, in run\\r\\n await getattr(self.remote, f\"cmd_{self.cmd}\").start(\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\\r\\n return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 205, in next_ackcmd\\r\\n raise base.AckTimeoutError(\\r\\nlsst.ts.salobj.base.AckTimeoutError: msg=\\'Timed out waiting for command acknowledgement\\', ackcmd=(ackcmd private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: -301>, error=0, result=\\'No command acknowledgement seen\\')\\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-03-20T04:15:26.769000',\n", + " 'user_id': 'cmorales@summit-lsp.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-03-20T04:16:06.976595',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-03-20T04:15:26.769000',\n", + " 'components': ['AuxTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'},\n", + " {'id': '00067b6a-1741-41f3-87af-57261dff30ac',\n", + " 'site_id': 'summit',\n", + " 'message_text': 'David updated environment. But no need to cycle Scheduler 1. Waiting for completion of the current block. \\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-04-24T20:53:41.843000',\n", + " 'user_id': 'ykang@summit-lsp.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-04-24T20:54:19.346646',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-04-24T20:53:41.843000',\n", + " 'components': ['MainTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'},\n", + " {'id': '000a3ba8-b1a9-4b04-9c4a-263da3dac1d1',\n", + " 'site_id': 'summit',\n", + " 'message_text': 'Runing BLOCK-T22 AuxTel filter Scans, the auxtel/calibrations/run_calibration_sequence.py went to fault.\\r\\n\\r\\n\\r\\nsalIndex: 200068\\r\\nFile \"/net/obs-env/auto_base_packages/ts_observatory_control/python/lsst/ts/observatory/control/auxtel/atcalsys.py\", line 338, in _take_data\\r\\n await asyncio.gather(\\r\\n File \"/net/obs-env/auto_base_packages/ts_observatory_control/python/lsst/ts/observatory/control/auxtel/atcalsys.py\", line 430, in take_fiber_spectrum\\r\\n await self.fiberspectrograph.cmd_expose.set_start(\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 416, in set_start\\r\\n return await self.start(timeout=timeout, wait_done=wait_done)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\\r\\n return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 191, in next_ackcmd\\r\\n raise base.AckError(msg=\"Command failed\", ackcmd=ackcmd)\\r\\nlsst.ts.salobj.base.AckError: msg=\\'Command failed\\', ackcmd=(ackcmd private_seqNum=1157551610, ack=<SalRetCode.CMD_FAILED: -302>, error=1, result=\"Failed: 502, message=\\'Bad Gateway\\', url=URL(\\'http://comcam-mcm-dds.cp.lsst.org/ImageUtilities/rest/imageNameService?n=1&sourceIndex=3&source=FiberSpectrograph\\')\")\\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-06-19T01:59:08.706000',\n", + " 'user_id': 'cmd_user@summit-lsp.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': False,\n", + " 'date_added': '2024-06-19T01:59:58.701343',\n", + " 'date_invalidated': '2024-06-19T02:12:01.302498',\n", + " 'parent_id': 'af0157e3-d7f0-4068-9a8a-e51a0a77d260',\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-06-19T01:59:08.706000',\n", + " 'components': ['AuxTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'},\n", + " {'id': '0010e246-8039-4741-b4c6-54047e9464c5',\n", + " 'site_id': 'summit',\n", + " 'message_text': 'Still checking updates in the wavefront estimation pipeline version, offsetting manually the ATHexapod in different axes and deploying different versions of the pipeline.\\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-08-21T04:04:38.053000',\n", + " 'user_id': 'kpena@summit-lsp.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-08-21T04:22:26.232653',\n", + " 'date_invalidated': None,\n", + " 'parent_id': '99de2a12-20eb-45ae-b189-a793b63e6ab5',\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-08-21T04:04:38.053000',\n", + " 'components': ['AuxTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'}]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "recs[:4]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f6441d81-93a8-4369-93fb-55d3715783cc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsite_idmessage_textleveltagsurlstime_lostdate_beginuser_iduser_agent...parent_idsystemssubsystemscscsdate_endcomponentsprimary_software_componentsprimary_hardware_componentscategorytime_lost_type
00005d0e0-6de7-4857-b658-cfca7147374asummitThe moveShutterMainDoor command Fail\\r\\n\\r\\n\\r...0[][]0.02024-03-20T04:15:26.769000cmorales@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-03-20T04:15:26.769000[AuxTel][None][None]Nonefault
100067b6a-1741-41f3-87af-57261dff30acsummitDavid updated environment. But no need to cycl...0[][]0.02024-04-24T20:53:41.843000ykang@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-04-24T20:53:41.843000[MainTel][None][None]Nonefault
2000a3ba8-b1a9-4b04-9c4a-263da3dac1d1summitRuning BLOCK-T22 AuxTel filter Scans, the auxt...0[][]0.02024-06-19T01:59:08.706000cmd_user@summit-lsp.lsst.codesLOVE...af0157e3-d7f0-4068-9a8a-e51a0a77d260NoneNoneNone2024-06-19T01:59:08.706000[AuxTel][None][None]Nonefault
30010e246-8039-4741-b4c6-54047e9464c5summitStill checking updates in the wavefront estima...0[][]0.02024-08-21T04:04:38.053000kpena@summit-lsp.lsst.codesLOVE...99de2a12-20eb-45ae-b189-a793b63e6ab5NoneNoneNone2024-08-21T04:04:38.053000[AuxTel][None][None]Nonefault
40017b90e-26aa-4a7c-8186-fc06ac9b5aa6summitThe m1m3 ump test failed for actuator 108. \\r\\...0[][]0.02023-11-21T19:51:54.868000bquint@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2023-11-21T19:51:54.868000[MainTel][None][None]Nonefault
..................................................................
99422325b7d-7948-4da8-88ec-2a47ceb088e0summitBlock 109 starting again\\r\\n0[][]0.02023-11-16T02:56:30.009000echristensen@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2023-11-16T02:56:30.009000[MainTel][None][None]Nonefault
9952233da67-c777-4dd6-bc66-a241f93df5aesummitAz encoder checking thru slew test. \\r\\n\\r\\n\\r...0[][]0.02024-04-19T23:27:02.011000ykang@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-04-19T23:27:02.011000[MainTel][None][None]Nonefault
996223c0310-03d5-450d-bf5c-0a04bdea6536summitRestarting [BLOCK-178|https://jira.lsstcorp.or...0[][]0.02024-01-05T20:15:27.453000kfanning@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2024-01-05T20:15:27.453000[MainTel][None][None]Nonefault
9972240e19e-7204-4c50-a3ba-c643d60aa0d2summitLATISS enabled but checkout failed \\r\\n\\r\\n\\r\\...0[][]0.02024-07-15T19:39:38.630000kkelkar@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-07-15T19:39:38.630000[AuxTel][None][None]Nonefault
99822475aa1-f15a-46f1-87b8-b7a1708daaf4summitPowercycled M2 cabinet to bring back the M2 co...0[][]0.02024-02-21T15:37:00kfanning@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-02-21T16:10:28.176000[MainTel][None][None]Nonefault
\n", + "

999 rows × 24 columns

\n", + "
" + ], + "text/plain": [ + " id site_id \\\n", + "0 0005d0e0-6de7-4857-b658-cfca7147374a summit \n", + "1 00067b6a-1741-41f3-87af-57261dff30ac summit \n", + "2 000a3ba8-b1a9-4b04-9c4a-263da3dac1d1 summit \n", + "3 0010e246-8039-4741-b4c6-54047e9464c5 summit \n", + "4 0017b90e-26aa-4a7c-8186-fc06ac9b5aa6 summit \n", + ".. ... ... \n", + "994 22325b7d-7948-4da8-88ec-2a47ceb088e0 summit \n", + "995 2233da67-c777-4dd6-bc66-a241f93df5ae summit \n", + "996 223c0310-03d5-450d-bf5c-0a04bdea6536 summit \n", + "997 2240e19e-7204-4c50-a3ba-c643d60aa0d2 summit \n", + "998 22475aa1-f15a-46f1-87b8-b7a1708daaf4 summit \n", + "\n", + " message_text level tags urls \\\n", + "0 The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r... 0 [] [] \n", + "1 David updated environment. But no need to cycl... 0 [] [] \n", + "2 Runing BLOCK-T22 AuxTel filter Scans, the auxt... 0 [] [] \n", + "3 Still checking updates in the wavefront estima... 0 [] [] \n", + "4 The m1m3 ump test failed for actuator 108. \\r\\... 0 [] [] \n", + ".. ... ... ... ... \n", + "994 Block 109 starting again\\r\\n 0 [] [] \n", + "995 Az encoder checking thru slew test. \\r\\n\\r\\n\\r... 0 [] [] \n", + "996 Restarting [BLOCK-178|https://jira.lsstcorp.or... 0 [] [] \n", + "997 LATISS enabled but checkout failed \\r\\n\\r\\n\\r\\... 0 [] [] \n", + "998 Powercycled M2 cabinet to bring back the M2 co... 0 [] [] \n", + "\n", + " time_lost date_begin user_id \\\n", + "0 0.0 2024-03-20T04:15:26.769000 cmorales@summit-lsp.lsst.codes \n", + "1 0.0 2024-04-24T20:53:41.843000 ykang@summit-lsp.lsst.codes \n", + "2 0.0 2024-06-19T01:59:08.706000 cmd_user@summit-lsp.lsst.codes \n", + "3 0.0 2024-08-21T04:04:38.053000 kpena@summit-lsp.lsst.codes \n", + "4 0.0 2023-11-21T19:51:54.868000 bquint@love01.cp.lsst.org \n", + ".. ... ... ... \n", + "994 0.0 2023-11-16T02:56:30.009000 echristensen@love01.cp.lsst.org \n", + "995 0.0 2024-04-19T23:27:02.011000 ykang@summit-lsp.lsst.codes \n", + "996 0.0 2024-01-05T20:15:27.453000 kfanning@love01.cp.lsst.org \n", + "997 0.0 2024-07-15T19:39:38.630000 kkelkar@summit-lsp.lsst.codes \n", + "998 0.0 2024-02-21T15:37:00 kfanning@summit-lsp.lsst.codes \n", + "\n", + " user_agent ... parent_id systems subsystems \\\n", + "0 LOVE ... None None None \n", + "1 LOVE ... None None None \n", + "2 LOVE ... af0157e3-d7f0-4068-9a8a-e51a0a77d260 None None \n", + "3 LOVE ... 99de2a12-20eb-45ae-b189-a793b63e6ab5 None None \n", + "4 LOVE ... None None None \n", + ".. ... ... ... ... ... \n", + "994 LOVE ... None None None \n", + "995 LOVE ... None None None \n", + "996 LOVE ... None None None \n", + "997 LOVE ... None None None \n", + "998 LOVE ... None None None \n", + "\n", + " cscs date_end components primary_software_components \\\n", + "0 None 2024-03-20T04:15:26.769000 [AuxTel] [None] \n", + "1 None 2024-04-24T20:53:41.843000 [MainTel] [None] \n", + "2 None 2024-06-19T01:59:08.706000 [AuxTel] [None] \n", + "3 None 2024-08-21T04:04:38.053000 [AuxTel] [None] \n", + "4 None 2023-11-21T19:51:54.868000 [MainTel] [None] \n", + ".. ... ... ... ... \n", + "994 None 2023-11-16T02:56:30.009000 [MainTel] [None] \n", + "995 None 2024-04-19T23:27:02.011000 [MainTel] [None] \n", + "996 None 2024-01-05T20:15:27.453000 [MainTel] [None] \n", + "997 None 2024-07-15T19:39:38.630000 [AuxTel] [None] \n", + "998 None 2024-02-21T16:10:28.176000 [MainTel] [None] \n", + "\n", + " primary_hardware_components category time_lost_type \n", + "0 [None] None fault \n", + "1 [None] None fault \n", + "2 [None] None fault \n", + "3 [None] None fault \n", + "4 [None] None fault \n", + ".. ... ... ... \n", + "994 [None] None fault \n", + "995 [None] None fault \n", + "996 [None] None fault \n", + "997 [None] None fault \n", + "998 [None] None fault \n", + "\n", + "[999 rows x 24 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(recs)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8cefdd9-98ec-4383-a297-6853be7d0c9b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks_tsqr/logrep_proto_1.yaml b/notebooks_tsqr/logrep_proto_1.yaml new file mode 100644 index 0000000..3c1d085 --- /dev/null +++ b/notebooks_tsqr/logrep_proto_1.yaml @@ -0,0 +1,16 @@ +# For use with a Times Square notebook +title: Logging and Reporting +description: Prototype 1 +authors: + - name: Steve Pothier + slack: Steve Pothier +tags: + - reporting + - prototype +parameters: + record_limit: + type: integer + description: Max number of records to output + default: 99 + minimum: 1 + maximum: 9999 diff --git a/notebooks_tsqr/requirements.txt b/notebooks_tsqr/requirements.txt new file mode 100644 index 0000000..5ab865b --- /dev/null +++ b/notebooks_tsqr/requirements.txt @@ -0,0 +1,6 @@ +requests +# jupyter-lab --ip=0.0.0.0 +jupyterlab # =3.1.17 +pandas +matplotlib +#numpy diff --git a/notebooks_tsqr/scaffolding.org b/notebooks_tsqr/scaffolding.org new file mode 100644 index 0000000..6c1c85a --- /dev/null +++ b/notebooks_tsqr/scaffolding.org @@ -0,0 +1,71 @@ +# Scaffolding for Times Square notebooks (thread-1) +* Parameters +- Parameters available to user via Times Square side panel. + +- A schema for these is given in .yaml in same directory. + +- The defaults given here must all be string values. Convert those to + other types in a subsequent cell + +- Include parameters that affect filtering (query) used in Source API + +- Consider common parameters such as: + + record_limit + + num_recs_in_example + + min_date + + max_date + + + +: # Parameters. Set defaults here. +: # Times Square replaces this cell with the user's parameters + + +* Imports and General Setup +- Setup includes conversion of parameter values to usable values +- Get "environment" (server host). e.g. https://usdf-rsp-dev.slac.stanford.edu +- Included non-user parameters: + + timeout + + env + +* Setup Source +- Choose fields of interest. The records (list of dict) in each field + we need in any way. All other fields could be deleted for our + purposes. + +- Choose fields to use for extracting facets. + +- Create full API URL (including query string) from parameters, etc. + +- Choose fields to display to user in table. ~table_fields~ +- Choose fields to display to user in plot. ~(x,y)~ + +* Get Records +- Usually use python "requests" package for accessing API + But, some APIs might have their own client. + +- Use try/except around requests.get() or requests.post() + User friendly error if exception (cannot connect, etc) + User friend error if get non-200 response status. + +- Get list field names from rec[0] + +- Calc facet over selected field names. + +* Table of (mostly raw) results +- Display pandas table of all records using + : df = pd.DataFrame(recs)[table_fields] + +* Plot of results +- Display minimum useful (?!) plot from this Source + Example: + : plt.plot([r['date'] for r in recs], [r['time_lost'] for r in recs]) + : plt.show() + +* Output raw content analysis (rec, fields, facets) +** Example records +** Fields found +** Facets of selected Fields +* Stakeholder Elicitation +- Source specific questions to stakeholders. + Link to Confluence doc (form?) for L&R stakeholder feeback diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c65b6c6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +requests +# jupyter-lab --ip=0.0.0.0 +jupyterlab # =3.1.17 +pandas +#matplotlib +#numpy +pre-commit diff --git a/times-square.yaml b/times-square.yaml new file mode 100644 index 0000000..3e6e1d5 --- /dev/null +++ b/times-square.yaml @@ -0,0 +1,4 @@ +enabled: true +root: notebooks_tsqr +description: > + Times Square for project-wide Logging and Reporting. From 3e2e5f5ef852702493584254784ecf5203224e8d Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Tue, 27 Aug 2024 08:41:34 -0700 Subject: [PATCH 03/17] WIP --- notebooks_tsqr/logrep_proto_1.ipynb | 1133 +++++++++++++++++---------- 1 file changed, 725 insertions(+), 408 deletions(-) diff --git a/notebooks_tsqr/logrep_proto_1.ipynb b/notebooks_tsqr/logrep_proto_1.ipynb index 563c013..d9b2ff2 100644 --- a/notebooks_tsqr/logrep_proto_1.ipynb +++ b/notebooks_tsqr/logrep_proto_1.ipynb @@ -14,11 +14,24 @@ "record_limit = '999'" ] }, + { + "cell_type": "markdown", + "id": "09757010-6091-4769-b940-efd464c5eb68", + "metadata": {}, + "source": [ + "\n", + "## Imports and General Setup" + ] + }, { "cell_type": "code", "execution_count": 2, "id": "c2017a15-e054-4a4e-a522-28deff6d2a7a", - "metadata": {}, + "metadata": { + "jupyter": { + "source_hidden": true + } + }, "outputs": [], "source": [ "# Only use packages available in the Rubin Science Platform\n", @@ -35,12 +48,16 @@ "cell_type": "code", "execution_count": 3, "id": "2a310c90-7c5a-4cc2-a3b2-cc9d8291d245", - "metadata": {}, + "metadata": { + "jupyter": { + "source_hidden": true + } + }, "outputs": [ { "data": { "text/plain": [ - "'https://usdf-rsp-dev.slac.stanford.edu'" + "'https://usdf-rsp-dev.slac.stanford.edu/narrativelog'" ] }, "execution_count": 3, @@ -69,25 +86,31 @@ " tucson = 'https://tucson-teststand.lsst.codes',\n", ")\n", "server = envs[env]\n", - "server" + "service = f'{server}/{log}'\n", + "service" + ] + }, + { + "cell_type": "markdown", + "id": "e926c1a6-cd11-4cc1-9fb5-55a5f4d386c0", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "\n", + "## Setup Source" ] }, { "cell_type": "code", "execution_count": 4, - "id": "59b7f58f-7a39-42dc-a57d-cc890f5d3375", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/narrativelog/messages?is_human=either&is_valid=either&limit=999'\n", - "numr=999 numf=24\n" - ] + "id": "8fdfc281-17db-471a-873e-94e6b41c6f70", + "metadata": { + "jupyter": { + "source_hidden": true } - ], + }, + "outputs": [], "source": [ "recs = None\n", "ok = True\n", @@ -100,15 +123,45 @@ " limit=limit,\n", " )\n", "qstr = urlencode(qparams)\n", - "url = f'{server}/{log}/messages?{qstr}'\n", - "print(f'\\nAttempt to get logs from {url=}')\n", + "url = f'{service}/messages?{qstr}'\n", + "\n", "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", " 'date_invalidated', 'date_begin', 'date_end',\n", " 'time_lost', # float\n", " #'systems','subsystems','cscs', # values are lists, special handling\n", - " ])\n", + " ])" + ] + }, + { + "cell_type": "markdown", + "id": "1695642e-4d47-4ae9-9311-c77a7312ad22", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "\n", + "## Get Records" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8481932e-6b4f-4eeb-98e2-18728c43351e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/narrativelog/messages?is_human=either&is_valid=either&limit=9999'\n", + "Retrieved 7673 records, each with numf=24 fields.\n" + ] + } + ], + "source": [ "try:\n", + " print(f'Attempt to get logs from {url=}')\n", " response = requests.get(url, timeout=timeout)\n", " response.raise_for_status()\n", " recs = response.json()\n", @@ -123,75 +176,183 @@ " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", "numf = len(flds) if ok else 0\n", "numr = len(recs) if ok else 0\n", - "print(f'{numr=} {numf=}')" + "print(f'Retrieved {numr} records, each with {numf=} fields.')" ] }, { - "cell_type": "code", - "execution_count": 5, - "id": "d7fedb0b-02fc-4843-8607-cf593ea3fb91", + "cell_type": "markdown", + "id": "6069eef2-0585-4e67-9527-42ec5dc12cbf", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'category',\n", - " 'components',\n", - " 'cscs',\n", - " 'date_added',\n", - " 'date_begin',\n", - " 'date_end',\n", - " 'date_invalidated',\n", - " 'id',\n", - " 'is_human',\n", - " 'is_valid',\n", - " 'level',\n", - " 'message_text',\n", - " 'parent_id',\n", - " 'primary_hardware_components',\n", - " 'primary_software_components',\n", - " 'site_id',\n", - " 'subsystems',\n", - " 'systems',\n", - " 'tags',\n", - " 'time_lost',\n", - " 'time_lost_type',\n", - " 'urls',\n", - " 'user_agent',\n", - " 'user_id'}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "flds" + "\n", + "## Tables of (mostly raw) results" + ] + }, + { + "cell_type": "markdown", + "id": "97d5d456-e2b4-4dd6-b0c7-2d95870d8481", + "metadata": {}, + "source": [ + "### Fields names provided in records from log." ] }, { "cell_type": "code", "execution_count": 6, - "id": "d0432b3b-4270-4702-b79d-ed7a4a2800e3", + "id": "d7fedb0b-02fc-4843-8607-cf593ea3fb91", "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Field Name
0tags
1primary_software_components
2time_lost
3time_lost_type
4date_invalidated
5id
6site_id
7date_begin
8components
9date_added
10subsystems
11is_human
12user_id
13category
14cscs
15primary_hardware_components
16parent_id
17systems
18date_end
19message_text
20level
21is_valid
22urls
23user_agent
\n", + "
" + ], "text/plain": [ - "{'level': {'0', '100'},\n", - " 'category': {'None', 'SCIENCE'},\n", - " 'subsystems': {'None'},\n", - " 'user_agent': {'LOVE'},\n", - " 'primary_software_components': {'None'},\n", - " 'is_valid': {'False', 'True'},\n", - " 'is_human': {'True'},\n", - " 'systems': {'None'},\n", - " 'primary_hardware_components': {'None'},\n", - " 'cscs': {'None'},\n", - " 'components': {'None'},\n", - " 'site_id': {'summit'},\n", - " 'time_lost_type': {'None', 'fault'}}" + " Field Name\n", + "0 tags\n", + "1 primary_software_components\n", + "2 time_lost\n", + "3 time_lost_type\n", + "4 date_invalidated\n", + "5 id\n", + "6 site_id\n", + "7 date_begin\n", + "8 components\n", + "9 date_added\n", + "10 subsystems\n", + "11 is_human\n", + "12 user_id\n", + "13 category\n", + "14 cscs\n", + "15 primary_hardware_components\n", + "16 parent_id\n", + "17 systems\n", + "18 date_end\n", + "19 message_text\n", + "20 level\n", + "21 is_valid\n", + "22 urls\n", + "23 user_agent" ] }, "execution_count": 6, @@ -200,42 +361,148 @@ } ], "source": [ - "facets" + "pd.DataFrame(flds, columns=['Field Name'])" + ] + }, + { + "cell_type": "markdown", + "id": "51c9a1db-4b38-4f35-bece-c4038ee5b9a5", + "metadata": {}, + "source": [ + "### Facets from log records.\n", + "A *facet* is the set all of values found for a field in the retrieved records. Facets are only calculated for some fields." ] }, { "cell_type": "code", "execution_count": 7, - "id": "0720e2cc-d68c-4830-92c1-74ae5180f057", + "id": "545abf79-808b-4716-b9e2-c5426a86b277", "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
is_humanTrueNoneNone
site_idsummitNoneNone
categorySCIENCENoneENG
primary_software_componentsNoneNoneNone
level1000None
is_validTrueFalseNone
cscsNoneNoneNone
componentsNoneNoneNone
primary_hardware_componentsNoneNoneNone
user_agentLOVEstringNone
subsystemsNoneNoneNone
systemsNoneNoneNone
time_lost_typefaultNoneweather
\n", + "
" + ], "text/plain": [ - "{'id': '0005d0e0-6de7-4857-b658-cfca7147374a',\n", - " 'site_id': 'summit',\n", - " 'message_text': 'The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r\\nwe try the parameter with uppercase now\\r\\n\\r\\n\\r\\n open: False\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nError in run\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 500, in wait_for\\r\\n return fut.result()\\r\\n ^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 239, in _get_next_ackcmd\\r\\n await self._next_ack_event.wait()\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", line 213, in wait\\r\\n await fut\\r\\nasyncio.exceptions.CancelledError\\r\\n\\r\\n\\r\\nThe above exception was the direct cause of the following exception:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 189, in next_ackcmd\\r\\n ackcmd = await self._wait_task\\r\\n ^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 214, in _basic_next_ackcmd\\r\\n ackcmd = await asyncio.wait_for(\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 502, in wait_for\\r\\n raise exceptions.TimeoutError() from exc\\r\\nTimeoutError\\r\\n\\r\\n\\r\\nDuring handling of the above exception, another exception occurred:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", line 603, in do_run\\r\\n await self._run_task\\r\\n File \"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", line 170, in run\\r\\n await getattr(self.remote, f\"cmd_{self.cmd}\").start(\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\\r\\n return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 205, in next_ackcmd\\r\\n raise base.AckTimeoutError(\\r\\nlsst.ts.salobj.base.AckTimeoutError: msg=\\'Timed out waiting for command acknowledgement\\', ackcmd=(ackcmd private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: -301>, error=0, result=\\'No command acknowledgement seen\\')\\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-03-20T04:15:26.769000',\n", - " 'user_id': 'cmorales@summit-lsp.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-03-20T04:16:06.976595',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-03-20T04:15:26.769000',\n", - " 'components': ['AuxTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'}" + " 0 1 2\n", + "is_human True None None\n", + "site_id summit None None\n", + "category SCIENCE None ENG\n", + "primary_software_components None None None\n", + "level 100 0 None\n", + "is_valid True False None\n", + "cscs None None None\n", + "components None None None\n", + "primary_hardware_components None None None\n", + "user_agent LOVE string None\n", + "subsystems None None None\n", + "systems None None None\n", + "time_lost_type fault None weather" ] }, "execution_count": 7, @@ -244,15 +511,43 @@ } ], "source": [ - "recs[0]" + "pd.DataFrame.from_dict(facets, orient='index')" + ] + }, + { + "cell_type": "markdown", + "id": "21afc757-8890-4b96-afc9-e5086327df55", + "metadata": {}, + "source": [ + "### Table of selected log record fields.\n", + "Table can be retrieved as CSV file for local use." ] }, { "cell_type": "code", - "execution_count": 8, - "id": "343f9f9c-ffc2-4b06-b18c-3086fe17885f", + "execution_count": 19, + "id": "1c40de6e-91c3-4d9d-972c-efe15d2b4a17", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Table available as CSV file: \n" + ] + }, + { + "data": { + "text/html": [ + "tl.csv
" + ], + "text/plain": [ + "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { "text/html": [ @@ -310,53 +605,53 @@ " ...\n", " \n", " \n", - " 994\n", - " 2023-11-16T02:57:08.886132\n", + " 7668\n", + " 2024-04-19T19:07:32.755734\n", " 0.0\n", " \n", " \n", - " 995\n", - " 2024-04-19T23:27:40.232791\n", + " 7669\n", + " 2024-03-21T01:04:28.883494\n", " 0.0\n", " \n", " \n", - " 996\n", - " 2024-01-05T20:16:07.172173\n", + " 7670\n", + " 2024-06-12T01:56:12.896718\n", " 0.0\n", " \n", " \n", - " 997\n", - " 2024-07-15T19:40:15.707753\n", + " 7671\n", + " 2024-03-04T03:20:00.151348\n", " 0.0\n", " \n", " \n", - " 998\n", - " 2024-02-21T16:11:05.772351\n", + " 7672\n", + " 2024-01-03T22:42:08.463006\n", " 0.0\n", " \n", " \n", "\n", - "

999 rows × 2 columns

\n", + "

7673 rows × 2 columns

\n", "" ], "text/plain": [ - " date_added time_lost\n", - "0 2024-03-20T04:16:06.976595 0.0\n", - "1 2024-04-24T20:54:19.346646 0.0\n", - "2 2024-06-19T01:59:58.701343 0.0\n", - "3 2024-08-21T04:22:26.232653 0.0\n", - "4 2023-11-21T19:55:36.787105 0.0\n", - ".. ... ...\n", - "994 2023-11-16T02:57:08.886132 0.0\n", - "995 2024-04-19T23:27:40.232791 0.0\n", - "996 2024-01-05T20:16:07.172173 0.0\n", - "997 2024-07-15T19:40:15.707753 0.0\n", - "998 2024-02-21T16:11:05.772351 0.0\n", + " date_added time_lost\n", + "0 2024-03-20T04:16:06.976595 0.0\n", + "1 2024-04-24T20:54:19.346646 0.0\n", + "2 2024-06-19T01:59:58.701343 0.0\n", + "3 2024-08-21T04:22:26.232653 0.0\n", + "4 2023-11-21T19:55:36.787105 0.0\n", + "... ... ...\n", + "7668 2024-04-19T19:07:32.755734 0.0\n", + "7669 2024-03-21T01:04:28.883494 0.0\n", + "7670 2024-06-12T01:56:12.896718 0.0\n", + "7671 2024-03-04T03:20:00.151348 0.0\n", + "7672 2024-01-03T22:42:08.463006 0.0\n", "\n", - "[999 rows x 2 columns]" + "[7673 rows x 2 columns]" ] }, - "execution_count": 8, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -364,187 +659,19 @@ "source": [ "cols = ['date_added', 'time_lost']\n", "df = pd.DataFrame(recs)[cols]\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "72f1a445-c5b9-4efa-a5fc-77e1c4cee84e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "tl.csv
" - ], - "text/plain": [ - "/home/pothiers/sandbox/ts_notebooks/logging/tl.csv" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ + "\n", "# Allow download of CSV version of DataFrame\n", "csvfile = 'tl.csv'\n", "df.to_csv(csvfile)\n", "myfile = FileLink(csvfile)\n", - "display(myfile)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "a74d281f-952d-42d3-bf35-949a17000b49", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqYAAAGdCAYAAADALrFsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAeVklEQVR4nO3df3DdZb3g8U9K27SFJlBpG0qDFnHR+gPcihjwR3E6FIZ15coyOq5KlQHXbd0LdXToiDCg2FmGQdRbKd6FVkdYXPeuoFy2UisWdymgdbsI0l6rSGtr0vKjSVtofjRn/3B7khNSmtPk5Hlyzus1c2ZyTs735IG0ybvP833Ot65QKBQCAAASG5d6AAAAECFMAQDIhDAFACALwhQAgCwIUwAAsiBMAQDIgjAFACALwhQAgCyMTz2AWtHb2xs7d+6MqVOnRl1dXerhAABDUCgUYu/evTFr1qwYN858XqUJ01Gyc+fOaG5uTj0MAOAobN++PWbPnp16GFVPmI6SqVOnRsTf/mA3NDQkHg0AMBQdHR3R3Nxc/D1OZQnTUXJo+b6hoUGYAsAY4zS80eFkCQAAsiBMAQDIgjAFACALwhQAgCwIUwAAsiBMAQDIgjAFACALwhQAgCwIUwAAsiBMAQDIgjAFACALwhQAgCwIU6rGge6D8Y+P/Cm27tp7VMc//qcX4pdbdo3wqBgpu/YeiHuf2BYvd/WkHgoAFSJMqRrf+eUf46YHn4kFtz5S9rGFQiE++t3HYtGqX8fz+zorMDqG66N3PBbX/I/fxVcfeCb1UACoEGFK1fg/21466mMLhb6PX9zfNQKjYaQ9+/z+iIj4+TNtiUcCQKUIUwAAsiBMISIKR34KAFBhwhTib+eYAgBpCVMAALIgTCEs5QNADoQpROmufAAgDWEKAEAWhClERMFiPgAkJ0whLOUDQA6EKQAAWRCmAABkQZhCWMoHgBwIUwAAsiBMIezKB4AcCFMIS/kAkANhCuGSpACQA2EKAEAWhClERMFaPgAkJ0whLOUDQA6EKQAAWRCmEHblA0AOhClEWMsHgAwI04hYvnx5nHXWWTF16tSYMWNGXHzxxbFly5aS5xw4cCAWL14cr3vd6+K4446LSy65JNra2hKNGACg+gjTiFi/fn0sXrw4HnvssVi7dm10d3fH+eefH/v37y8+5+qrr46f/vSn8aMf/SjWr18fO3fujI985CMJR81IcuUnAEhvfOoB5GDNmjUl91evXh0zZsyIjRs3xvvf//5ob2+PO++8M+6555744Ac/GBERq1atire85S3x2GOPxXve854Uw2YEOccUANIzYzqI9vb2iIiYNm1aRERs3Lgxuru7Y8GCBcXnvPnNb45TTjklNmzYkGSMAADVxozpAL29vXHVVVfFueeeG29729siIqK1tTUmTpwYxx9/fMlzZ86cGa2trYO+TmdnZ3R2dhbvd3R0VGzMDJ8JUwBIz4zpAIsXL46nnnoq7r333mG9zvLly6OxsbF4a25uHqERUgmu/AQA6QnTfpYsWRIPPPBAPPzwwzF79uzi401NTdHV1RV79uwpeX5bW1s0NTUN+lrLli2L9vb24m379u2VHDoAwJgnTONvs2VLliyJH//4x/GLX/wi5syZU/L5efPmxYQJE2LdunXFx7Zs2RLbtm2LlpaWQV+zvr4+GhoaSm7ky3wpAKTnHNP42/L9PffcE/fff39MnTq1eN5oY2NjTJ48ORobG+Pyyy+PpUuXxrRp06KhoSE+//nPR0tLix35VaL/Sr5VfQBIQ5hGxO233x4REfPnzy95fNWqVbFo0aKIiPjGN74R48aNi0suuSQ6Oztj4cKF8Z3vfGeUR0qleB9TAEhPmMbQNr5MmjQpVqxYEStWrBiFEZGSSAWANJxjChElJ5laygeANIQphM1PAJADYQoDmDEFgDSEKcSAXfnmTwEgCWEKIUYBIAfCFAawlA8AaQhTCDEKADkQphB25QNADoQpDGD2FADSEKYQpVf/shEKANIQphAD3i5KlwJAEsIUAIAsCFMYwIQpAKQhTCEGLuVLUwBIQZhC2PAEADkQpjCARAWANIQphF35AJADYQphlhQAciBM4VVkKgCkIEwhBlz5SZcCQBLCFMIcKQDkQJjCACIVANIQphB25QNADoQpRIR5UgBIT5jCAC5JCgBpCFOIAUv56YYBADVNmEKIUQDIgTCFsPkJAHIgTGGAgvlTAEhCmEIMiFFdCgBJCFMIy/cAkANhCgNoVABIQ5hC2PwEADkQphA2PAFADoQpDCBSASANYQphKR8AciBMAQDIgjCFAUyYAkAawhRi4FK+NAWAFIQphA1PAJADYQoDSFQASEOYQgzYia9MASAJYQqhRQEgB8IUonTDk/NNASANYQoD2JQPAGkIUwhL+QCQA2EK4ZKkAJADYQoD6FIASEOYQkTIUQBIT5hCuCQpAORAmMIAshQA0hCmEKUxasIUANIQphBiFAByIEzhVVQqAKQgTCEGXJJUlwJAEsIUwhwpAORAmEIMeLuodMMAgJomTGEAS/kAkIYwhYgomCcFgOSEaUQ88sgj8aEPfShmzZoVdXV1cd9995V8vlAoxHXXXRcnnXRSTJ48ORYsWBB/+MMf0gyWyihZyhepAJCCMI2I/fv3xxlnnBErVqwY9PM333xzfOtb34qVK1fG448/Hscee2wsXLgwDhw4MMojZTRYygeANManHkAOLrzwwrjwwgsH/VyhUIjbbrstrr322vjwhz8cERHf//73Y+bMmXHffffFxz72sdEcKhWiRQEgPTOmR/Dss89Ga2trLFiwoPhYY2NjnH322bFhw4aEI2Mk2ZUPAOmZMT2C1tbWiIiYOXNmyeMzZ84sfm4wnZ2d0dnZWbzf0dFRmQEy4grW8gEgCTOmFbJ8+fJobGws3pqbm1MPiddgwxMApCdMj6CpqSkiItra2koeb2trK35uMMuWLYv29vbibfv27RUdJ8NjkhQA0hOmRzBnzpxoamqKdevWFR/r6OiIxx9/PFpaWg57XH19fTQ0NJTcGBtEKgCk4RzTiNi3b19s3bq1eP/ZZ5+NTZs2xbRp0+KUU06Jq666Kr72ta/Fm970ppgzZ0585StfiVmzZsXFF1+cbtCMKC0KAOkJ04j4zW9+E+edd17x/tKlSyMi4rLLLovVq1fHl770pdi/f39ceeWVsWfPnnjve98ba9asiUmTJqUaMiOs/4Yn55sCQBrCNCLmz5//mjux6+rq4sYbb4wbb7xxFEdFKpbyASAN55hSlcp9y6f+zxamAJCGMKUqlR2XYhQAkhOmVKXyu7T/OaYAQArCFAZw5ScASEOYUpXKPsdUiwJAcsKUqlT2Un6/AzQqAKQhTGEgZQoASQhTqlK5S/NaFADSE6ZUpXKv3uTKTwCQnjCFAWyEAoA0hClVyVI+AIw9whTCrnwAyIEwhQEs5QNAGsKUqlR+XKpRAEhNmFKVyt+Vf/THAgAjQ5jCAJbyASANYUpVsisfAMYeYUpVKjc07coHgPSEKVWpUOaUacl5pdbyASAJYQoAQBaEKVXJUj4AjD3ClKo0nM1PVvIBIA1hCgOUe34qADAyhCnVqdwZUzEKAMkJU6rScK7eJFEBIA1hCgOYPAWANIQpVanszU9iFACSE6ZUpbLfLqrfERoV4PCck08lCVMYwA9dgMHt3tsZZ399XSz/n8+kHgpVSphSlcq+JKkWBTii7z7yx9i1tzPuWP+n1EOhSglTqtJwrvwEwOD8rKTShClVo+Syoq78BABjjjAFACALwpSqUbqzvtxzTI/+WCrPhjSA2iBMqRol7WIpv6r4ngDUBmEKAEAWhClVo2TzU9kHD+NYKs73BKA2CFOqRsk5pmUv5R/9sVSec0wBaoMwBQAgC8KUqlG6lH/0V36yKz8/viMAtUGYUjWGs7Pervy8+Z4A1AZhCgBAFoQp1WMYO+vNyOXN6RUAtUGYUjVKd9aXeY7pMI6l8nxLOJLe3kJc809Pxt2PP5d6KDXDz0oqQZjCAH7WwtizbvOuuPfX2+PLP34q9VBqxsFePywZecKUqlGys77czU9+vsKY1v5Kd+oh1JyDfnBSAcKUqjGcH5GFw3xMHvz+g/z09qYeAdVImFI1+p/vVHbIDOdYKs7mJ8hPjzKlAoQpAFXFppzRoUupBGFK1Shdji93V/7RH0vl6QzK0WNTzqhwjimVIEypGiO1+cnP2vz4llCO7oOm8iqlf/NbyqcShCkAVaW7xz9lKqW337/cdSmVIEypGsPZWV+ycWpERsNIcs4gR9Lbbyqvy4xpxfR/71JL+VSCMKV6lOysP/pzTK3l58d35PCe/Mue+I93b4znXtifeihJdfebvrOUXzn9z989eNDfTEbe+NQDAODo/dt/+N8REfHcCy/HP/+n9yUeTTrdPcJ0NPSaMaXCzJhSNYa3lH/0x1J5fv8d2R927Us9hKJ/fORPcevafxnVr9ndb/ZOmFZO/xh1SVIqwYwpVWNYu/IP8zpkwvdkzOg+2Bs3PfhMRERcOm92NE+bMipft/95pV02P1VMyTmmwpQKMGMKwIjp6HfN+v1dPaP2dfvPktr8VDnClEoTplSNwjAW80t35Q9+7Lpn2uLWh7aUnGPF6HDRg7Gj40BfjO47kCZMj7SU710ejp4wpdKEaZlWrFgRb3jDG2LSpElx9tlnxxNPPJF6SPx/I/Um+Yc79vLv/Sa+9YutsfaZtqN/cY6Kjhg7+s+Ytvf7uNJKzjHtOXyYvrCvM1qW/yKuv/+p0RhW1fF2UVSaMC3DD3/4w1i6dGlcf/318dvf/jbOOOOMWLhwYezatSv10Kiwnn4zMNtffDnhSIbu/k074v5NO1IPgxrTcaAvRve8PHph2tUztKX8e3+9PVo7DsT3Njw3GsOqOjY/UWnCtAy33nprXHHFFfHpT3865s6dGytXrowpU6bEXXfdlXpoxPB21h/p2Of3dRU/7n6N9+5b89Rf44afPh2dPQfLHEF52l/pjvs37TjskuXz+zrj7+/dFH9/76bYvbezomMZDbn/+st9F/iTf9kTG597aURf80D3wUH/kdbxSt/y/ejOmPZfyj/8n5jO7r6/m/s7X32qQVdPb1y++tdxzT89ObIDrBKW8qk0u/KHqKurKzZu3BjLli0rPjZu3LhYsGBBbNiwIdm4tr/4ctzzxLZkXz8nu/YeKH5856+ejWnHTRzysZu27Sl+vOGPL8R/XrO55PPP94u7nz3dWjIr1N/tv/xjRET8+fn98eaTGob0tfe83BWTJ4yP+glD/3fif/nVn6L7YCGWP7g5/u5fn/yqz+/c80rx46/98+9j1vGTh/zaQ9FbKMT/3b4n6scfE285qSHq6kb05V/lla6+mNh3oOdV35+Ufv3si/H0zo44783T4/WvOzbZOLp6egf9//L83s740ca/RETEh8+cNeifhUIh4qX9XXH8lAkxbtyRv5mFQsR/fWJbtL/SHQveMiPeOP242PNyd5xw7MTY0tpRfN6d/+vZ2L1vdP5h1D+8//vG7fHbbYOH+KN/fKH48U0PPhONkyeUfL6t40Cs2/y3VbApE8v7e1kLtvZ7W7K7H38uHt6S14rh7BMmx78/+/Wph8Ew1BWcBT4kO3fujJNPPjkeffTRaGlpKT7+pS99KdavXx+PP/54yfM7Ozujs7PvB3JHR0c0NzdHe3t7NDQMLViG4jd/fjH+3cp0YQwAuTjrDSfEj/7DOSP6mh0dHdHY2Djiv78ZnBnTClm+fHnccMMNFf86MxsmxeXvnVPxrzNW7NzzSpzUOPmoZvD2d/ZET2/hVTMoh3T2HIw9L3fHzIZJh32N7oO98df2A3HKEN+7cf2/7C7OQMw/fXq8cfpxQzquUIj4w6698a9mTj3scw6d33f8lMH/e4Zrx0uvxMTx42L61PqKvP5gdu55ZcRnf4frYG8hnt/X+Zp/Liptx0uvxMknHP7/y0v7u6Knt/Ca36u6KO+Uie6DvfHcCy/HaTOOe9Xx9ePHxXGTxscL/U6BGQ0v7OuMY+vHx6QJx7zm81rbD8TrjpsYE44ZfDZ0997OmDRhXEydVJm/O2NdW8eBeN2xE2P8Yf7/pdT8Gn8PGBuE6RCdeOKJccwxx0RbW+mO7La2tmhqanrV85ctWxZLly4t3j80YzrSmqdNia/8m7kj/rqMjpf+26ZimP7dO0+OD5/56mV5AKgV+f1zJ1MTJ06MefPmxbp164qP9fb2xrp160qW9g+pr6+PhoaGkhsAAIdnxrQMS5cujcsuuyze9a53xbvf/e647bbbYv/+/fHpT3869dAYo+qi75yDukrvIAKAzAnTMnz0ox+N3bt3x3XXXRetra1x5plnxpo1a2LmzJmph8YY1b9FZSkAtU6YlmnJkiWxZMmS1MOgSvSPUROmANQ655gCAJAFYQoJlS7lmzIFoLYJU0iodPNTwoEAQAaEKQAAWRCmkJBd+QDQR5hCQiVhqkwBqHHCFACALAhTSKruMB8DQO0RppCQpXwA6CNMAQDIgjCFhCzkA0AfYQoJlS7lS1MAapswhYRKrvyUcBwAkANhCgBAFoQpJGRXPgD0EaaQUMnmJ2EKQI0TpgAAZEGYQkL9d+LX2f4EQI0TppALXQpAjROmAABkQZhCQiW78tMNAwCyIEwhoZI32LctH4AaJ0wBAMiCMIWELOUDQB9hCgl5g30A6CNMAQDIgjCFhEqX8k2ZAlDbhCkkVHLlJ10KQI0TppBQ3WE+BoBaJEwBAMiCMIWUTJkCQJEwhYRKrvykTAGoccIUAIAsCFNIqOTtokyYAlDjhCkk5BRTAOgjTAEAyIIwhYRKl/LNmQJQ24QpJFSyK1+XAlDjhCkAAFkQppBQyVJ+umEAQBaEKSRUsitfmQJQ44QpAABZEKaQUp13MgWAQ4QpJGQpHwD6CFNIyOYnAOgjTAEAyIIwhYRK32DfnCkAtU2YQkKW8gGgjzAFACALwhQSsisfAPoIU0iodClfmQJQ24QpAABZEKaQUP+d+JbyAah1whQAgCwIUwAAsiBMIaGSzU+W8gGoccIUEiq58pNd+QDUOGEKCZkxBYA+whQAgCwI04i46aab4pxzzokpU6bE8ccfP+hztm3bFhdddFFMmTIlZsyYEV/84hejp6dndAdK1XHlJwDoMz71AHLQ1dUVl156abS0tMSdd975qs8fPHgwLrroomhqaopHH300/vrXv8anPvWpmDBhQnz9619PMGKqhSs/AUAfM6YRccMNN8TVV18db3/72wf9/EMPPRS///3v4wc/+EGceeaZceGFF8ZXv/rVWLFiRXR1dY3yaAEAqpMwHYINGzbE29/+9pg5c2bxsYULF0ZHR0c8/fTTgx7T2dkZHR0dJTcYqGRXvglTAGqcMB2C1tbWkiiNiOL91tbWQY9Zvnx5NDY2Fm/Nzc0VHydjT+lSPgDUtqoN02uuuSbq6upe87Z58+aKff1ly5ZFe3t78bZ9+/aKfS0AgGpQtZufvvCFL8SiRYte8zmnnnrqkF6rqakpnnjiiZLH2traip8bTH19fdTX1w/p9SHCUj4AVG2YTp8+PaZPnz4ir9XS0hI33XRT7Nq1K2bMmBEREWvXro2GhoaYO3fuiHwNalNdSY0qUwBqW9WGaTm2bdsWL774Ymzbti0OHjwYmzZtioiI0047LY477rg4//zzY+7cufHJT34ybr755mhtbY1rr702Fi9ebFYUAGCECNOIuO666+J73/te8f473/nOiIh4+OGHY/78+XHMMcfEAw88EJ/73OeipaUljj322LjsssvixhtvTDVkqoQ32AeAPsI0IlavXh2rV69+zee8/vWvjwcffHB0BkTNsCsfAPpU7a58AADGFmEKCZUu5ZszBaC2CVNIqH+MylIAap0whYRKzjFVpgDUOGEKAEAWhCkkVPr2+qZMAahtwhRS6n+OqS4FoMYJUwAAsiBMISGTpADQR5hCQnblA0AfYQoAQBaEKSTUfye+Kz8BUOuEKSRUspSfbhgAkAVhCgBAFoQpJFTyBvumTAGoccIUEipdylemANQ2YQoAQBaEKSRUuis/4UAAIAPCFFKyKx8AioQpJFR32DsAUHuEKQAAWRCmkFD/qz3ZlQ9ArROmkJD3MQWAPsIUAIAsCFNIqM6ufAAoEqaQiTpr+QDUOGEKAEAWhClkwnwpALVOmEImrOQDUOuEKQAAWRCmkAlvsA9ArROmkAtdCkCNE6aQCeeYAlDrhCkAAFkQppAJE6YA1DphCplw5ScAap0wBQAgC8IUMmG+FIBaJ0whE1byAah1whQAgCwIU8iEKz8BUOuEKWTCUj4AtU6YAgCQBWEKAEAWhClkwlI+ALVOmAIAkAVhCpmwKx+AWidMIROW8gGodcIUMqFLAah1whQAgCwIU8hEnbV8AGqcMIVMyFIAap0wBQAgC8IUMmElH4BaJ0whE84xBaDWCVMAALIgTAEAyIIwBQAgC8IUAIAs1HyY/vnPf47LL7885syZE5MnT443vvGNcf3110dXV1fJ85588sl43/veF5MmTYrm5ua4+eabE40YAKA6jU89gNQ2b94cvb29cccdd8Rpp50WTz31VFxxxRWxf//+uOWWWyIioqOjI84///xYsGBBrFy5Mn73u9/FZz7zmTj++OPjyiuvTPxfAABQHWo+TC+44IK44IILivdPPfXU2LJlS9x+++3FML377rujq6sr7rrrrpg4cWK89a1vjU2bNsWtt94qTAEARkjNL+UPpr29PaZNm1a8v2HDhnj/+98fEydOLD62cOHC2LJlS7z00kuDvkZnZ2d0dHSU3AAAODxhOsDWrVvj29/+dnz2s58tPtba2hozZ84sed6h+62trYO+zvLly6OxsbF4a25urtygAQCqQNWG6TXXXBN1dXWvedu8eXPJMTt27IgLLrggLr300rjiiiuG9fWXLVsW7e3txdv27duH9XoAANWuas8x/cIXvhCLFi16zeeceuqpxY937twZ5513Xpxzzjnx3e9+t+R5TU1N0dbWVvLYoftNTU2DvnZ9fX3U19cfxcgBAGpT1Ybp9OnTY/r06UN67o4dO+K8886LefPmxapVq2LcuNKJ5JaWlvjyl78c3d3dMWHChIiIWLt2bZx++ulxwgknjPjYAQBqUdUu5Q/Vjh07Yv78+XHKKafELbfcErt3747W1taSc0c//vGPx8SJE+Pyyy+Pp59+On74wx/GN7/5zVi6dGnCkQMAVJeqnTEdqrVr18bWrVtj69atMXv27JLPFQqFiIhobGyMhx56KBYvXhzz5s2LE088Ma677jpvFQUAMIJqPkwXLVp0xHNRIyLe8Y53xK9+9avKDwgAoEbV/FI+AAB5EKYAAGRBmAIAkAVhCgBAFoQpAABZEKYAAGRBmAIAkAVhCgBAFoQpAABZEKYAAGRBmAIAkAVhCgBAFoQpAABZEKYAAGRBmAIAkAVhCgBAFoQpAABZEKYAAGRBmAIAkAVhCgBAFoQpAABZEKaQ0JwTj009BADIxvjUA4Ba9s5TTohvfuzMOGXalNRDAYDkhCkk9uEzT049BADIgqV8AACyIEwBAMiCMAUAIAvCFACALAhTAACyIEwBAMiCMAUAIAvCFACALAhTAACyIEwBAMiCMAUAIAvCFACALAhTAACyMD71AGpFoVCIiIiOjo7EIwEAhurQ7+1Dv8epLGE6Svbu3RsREc3NzYlHAgCUa+/evdHY2Jh6GFWvruCfAKOit7c3du7cGVOnTo26uroRfe0dO3bE3LlzR/Q1AWAs2r59ezQ0NIzY6xUKhdi7d2/MmjUrxo1zBmSlmTEdJePGjYvZs2dX5LWdHgAAf9PQ0DCiYRoRZkpHkfQHACALwhQAgCxYyq8CDQ0Nce6550ZPT0/xXNZD58IMvB8RQ3rsaI8bydcaK8flMIaxclwOYxgrx+UwhrFyXA5jGCvH5TCGSh03fvz4+MAHPhD19fXB2GXzEwAAWbCUDwBAFoQpAABZEKYAAGRBmAIAkIWyduUvX748brjhhujs7KzUeAAAqAIXXHBB3HnnnTFr1qwhH1PWjOn69eujp6cnjjnmmLIHBwBA7fj5z38el1xySVnHDOvtonbv3h0zZsw42sMBAKhidXV10dnZGRMmTBjS84f1Bvvt7e3DORwAgCo1YcKEOOuss4YcpRHD2PzU29sbn//854/2cAAAqthpp50WP/nJT8o65qjDdPHixfGzn/3saA8HAKCKPffcc/GJT3wiyjlr9KjCdMmSJXHHHXeU9YUAAKgdBw8ejDVr1sRjjz025GPKCtNCoRCf+9znYsWKFaIUAIBXOXRO6aFWLOdtRssK08WLF8fKlSvLOQQAgBrS3d0dERE9PT1x0kknxemnnz7kY8t6u6i6urryRwcAQM1atWpVLFq0aEjPLevtoizfAwBQKUe9Kx8AAEaSMAUAIAvCFACALAhTAACyIEwBAMiCMAUAIAvCFACALAhTAACyIEwBAMiCMAUAIAvCFACALAhTAACy8P8AoPdysIIaqGcAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "x = [r['date_added'] for r in recs]\n", - "y = [r['time_lost'] for r in recs]\n", - "plt.plot(x, y) \n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "138e5496-e058-417a-881e-8450e20af0f9", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "0cb5feca-620b-49a0-b25b-835a6d38843a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'id': '0005d0e0-6de7-4857-b658-cfca7147374a',\n", - " 'site_id': 'summit',\n", - " 'message_text': 'The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r\\nwe try the parameter with uppercase now\\r\\n\\r\\n\\r\\n open: False\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nError in run\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 500, in wait_for\\r\\n return fut.result()\\r\\n ^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 239, in _get_next_ackcmd\\r\\n await self._next_ack_event.wait()\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", line 213, in wait\\r\\n await fut\\r\\nasyncio.exceptions.CancelledError\\r\\n\\r\\n\\r\\nThe above exception was the direct cause of the following exception:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 189, in next_ackcmd\\r\\n ackcmd = await self._wait_task\\r\\n ^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 214, in _basic_next_ackcmd\\r\\n ackcmd = await asyncio.wait_for(\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 502, in wait_for\\r\\n raise exceptions.TimeoutError() from exc\\r\\nTimeoutError\\r\\n\\r\\n\\r\\nDuring handling of the above exception, another exception occurred:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", line 603, in do_run\\r\\n await self._run_task\\r\\n File \"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", line 170, in run\\r\\n await getattr(self.remote, f\"cmd_{self.cmd}\").start(\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\\r\\n return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 205, in next_ackcmd\\r\\n raise base.AckTimeoutError(\\r\\nlsst.ts.salobj.base.AckTimeoutError: msg=\\'Timed out waiting for command acknowledgement\\', ackcmd=(ackcmd private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: -301>, error=0, result=\\'No command acknowledgement seen\\')\\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-03-20T04:15:26.769000',\n", - " 'user_id': 'cmorales@summit-lsp.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-03-20T04:16:06.976595',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-03-20T04:15:26.769000',\n", - " 'components': ['AuxTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'},\n", - " {'id': '00067b6a-1741-41f3-87af-57261dff30ac',\n", - " 'site_id': 'summit',\n", - " 'message_text': 'David updated environment. But no need to cycle Scheduler 1. Waiting for completion of the current block. \\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-04-24T20:53:41.843000',\n", - " 'user_id': 'ykang@summit-lsp.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-04-24T20:54:19.346646',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-04-24T20:53:41.843000',\n", - " 'components': ['MainTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'},\n", - " {'id': '000a3ba8-b1a9-4b04-9c4a-263da3dac1d1',\n", - " 'site_id': 'summit',\n", - " 'message_text': 'Runing BLOCK-T22 AuxTel filter Scans, the auxtel/calibrations/run_calibration_sequence.py went to fault.\\r\\n\\r\\n\\r\\nsalIndex: 200068\\r\\nFile \"/net/obs-env/auto_base_packages/ts_observatory_control/python/lsst/ts/observatory/control/auxtel/atcalsys.py\", line 338, in _take_data\\r\\n await asyncio.gather(\\r\\n File \"/net/obs-env/auto_base_packages/ts_observatory_control/python/lsst/ts/observatory/control/auxtel/atcalsys.py\", line 430, in take_fiber_spectrum\\r\\n await self.fiberspectrograph.cmd_expose.set_start(\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 416, in set_start\\r\\n return await self.start(timeout=timeout, wait_done=wait_done)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\\r\\n return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 191, in next_ackcmd\\r\\n raise base.AckError(msg=\"Command failed\", ackcmd=ackcmd)\\r\\nlsst.ts.salobj.base.AckError: msg=\\'Command failed\\', ackcmd=(ackcmd private_seqNum=1157551610, ack=<SalRetCode.CMD_FAILED: -302>, error=1, result=\"Failed: 502, message=\\'Bad Gateway\\', url=URL(\\'http://comcam-mcm-dds.cp.lsst.org/ImageUtilities/rest/imageNameService?n=1&sourceIndex=3&source=FiberSpectrograph\\')\")\\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-06-19T01:59:08.706000',\n", - " 'user_id': 'cmd_user@summit-lsp.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': False,\n", - " 'date_added': '2024-06-19T01:59:58.701343',\n", - " 'date_invalidated': '2024-06-19T02:12:01.302498',\n", - " 'parent_id': 'af0157e3-d7f0-4068-9a8a-e51a0a77d260',\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-06-19T01:59:08.706000',\n", - " 'components': ['AuxTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'},\n", - " {'id': '0010e246-8039-4741-b4c6-54047e9464c5',\n", - " 'site_id': 'summit',\n", - " 'message_text': 'Still checking updates in the wavefront estimation pipeline version, offsetting manually the ATHexapod in different axes and deploying different versions of the pipeline.\\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-08-21T04:04:38.053000',\n", - " 'user_id': 'kpena@summit-lsp.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-08-21T04:22:26.232653',\n", - " 'date_invalidated': None,\n", - " 'parent_id': '99de2a12-20eb-45ae-b189-a793b63e6ab5',\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-08-21T04:04:38.053000',\n", - " 'components': ['AuxTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'}]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "recs[:4]" + "print('Table available as CSV file: ')\n", + "display(myfile)\n", + "df" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "f6441d81-93a8-4369-93fb-55d3715783cc", "metadata": {}, "outputs": [ @@ -738,23 +865,23 @@ " ...\n", " \n", " \n", - " 994\n", - " 22325b7d-7948-4da8-88ec-2a47ceb088e0\n", + " 7668\n", + " ffbd086c-cf20-4c45-aef5-b2783d348192\n", " summit\n", - " Block 109 starting again\\r\\n\n", + " Script Failed salIndex: 101647 with move_rotat...\n", " 0\n", " []\n", " []\n", " 0.0\n", - " 2023-11-16T02:56:30.009000\n", - " echristensen@love01.cp.lsst.org\n", + " 2024-04-19T19:06:54.594000\n", + " ykang@summit-lsp.lsst.codes\n", " LOVE\n", " ...\n", " None\n", " None\n", " None\n", " None\n", - " 2023-11-16T02:56:30.009000\n", + " 2024-04-19T19:06:54.594000\n", " [MainTel]\n", " [None]\n", " [None]\n", @@ -762,23 +889,23 @@ " fault\n", " \n", " \n", - " 995\n", - " 2233da67-c777-4dd6-bc66-a241f93df5ae\n", + " 7669\n", + " ffeaada0-3b08-4de2-b48b-9acf2623fb7e\n", " summit\n", - " Az encoder checking thru slew test. \\r\\n\\r\\n\\r...\n", + " salIndex:&nbsp;101588\\r\\n \\r\\nError in run\\r\\n...\n", " 0\n", " []\n", " []\n", " 0.0\n", - " 2024-04-19T23:27:02.011000\n", - " ykang@summit-lsp.lsst.codes\n", + " 2024-03-21T01:03:51.861000\n", + " pvenegas@love01.cp.lsst.org\n", " LOVE\n", " ...\n", " None\n", " None\n", " None\n", " None\n", - " 2024-04-19T23:27:02.011000\n", + " 2024-03-21T01:03:51.861000\n", " [MainTel]\n", " [None]\n", " [None]\n", @@ -786,71 +913,71 @@ " fault\n", " \n", " \n", - " 996\n", - " 223c0310-03d5-450d-bf5c-0a04bdea6536\n", + " 7670\n", + " ffebf6c9-156c-4309-9662-f5697907cc47\n", " summit\n", - " Restarting [BLOCK-178|https://jira.lsstcorp.or...\n", + " h3. Execution of power_on_atcalsys.py \\r\\n\n", " 0\n", " []\n", " []\n", " 0.0\n", - " 2024-01-05T20:15:27.453000\n", - " kfanning@love01.cp.lsst.org\n", + " 2024-06-12T01:55:35.836000\n", + " pvenegas@summit-lsp.lsst.codes\n", " LOVE\n", " ...\n", " None\n", " None\n", " None\n", " None\n", - " 2024-01-05T20:15:27.453000\n", - " [MainTel]\n", + " 2024-06-12T01:55:35.836000\n", + " [AuxTel]\n", " [None]\n", " [None]\n", " None\n", " fault\n", " \n", " \n", - " 997\n", - " 2240e19e-7204-4c50-a3ba-c643d60aa0d2\n", + " 7671\n", + " fff11764-aae1-4428-aea0-b72fdb3dafa6\n", " summit\n", - " LATISS enabled but checkout failed \\r\\n\\r\\n\\r\\...\n", + " Updated pointing model based on March 2 data. ...\n", " 0\n", " []\n", " []\n", " 0.0\n", - " 2024-07-15T19:39:38.630000\n", - " kkelkar@summit-lsp.lsst.codes\n", + " 2024-03-04T03:19:22.793000\n", + " bstalder@summit-lsp.lsst.codes\n", " LOVE\n", " ...\n", " None\n", " None\n", " None\n", " None\n", - " 2024-07-15T19:39:38.630000\n", - " [AuxTel]\n", + " 2024-03-04T03:19:22.793000\n", + " [MainTel]\n", " [None]\n", " [None]\n", " None\n", " fault\n", " \n", " \n", - " 998\n", - " 22475aa1-f15a-46f1-87b8-b7a1708daaf4\n", + " 7672\n", + " fff14a30-c341-4561-a2ea-0f043d19f526\n", " summit\n", - " Powercycled M2 cabinet to bring back the M2 co...\n", + " M1M3 faulted HP 2 excessive forces\\r\\n\n", " 0\n", " []\n", " []\n", " 0.0\n", - " 2024-02-21T15:37:00\n", - " kfanning@summit-lsp.lsst.codes\n", + " 2024-01-03T19:45:18.279000\n", + " bstalder@love01.cp.lsst.org\n", " LOVE\n", " ...\n", " None\n", " None\n", " None\n", " None\n", - " 2024-02-21T16:10:28.176000\n", + " 2024-01-03T19:45:18.279000\n", " [MainTel]\n", " [None]\n", " [None]\n", @@ -859,92 +986,105 @@ " \n", " \n", "\n", - "

999 rows × 24 columns

\n", + "

7673 rows × 24 columns

\n", "" ], "text/plain": [ - " id site_id \\\n", - "0 0005d0e0-6de7-4857-b658-cfca7147374a summit \n", - "1 00067b6a-1741-41f3-87af-57261dff30ac summit \n", - "2 000a3ba8-b1a9-4b04-9c4a-263da3dac1d1 summit \n", - "3 0010e246-8039-4741-b4c6-54047e9464c5 summit \n", - "4 0017b90e-26aa-4a7c-8186-fc06ac9b5aa6 summit \n", - ".. ... ... \n", - "994 22325b7d-7948-4da8-88ec-2a47ceb088e0 summit \n", - "995 2233da67-c777-4dd6-bc66-a241f93df5ae summit \n", - "996 223c0310-03d5-450d-bf5c-0a04bdea6536 summit \n", - "997 2240e19e-7204-4c50-a3ba-c643d60aa0d2 summit \n", - "998 22475aa1-f15a-46f1-87b8-b7a1708daaf4 summit \n", + " id site_id \\\n", + "0 0005d0e0-6de7-4857-b658-cfca7147374a summit \n", + "1 00067b6a-1741-41f3-87af-57261dff30ac summit \n", + "2 000a3ba8-b1a9-4b04-9c4a-263da3dac1d1 summit \n", + "3 0010e246-8039-4741-b4c6-54047e9464c5 summit \n", + "4 0017b90e-26aa-4a7c-8186-fc06ac9b5aa6 summit \n", + "... ... ... \n", + "7668 ffbd086c-cf20-4c45-aef5-b2783d348192 summit \n", + "7669 ffeaada0-3b08-4de2-b48b-9acf2623fb7e summit \n", + "7670 ffebf6c9-156c-4309-9662-f5697907cc47 summit \n", + "7671 fff11764-aae1-4428-aea0-b72fdb3dafa6 summit \n", + "7672 fff14a30-c341-4561-a2ea-0f043d19f526 summit \n", + "\n", + " message_text level tags urls \\\n", + "0 The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r... 0 [] [] \n", + "1 David updated environment. But no need to cycl... 0 [] [] \n", + "2 Runing BLOCK-T22 AuxTel filter Scans, the auxt... 0 [] [] \n", + "3 Still checking updates in the wavefront estima... 0 [] [] \n", + "4 The m1m3 ump test failed for actuator 108. \\r\\... 0 [] [] \n", + "... ... ... ... ... \n", + "7668 Script Failed salIndex: 101647 with move_rotat... 0 [] [] \n", + "7669 salIndex: 101588\\r\\n \\r\\nError in run\\r\\n... 0 [] [] \n", + "7670 h3. Execution of power_on_atcalsys.py \\r\\n 0 [] [] \n", + "7671 Updated pointing model based on March 2 data. ... 0 [] [] \n", + "7672 M1M3 faulted HP 2 excessive forces\\r\\n 0 [] [] \n", "\n", - " message_text level tags urls \\\n", - "0 The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r... 0 [] [] \n", - "1 David updated environment. But no need to cycl... 0 [] [] \n", - "2 Runing BLOCK-T22 AuxTel filter Scans, the auxt... 0 [] [] \n", - "3 Still checking updates in the wavefront estima... 0 [] [] \n", - "4 The m1m3 ump test failed for actuator 108. \\r\\... 0 [] [] \n", - ".. ... ... ... ... \n", - "994 Block 109 starting again\\r\\n 0 [] [] \n", - "995 Az encoder checking thru slew test. \\r\\n\\r\\n\\r... 0 [] [] \n", - "996 Restarting [BLOCK-178|https://jira.lsstcorp.or... 0 [] [] \n", - "997 LATISS enabled but checkout failed \\r\\n\\r\\n\\r\\... 0 [] [] \n", - "998 Powercycled M2 cabinet to bring back the M2 co... 0 [] [] \n", + " time_lost date_begin user_id \\\n", + "0 0.0 2024-03-20T04:15:26.769000 cmorales@summit-lsp.lsst.codes \n", + "1 0.0 2024-04-24T20:53:41.843000 ykang@summit-lsp.lsst.codes \n", + "2 0.0 2024-06-19T01:59:08.706000 cmd_user@summit-lsp.lsst.codes \n", + "3 0.0 2024-08-21T04:04:38.053000 kpena@summit-lsp.lsst.codes \n", + "4 0.0 2023-11-21T19:51:54.868000 bquint@love01.cp.lsst.org \n", + "... ... ... ... \n", + "7668 0.0 2024-04-19T19:06:54.594000 ykang@summit-lsp.lsst.codes \n", + "7669 0.0 2024-03-21T01:03:51.861000 pvenegas@love01.cp.lsst.org \n", + "7670 0.0 2024-06-12T01:55:35.836000 pvenegas@summit-lsp.lsst.codes \n", + "7671 0.0 2024-03-04T03:19:22.793000 bstalder@summit-lsp.lsst.codes \n", + "7672 0.0 2024-01-03T19:45:18.279000 bstalder@love01.cp.lsst.org \n", "\n", - " time_lost date_begin user_id \\\n", - "0 0.0 2024-03-20T04:15:26.769000 cmorales@summit-lsp.lsst.codes \n", - "1 0.0 2024-04-24T20:53:41.843000 ykang@summit-lsp.lsst.codes \n", - "2 0.0 2024-06-19T01:59:08.706000 cmd_user@summit-lsp.lsst.codes \n", - "3 0.0 2024-08-21T04:04:38.053000 kpena@summit-lsp.lsst.codes \n", - "4 0.0 2023-11-21T19:51:54.868000 bquint@love01.cp.lsst.org \n", - ".. ... ... ... \n", - "994 0.0 2023-11-16T02:56:30.009000 echristensen@love01.cp.lsst.org \n", - "995 0.0 2024-04-19T23:27:02.011000 ykang@summit-lsp.lsst.codes \n", - "996 0.0 2024-01-05T20:15:27.453000 kfanning@love01.cp.lsst.org \n", - "997 0.0 2024-07-15T19:39:38.630000 kkelkar@summit-lsp.lsst.codes \n", - "998 0.0 2024-02-21T15:37:00 kfanning@summit-lsp.lsst.codes \n", + " user_agent ... parent_id systems \\\n", + "0 LOVE ... None None \n", + "1 LOVE ... None None \n", + "2 LOVE ... af0157e3-d7f0-4068-9a8a-e51a0a77d260 None \n", + "3 LOVE ... 99de2a12-20eb-45ae-b189-a793b63e6ab5 None \n", + "4 LOVE ... None None \n", + "... ... ... ... ... \n", + "7668 LOVE ... None None \n", + "7669 LOVE ... None None \n", + "7670 LOVE ... None None \n", + "7671 LOVE ... None None \n", + "7672 LOVE ... None None \n", "\n", - " user_agent ... parent_id systems subsystems \\\n", - "0 LOVE ... None None None \n", - "1 LOVE ... None None None \n", - "2 LOVE ... af0157e3-d7f0-4068-9a8a-e51a0a77d260 None None \n", - "3 LOVE ... 99de2a12-20eb-45ae-b189-a793b63e6ab5 None None \n", - "4 LOVE ... None None None \n", - ".. ... ... ... ... ... \n", - "994 LOVE ... None None None \n", - "995 LOVE ... None None None \n", - "996 LOVE ... None None None \n", - "997 LOVE ... None None None \n", - "998 LOVE ... None None None \n", + " subsystems cscs date_end components \\\n", + "0 None None 2024-03-20T04:15:26.769000 [AuxTel] \n", + "1 None None 2024-04-24T20:53:41.843000 [MainTel] \n", + "2 None None 2024-06-19T01:59:08.706000 [AuxTel] \n", + "3 None None 2024-08-21T04:04:38.053000 [AuxTel] \n", + "4 None None 2023-11-21T19:51:54.868000 [MainTel] \n", + "... ... ... ... ... \n", + "7668 None None 2024-04-19T19:06:54.594000 [MainTel] \n", + "7669 None None 2024-03-21T01:03:51.861000 [MainTel] \n", + "7670 None None 2024-06-12T01:55:35.836000 [AuxTel] \n", + "7671 None None 2024-03-04T03:19:22.793000 [MainTel] \n", + "7672 None None 2024-01-03T19:45:18.279000 [MainTel] \n", "\n", - " cscs date_end components primary_software_components \\\n", - "0 None 2024-03-20T04:15:26.769000 [AuxTel] [None] \n", - "1 None 2024-04-24T20:53:41.843000 [MainTel] [None] \n", - "2 None 2024-06-19T01:59:08.706000 [AuxTel] [None] \n", - "3 None 2024-08-21T04:04:38.053000 [AuxTel] [None] \n", - "4 None 2023-11-21T19:51:54.868000 [MainTel] [None] \n", - ".. ... ... ... ... \n", - "994 None 2023-11-16T02:56:30.009000 [MainTel] [None] \n", - "995 None 2024-04-19T23:27:02.011000 [MainTel] [None] \n", - "996 None 2024-01-05T20:15:27.453000 [MainTel] [None] \n", - "997 None 2024-07-15T19:39:38.630000 [AuxTel] [None] \n", - "998 None 2024-02-21T16:10:28.176000 [MainTel] [None] \n", + " primary_software_components primary_hardware_components category \\\n", + "0 [None] [None] None \n", + "1 [None] [None] None \n", + "2 [None] [None] None \n", + "3 [None] [None] None \n", + "4 [None] [None] None \n", + "... ... ... ... \n", + "7668 [None] [None] None \n", + "7669 [None] [None] None \n", + "7670 [None] [None] None \n", + "7671 [None] [None] None \n", + "7672 [None] [None] None \n", "\n", - " primary_hardware_components category time_lost_type \n", - "0 [None] None fault \n", - "1 [None] None fault \n", - "2 [None] None fault \n", - "3 [None] None fault \n", - "4 [None] None fault \n", - ".. ... ... ... \n", - "994 [None] None fault \n", - "995 [None] None fault \n", - "996 [None] None fault \n", - "997 [None] None fault \n", - "998 [None] None fault \n", + " time_lost_type \n", + "0 fault \n", + "1 fault \n", + "2 fault \n", + "3 fault \n", + "4 fault \n", + "... ... \n", + "7668 fault \n", + "7669 fault \n", + "7670 fault \n", + "7671 fault \n", + "7672 fault \n", "\n", - "[999 rows x 24 columns]" + "[7673 rows x 24 columns]" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -954,10 +1094,187 @@ "df" ] }, + { + "cell_type": "markdown", + "id": "bd56e1ab-ff5f-4416-9f3b-c690d5cc3adf", + "metadata": {}, + "source": [ + "\n", + "## Plots from log" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a74d281f-952d-42d3-bf35-949a17000b49", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = [r['date_added'] for r in recs]\n", + "y = [r['time_lost'] for r in recs]\n", + "plt.plot(x, y) \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6855a63f-7837-4901-8db1-f9d659a28101", + "metadata": {}, + "source": [ + "\n", + "## Raw Content Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "1b9711f5-2f32-4531-bf41-b6083983ed98", + "metadata": {}, + "source": [ + "### Example of one record" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "0720e2cc-d68c-4830-92c1-74ae5180f057", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'id': '0005d0e0-6de7-4857-b658-cfca7147374a',\n", + " 'site_id': 'summit',\n", + " 'message_text': 'The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r\\nwe try the parameter with uppercase now\\r\\n\\r\\n\\r\\n open: False\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nError in run\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 500, in wait_for\\r\\n return fut.result()\\r\\n ^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 239, in _get_next_ackcmd\\r\\n await self._next_ack_event.wait()\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", line 213, in wait\\r\\n await fut\\r\\nasyncio.exceptions.CancelledError\\r\\n\\r\\n\\r\\nThe above exception was the direct cause of the following exception:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 189, in next_ackcmd\\r\\n ackcmd = await self._wait_task\\r\\n ^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 214, in _basic_next_ackcmd\\r\\n ackcmd = await asyncio.wait_for(\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 502, in wait_for\\r\\n raise exceptions.TimeoutError() from exc\\r\\nTimeoutError\\r\\n\\r\\n\\r\\nDuring handling of the above exception, another exception occurred:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", line 603, in do_run\\r\\n await self._run_task\\r\\n File \"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", line 170, in run\\r\\n await getattr(self.remote, f\"cmd_{self.cmd}\").start(\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\\r\\n return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 205, in next_ackcmd\\r\\n raise base.AckTimeoutError(\\r\\nlsst.ts.salobj.base.AckTimeoutError: msg=\\'Timed out waiting for command acknowledgement\\', ackcmd=(ackcmd private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: -301>, error=0, result=\\'No command acknowledgement seen\\')\\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-03-20T04:15:26.769000',\n", + " 'user_id': 'cmorales@summit-lsp.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-03-20T04:16:06.976595',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-03-20T04:15:26.769000',\n", + " 'components': ['AuxTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rec = recs[0]\n", + "rec" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "82392f54-524e-4890-a2f8-ce0579a75e1c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The moveShutterMainDoor command Fail\n", + "\n", + "\n", + "we try the parameter with uppercase now\n", + "\n", + "\n", + " open: False\n", + "\n", + "\n", + "\n", + "\n", + "Error in run\n", + "Traceback (most recent call last):\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 500, in wait_for\n", + " return fut.result()\n", + " ^^^^^^^^^^^^\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 239, in _get_next_ackcmd\n", + " await self._next_ack_event.wait()\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", line 213, in wait\n", + " await fut\n", + "asyncio.exceptions.CancelledError\n", + "\n", + "\n", + "The above exception was the direct cause of the following exception:\n", + "\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 189, in next_ackcmd\n", + " ackcmd = await self._wait_task\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 214, in _basic_next_ackcmd\n", + " ackcmd = await asyncio.wait_for(\n", + " ^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 502, in wait_for\n", + " raise exceptions.TimeoutError() from exc\n", + "TimeoutError\n", + "\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", line 603, in do_run\n", + " await self._run_task\n", + " File \"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", line 170, in run\n", + " await getattr(self.remote, f\"cmd_{self.cmd}\").start(\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\n", + " return await cmd_info.next_ackcmd(timeout=timeout)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 205, in next_ackcmd\n", + " raise base.AckTimeoutError(\n", + "lsst.ts.salobj.base.AckTimeoutError: msg='Timed out waiting for command acknowledgement', ackcmd=(ackcmd private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: -301>, error=0, result='No command acknowledgement seen')\n", + "\n" + ] + } + ], + "source": [ + "msg = rec[\"message_text\"]\n", + "print(msg)" + ] + }, + { + "cell_type": "markdown", + "id": "3a938226-c21e-4e52-be30-b11148e8e379", + "metadata": {}, + "source": [ + "\n", + "## Stakeholder Elicitation" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "d8cefdd9-98ec-4383-a297-6853be7d0c9b", + "id": "138e5496-e058-417a-881e-8450e20af0f9", "metadata": {}, "outputs": [], "source": [] From d50bb6df0ea44af15473a052eeccce7d52ab3398 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Tue, 27 Aug 2024 08:58:56 -0700 Subject: [PATCH 04/17] WIP --- notebooks_tsqr/logrep_proto_1.ipynb | 1059 ++------------------------- 1 file changed, 53 insertions(+), 1006 deletions(-) diff --git a/notebooks_tsqr/logrep_proto_1.ipynb b/notebooks_tsqr/logrep_proto_1.ipynb index d9b2ff2..0bd42a0 100644 --- a/notebooks_tsqr/logrep_proto_1.ipynb +++ b/notebooks_tsqr/logrep_proto_1.ipynb @@ -2,8 +2,8 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "id": "e5b65509-9611-4493-8916-77a4c37489f0", + "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -16,7 +16,7 @@ }, { "cell_type": "markdown", - "id": "09757010-6091-4769-b940-efd464c5eb68", + "id": "1", "metadata": {}, "source": [ "\n", @@ -25,8 +25,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "c2017a15-e054-4a4e-a522-28deff6d2a7a", + "execution_count": null, + "id": "2", "metadata": { "jupyter": { "source_hidden": true @@ -46,25 +46,14 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "2a310c90-7c5a-4cc2-a3b2-cc9d8291d245", + "execution_count": null, + "id": "3", "metadata": { "jupyter": { "source_hidden": true } }, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://usdf-rsp-dev.slac.stanford.edu/narrativelog'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "log = log_name\n", "limit = int(record_limit)\n", @@ -92,7 +81,7 @@ }, { "cell_type": "markdown", - "id": "e926c1a6-cd11-4cc1-9fb5-55a5f4d386c0", + "id": "4", "metadata": { "jp-MarkdownHeadingCollapsed": true }, @@ -103,8 +92,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "8fdfc281-17db-471a-873e-94e6b41c6f70", + "execution_count": null, + "id": "5", "metadata": { "jupyter": { "source_hidden": true @@ -135,10 +124,8 @@ }, { "cell_type": "markdown", - "id": "1695642e-4d47-4ae9-9311-c77a7312ad22", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, + "id": "6", + "metadata": {}, "source": [ "\n", "## Get Records" @@ -146,20 +133,17 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "8481932e-6b4f-4eeb-98e2-18728c43351e", + "execution_count": null, + "id": "7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/narrativelog/messages?is_human=either&is_valid=either&limit=9999'\n", - "Retrieved 7673 records, each with numf=24 fields.\n" - ] - } - ], + "outputs": [], "source": [ + "# TODO Often fails on first request. Find out why!\n", + "try:\n", + " response = requests.get(url, timeout=timeout)\n", + "except:\n", + " pass \n", + " \n", "try:\n", " print(f'Attempt to get logs from {url=}')\n", " response = requests.get(url, timeout=timeout)\n", @@ -181,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "6069eef2-0585-4e67-9527-42ec5dc12cbf", + "id": "8", "metadata": {}, "source": [ "\n", @@ -190,7 +174,7 @@ }, { "cell_type": "markdown", - "id": "97d5d456-e2b4-4dd6-b0c7-2d95870d8481", + "id": "9", "metadata": {}, "source": [ "### Fields names provided in records from log." @@ -198,175 +182,17 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "d7fedb0b-02fc-4843-8607-cf593ea3fb91", + "execution_count": null, + "id": "10", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Field Name
0tags
1primary_software_components
2time_lost
3time_lost_type
4date_invalidated
5id
6site_id
7date_begin
8components
9date_added
10subsystems
11is_human
12user_id
13category
14cscs
15primary_hardware_components
16parent_id
17systems
18date_end
19message_text
20level
21is_valid
22urls
23user_agent
\n", - "
" - ], - "text/plain": [ - " Field Name\n", - "0 tags\n", - "1 primary_software_components\n", - "2 time_lost\n", - "3 time_lost_type\n", - "4 date_invalidated\n", - "5 id\n", - "6 site_id\n", - "7 date_begin\n", - "8 components\n", - "9 date_added\n", - "10 subsystems\n", - "11 is_human\n", - "12 user_id\n", - "13 category\n", - "14 cscs\n", - "15 primary_hardware_components\n", - "16 parent_id\n", - "17 systems\n", - "18 date_end\n", - "19 message_text\n", - "20 level\n", - "21 is_valid\n", - "22 urls\n", - "23 user_agent" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.DataFrame(flds, columns=['Field Name'])" ] }, { "cell_type": "markdown", - "id": "51c9a1db-4b38-4f35-bece-c4038ee5b9a5", + "id": "11", "metadata": {}, "source": [ "### Facets from log records.\n", @@ -375,148 +201,17 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "545abf79-808b-4716-b9e2-c5426a86b277", + "execution_count": null, + "id": "12", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
012
is_humanTrueNoneNone
site_idsummitNoneNone
categorySCIENCENoneENG
primary_software_componentsNoneNoneNone
level1000None
is_validTrueFalseNone
cscsNoneNoneNone
componentsNoneNoneNone
primary_hardware_componentsNoneNoneNone
user_agentLOVEstringNone
subsystemsNoneNoneNone
systemsNoneNoneNone
time_lost_typefaultNoneweather
\n", - "
" - ], - "text/plain": [ - " 0 1 2\n", - "is_human True None None\n", - "site_id summit None None\n", - "category SCIENCE None ENG\n", - "primary_software_components None None None\n", - "level 100 0 None\n", - "is_valid True False None\n", - "cscs None None None\n", - "components None None None\n", - "primary_hardware_components None None None\n", - "user_agent LOVE string None\n", - "subsystems None None None\n", - "systems None None None\n", - "time_lost_type fault None weather" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.DataFrame.from_dict(facets, orient='index')" ] }, { "cell_type": "markdown", - "id": "21afc757-8890-4b96-afc9-e5086327df55", + "id": "13", "metadata": {}, "source": [ "### Table of selected log record fields.\n", @@ -525,137 +220,10 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "1c40de6e-91c3-4d9d-972c-efe15d2b4a17", + "execution_count": null, + "id": "14", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table available as CSV file: \n" - ] - }, - { - "data": { - "text/html": [ - "tl.csv
" - ], - "text/plain": [ - "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
date_addedtime_lost
02024-03-20T04:16:06.9765950.0
12024-04-24T20:54:19.3466460.0
22024-06-19T01:59:58.7013430.0
32024-08-21T04:22:26.2326530.0
42023-11-21T19:55:36.7871050.0
.........
76682024-04-19T19:07:32.7557340.0
76692024-03-21T01:04:28.8834940.0
76702024-06-12T01:56:12.8967180.0
76712024-03-04T03:20:00.1513480.0
76722024-01-03T22:42:08.4630060.0
\n", - "

7673 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " date_added time_lost\n", - "0 2024-03-20T04:16:06.976595 0.0\n", - "1 2024-04-24T20:54:19.346646 0.0\n", - "2 2024-06-19T01:59:58.701343 0.0\n", - "3 2024-08-21T04:22:26.232653 0.0\n", - "4 2023-11-21T19:55:36.787105 0.0\n", - "... ... ...\n", - "7668 2024-04-19T19:07:32.755734 0.0\n", - "7669 2024-03-21T01:04:28.883494 0.0\n", - "7670 2024-06-12T01:56:12.896718 0.0\n", - "7671 2024-03-04T03:20:00.151348 0.0\n", - "7672 2024-01-03T22:42:08.463006 0.0\n", - "\n", - "[7673 rows x 2 columns]" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cols = ['date_added', 'time_lost']\n", "df = pd.DataFrame(recs)[cols]\n", @@ -671,424 +239,10 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "f6441d81-93a8-4369-93fb-55d3715783cc", + "execution_count": null, + "id": "15", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idsite_idmessage_textleveltagsurlstime_lostdate_beginuser_iduser_agent...parent_idsystemssubsystemscscsdate_endcomponentsprimary_software_componentsprimary_hardware_componentscategorytime_lost_type
00005d0e0-6de7-4857-b658-cfca7147374asummitThe moveShutterMainDoor command Fail\\r\\n\\r\\n\\r...0[][]0.02024-03-20T04:15:26.769000cmorales@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-03-20T04:15:26.769000[AuxTel][None][None]Nonefault
100067b6a-1741-41f3-87af-57261dff30acsummitDavid updated environment. But no need to cycl...0[][]0.02024-04-24T20:53:41.843000ykang@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-04-24T20:53:41.843000[MainTel][None][None]Nonefault
2000a3ba8-b1a9-4b04-9c4a-263da3dac1d1summitRuning BLOCK-T22 AuxTel filter Scans, the auxt...0[][]0.02024-06-19T01:59:08.706000cmd_user@summit-lsp.lsst.codesLOVE...af0157e3-d7f0-4068-9a8a-e51a0a77d260NoneNoneNone2024-06-19T01:59:08.706000[AuxTel][None][None]Nonefault
30010e246-8039-4741-b4c6-54047e9464c5summitStill checking updates in the wavefront estima...0[][]0.02024-08-21T04:04:38.053000kpena@summit-lsp.lsst.codesLOVE...99de2a12-20eb-45ae-b189-a793b63e6ab5NoneNoneNone2024-08-21T04:04:38.053000[AuxTel][None][None]Nonefault
40017b90e-26aa-4a7c-8186-fc06ac9b5aa6summitThe m1m3 ump test failed for actuator 108. \\r\\...0[][]0.02023-11-21T19:51:54.868000bquint@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2023-11-21T19:51:54.868000[MainTel][None][None]Nonefault
..................................................................
7668ffbd086c-cf20-4c45-aef5-b2783d348192summitScript Failed salIndex: 101647 with move_rotat...0[][]0.02024-04-19T19:06:54.594000ykang@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-04-19T19:06:54.594000[MainTel][None][None]Nonefault
7669ffeaada0-3b08-4de2-b48b-9acf2623fb7esummitsalIndex:&nbsp;101588\\r\\n \\r\\nError in run\\r\\n...0[][]0.02024-03-21T01:03:51.861000pvenegas@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2024-03-21T01:03:51.861000[MainTel][None][None]Nonefault
7670ffebf6c9-156c-4309-9662-f5697907cc47summith3. Execution of power_on_atcalsys.py \\r\\n0[][]0.02024-06-12T01:55:35.836000pvenegas@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-06-12T01:55:35.836000[AuxTel][None][None]Nonefault
7671fff11764-aae1-4428-aea0-b72fdb3dafa6summitUpdated pointing model based on March 2 data. ...0[][]0.02024-03-04T03:19:22.793000bstalder@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-03-04T03:19:22.793000[MainTel][None][None]Nonefault
7672fff14a30-c341-4561-a2ea-0f043d19f526summitM1M3 faulted HP 2 excessive forces\\r\\n0[][]0.02024-01-03T19:45:18.279000bstalder@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2024-01-03T19:45:18.279000[MainTel][None][None]Nonefault
\n", - "

7673 rows × 24 columns

\n", - "
" - ], - "text/plain": [ - " id site_id \\\n", - "0 0005d0e0-6de7-4857-b658-cfca7147374a summit \n", - "1 00067b6a-1741-41f3-87af-57261dff30ac summit \n", - "2 000a3ba8-b1a9-4b04-9c4a-263da3dac1d1 summit \n", - "3 0010e246-8039-4741-b4c6-54047e9464c5 summit \n", - "4 0017b90e-26aa-4a7c-8186-fc06ac9b5aa6 summit \n", - "... ... ... \n", - "7668 ffbd086c-cf20-4c45-aef5-b2783d348192 summit \n", - "7669 ffeaada0-3b08-4de2-b48b-9acf2623fb7e summit \n", - "7670 ffebf6c9-156c-4309-9662-f5697907cc47 summit \n", - "7671 fff11764-aae1-4428-aea0-b72fdb3dafa6 summit \n", - "7672 fff14a30-c341-4561-a2ea-0f043d19f526 summit \n", - "\n", - " message_text level tags urls \\\n", - "0 The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r... 0 [] [] \n", - "1 David updated environment. But no need to cycl... 0 [] [] \n", - "2 Runing BLOCK-T22 AuxTel filter Scans, the auxt... 0 [] [] \n", - "3 Still checking updates in the wavefront estima... 0 [] [] \n", - "4 The m1m3 ump test failed for actuator 108. \\r\\... 0 [] [] \n", - "... ... ... ... ... \n", - "7668 Script Failed salIndex: 101647 with move_rotat... 0 [] [] \n", - "7669 salIndex: 101588\\r\\n \\r\\nError in run\\r\\n... 0 [] [] \n", - "7670 h3. Execution of power_on_atcalsys.py \\r\\n 0 [] [] \n", - "7671 Updated pointing model based on March 2 data. ... 0 [] [] \n", - "7672 M1M3 faulted HP 2 excessive forces\\r\\n 0 [] [] \n", - "\n", - " time_lost date_begin user_id \\\n", - "0 0.0 2024-03-20T04:15:26.769000 cmorales@summit-lsp.lsst.codes \n", - "1 0.0 2024-04-24T20:53:41.843000 ykang@summit-lsp.lsst.codes \n", - "2 0.0 2024-06-19T01:59:08.706000 cmd_user@summit-lsp.lsst.codes \n", - "3 0.0 2024-08-21T04:04:38.053000 kpena@summit-lsp.lsst.codes \n", - "4 0.0 2023-11-21T19:51:54.868000 bquint@love01.cp.lsst.org \n", - "... ... ... ... \n", - "7668 0.0 2024-04-19T19:06:54.594000 ykang@summit-lsp.lsst.codes \n", - "7669 0.0 2024-03-21T01:03:51.861000 pvenegas@love01.cp.lsst.org \n", - "7670 0.0 2024-06-12T01:55:35.836000 pvenegas@summit-lsp.lsst.codes \n", - "7671 0.0 2024-03-04T03:19:22.793000 bstalder@summit-lsp.lsst.codes \n", - "7672 0.0 2024-01-03T19:45:18.279000 bstalder@love01.cp.lsst.org \n", - "\n", - " user_agent ... parent_id systems \\\n", - "0 LOVE ... None None \n", - "1 LOVE ... None None \n", - "2 LOVE ... af0157e3-d7f0-4068-9a8a-e51a0a77d260 None \n", - "3 LOVE ... 99de2a12-20eb-45ae-b189-a793b63e6ab5 None \n", - "4 LOVE ... None None \n", - "... ... ... ... ... \n", - "7668 LOVE ... None None \n", - "7669 LOVE ... None None \n", - "7670 LOVE ... None None \n", - "7671 LOVE ... None None \n", - "7672 LOVE ... None None \n", - "\n", - " subsystems cscs date_end components \\\n", - "0 None None 2024-03-20T04:15:26.769000 [AuxTel] \n", - "1 None None 2024-04-24T20:53:41.843000 [MainTel] \n", - "2 None None 2024-06-19T01:59:08.706000 [AuxTel] \n", - "3 None None 2024-08-21T04:04:38.053000 [AuxTel] \n", - "4 None None 2023-11-21T19:51:54.868000 [MainTel] \n", - "... ... ... ... ... \n", - "7668 None None 2024-04-19T19:06:54.594000 [MainTel] \n", - "7669 None None 2024-03-21T01:03:51.861000 [MainTel] \n", - "7670 None None 2024-06-12T01:55:35.836000 [AuxTel] \n", - "7671 None None 2024-03-04T03:19:22.793000 [MainTel] \n", - "7672 None None 2024-01-03T19:45:18.279000 [MainTel] \n", - "\n", - " primary_software_components primary_hardware_components category \\\n", - "0 [None] [None] None \n", - "1 [None] [None] None \n", - "2 [None] [None] None \n", - "3 [None] [None] None \n", - "4 [None] [None] None \n", - "... ... ... ... \n", - "7668 [None] [None] None \n", - "7669 [None] [None] None \n", - "7670 [None] [None] None \n", - "7671 [None] [None] None \n", - "7672 [None] [None] None \n", - "\n", - " time_lost_type \n", - "0 fault \n", - "1 fault \n", - "2 fault \n", - "3 fault \n", - "4 fault \n", - "... ... \n", - "7668 fault \n", - "7669 fault \n", - "7670 fault \n", - "7671 fault \n", - "7672 fault \n", - "\n", - "[7673 rows x 24 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.DataFrame(recs)\n", "df" @@ -1096,7 +250,7 @@ }, { "cell_type": "markdown", - "id": "bd56e1ab-ff5f-4416-9f3b-c690d5cc3adf", + "id": "16", "metadata": {}, "source": [ "\n", @@ -1105,21 +259,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "a74d281f-952d-42d3-bf35-949a17000b49", + "execution_count": null, + "id": "17", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "x = [r['date_added'] for r in recs]\n", "y = [r['time_lost'] for r in recs]\n", @@ -1129,7 +272,7 @@ }, { "cell_type": "markdown", - "id": "6855a63f-7837-4901-8db1-f9d659a28101", + "id": "18", "metadata": {}, "source": [ "\n", @@ -1138,7 +281,7 @@ }, { "cell_type": "markdown", - "id": "1b9711f5-2f32-4531-bf41-b6083983ed98", + "id": "19", "metadata": {}, "source": [ "### Example of one record" @@ -1146,46 +289,10 @@ }, { "cell_type": "code", - "execution_count": 22, - "id": "0720e2cc-d68c-4830-92c1-74ae5180f057", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': '0005d0e0-6de7-4857-b658-cfca7147374a',\n", - " 'site_id': 'summit',\n", - " 'message_text': 'The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r\\nwe try the parameter with uppercase now\\r\\n\\r\\n\\r\\n open: False\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nError in run\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 500, in wait_for\\r\\n return fut.result()\\r\\n ^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 239, in _get_next_ackcmd\\r\\n await self._next_ack_event.wait()\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", line 213, in wait\\r\\n await fut\\r\\nasyncio.exceptions.CancelledError\\r\\n\\r\\n\\r\\nThe above exception was the direct cause of the following exception:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 189, in next_ackcmd\\r\\n ackcmd = await self._wait_task\\r\\n ^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 214, in _basic_next_ackcmd\\r\\n ackcmd = await asyncio.wait_for(\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 502, in wait_for\\r\\n raise exceptions.TimeoutError() from exc\\r\\nTimeoutError\\r\\n\\r\\n\\r\\nDuring handling of the above exception, another exception occurred:\\r\\n\\r\\n\\r\\nTraceback (most recent call last):\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", line 603, in do_run\\r\\n await self._run_task\\r\\n File \"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", line 170, in run\\r\\n await getattr(self.remote, f\"cmd_{self.cmd}\").start(\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\\r\\n return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 205, in next_ackcmd\\r\\n raise base.AckTimeoutError(\\r\\nlsst.ts.salobj.base.AckTimeoutError: msg=\\'Timed out waiting for command acknowledgement\\', ackcmd=(ackcmd private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: -301>, error=0, result=\\'No command acknowledgement seen\\')\\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-03-20T04:15:26.769000',\n", - " 'user_id': 'cmorales@summit-lsp.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-03-20T04:16:06.976595',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-03-20T04:15:26.769000',\n", - " 'components': ['AuxTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], "source": [ "rec = recs[0]\n", "rec" @@ -1193,70 +300,10 @@ }, { "cell_type": "code", - "execution_count": 26, - "id": "82392f54-524e-4890-a2f8-ce0579a75e1c", + "execution_count": null, + "id": "21", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The moveShutterMainDoor command Fail\n", - "\n", - "\n", - "we try the parameter with uppercase now\n", - "\n", - "\n", - " open: False\n", - "\n", - "\n", - "\n", - "\n", - "Error in run\n", - "Traceback (most recent call last):\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 500, in wait_for\n", - " return fut.result()\n", - " ^^^^^^^^^^^^\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 239, in _get_next_ackcmd\n", - " await self._next_ack_event.wait()\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", line 213, in wait\n", - " await fut\n", - "asyncio.exceptions.CancelledError\n", - "\n", - "\n", - "The above exception was the direct cause of the following exception:\n", - "\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 189, in next_ackcmd\n", - " ackcmd = await self._wait_task\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 214, in _basic_next_ackcmd\n", - " ackcmd = await asyncio.wait_for(\n", - " ^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", line 502, in wait_for\n", - " raise exceptions.TimeoutError() from exc\n", - "TimeoutError\n", - "\n", - "\n", - "During handling of the above exception, another exception occurred:\n", - "\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", line 603, in do_run\n", - " await self._run_task\n", - " File \"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", line 170, in run\n", - " await getattr(self.remote, f\"cmd_{self.cmd}\").start(\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 487, in start\n", - " return await cmd_info.next_ackcmd(timeout=timeout)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", line 205, in next_ackcmd\n", - " raise base.AckTimeoutError(\n", - "lsst.ts.salobj.base.AckTimeoutError: msg='Timed out waiting for command acknowledgement', ackcmd=(ackcmd private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: -301>, error=0, result='No command acknowledgement seen')\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "msg = rec[\"message_text\"]\n", "print(msg)" @@ -1264,7 +311,7 @@ }, { "cell_type": "markdown", - "id": "3a938226-c21e-4e52-be30-b11148e8e379", + "id": "22", "metadata": {}, "source": [ "\n", @@ -1274,7 +321,7 @@ { "cell_type": "code", "execution_count": null, - "id": "138e5496-e058-417a-881e-8450e20af0f9", + "id": "23", "metadata": {}, "outputs": [], "source": [] From 709d215e107ce417aadb11f3c0e5c4a5e10542d6 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Tue, 27 Aug 2024 09:07:35 -0700 Subject: [PATCH 05/17] WIP --- notebooks_for_times_square/README.md | 5 - .../logrep_proto_1.ipynb | 236 ------------------ .../logrep_proto_1.yaml | 24 -- notebooks_for_times_square/requirements.txt | 6 - notebooks_for_times_square/scaffolding.org | 71 ------ 5 files changed, 342 deletions(-) delete mode 100644 notebooks_for_times_square/README.md delete mode 100644 notebooks_for_times_square/logrep_proto_1.ipynb delete mode 100644 notebooks_for_times_square/logrep_proto_1.yaml delete mode 100644 notebooks_for_times_square/requirements.txt delete mode 100644 notebooks_for_times_square/scaffolding.org diff --git a/notebooks_for_times_square/README.md b/notebooks_for_times_square/README.md deleted file mode 100644 index 3efda5a..0000000 --- a/notebooks_for_times_square/README.md +++ /dev/null @@ -1,5 +0,0 @@ -Times Square notebooks for (potential) use in project-wide Logging & Reporting - -See [offical -documentation](https://rsp.lsst.io/v/usdfdev/guides/times-square/index.html) -on creating notebooks for use by Times Square. diff --git a/notebooks_for_times_square/logrep_proto_1.ipynb b/notebooks_for_times_square/logrep_proto_1.ipynb deleted file mode 100644 index ff93343..0000000 --- a/notebooks_for_times_square/logrep_proto_1.ipynb +++ /dev/null @@ -1,236 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "0", - "metadata": {}, - "outputs": [], - "source": [ - "# Parameters. Set defaults here.\n", - "# Times Square replaces this cell with the user's parameters.\n", - "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", - "log_name = 'narrativelog'\n", - "record_limit = '999'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": {}, - "outputs": [], - "source": [ - "# Only use packages available in the Rubin Science Platform\n", - "import requests\n", - "from collections import defaultdict\n", - "import pandas as pd\n", - "from pprint import pp\n", - "from urllib.parse import urlencode\n", - "from IPython.display import FileLink\n", - "from matplotlib import pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "log = log_name\n", - "limit = int(record_limit)\n", - "response_timeout = 3.05 # seconds, how long to wait for connection\n", - "read_timeout = 20 # seconds\n", - "\n", - "timeout = (float(response_timeout), float(read_timeout))\n", - "\n", - "# Env list comes from drop-down menu top of:\n", - "# https://rsp.lsst.io/v/usdfdev/guides/times-square/\n", - "envs = dict(\n", - " #rubin_usdf_dev = '',\n", - " #data_lsst_cloud = '',\n", - " #usdf = '',\n", - " #base_data_facility = '',\n", - " summit = 'https://summit-lsp.lsst.codes',\n", - " usdf_dev = 'https://usdf-rsp-dev.slac.stanford.edu',\n", - " #rubin_idf_int = '',\n", - " tucson = 'https://tucson-teststand.lsst.codes',\n", - ")\n", - "server = envs[env]\n", - "server" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "recs = None\n", - "ok = True\n", - "\n", - "# is_human=either&is_valid=either&offset=0&limit=50' \n", - "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", - "# tags=love&exclude_tags=ignore_message\n", - "qparams = dict(is_human='either',\n", - " is_valid='either',\n", - " limit=limit,\n", - " )\n", - "qstr = urlencode(qparams)\n", - "url = f'{server}/{log}/messages?{qstr}'\n", - "print(f'\\nAttempt to get logs from {url=}')\n", - "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", - " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", - " 'date_invalidated', 'date_begin', 'date_end',\n", - " 'time_lost', # float\n", - " #'systems','subsystems','cscs', # values are lists, special handling\n", - " ])\n", - "try:\n", - " response = requests.get(url, timeout=timeout)\n", - " response.raise_for_status()\n", - " recs = response.json()\n", - " flds = set(recs[0].keys())\n", - " facflds = flds - ignore_fields\n", - " # facets(field) = set(value-1, value-2, ...)\n", - " facets = {fld: set([str(r[fld])\n", - " for r in recs if not isinstance(r[fld], list)]) \n", - " for fld in facflds}\n", - "except Exception as err:\n", - " ok = False\n", - " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", - "numf = len(flds) if ok else 0\n", - "numr = len(recs) if ok else 0\n", - "print(f'{numr=} {numf=}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "flds" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "facets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "recs[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [ - "cols = ['date_added', 'time_lost']\n", - "df = pd.DataFrame(recs)[cols]\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [ - "# Allow download of CSV version of DataFrame\n", - "csvfile = 'tl.csv'\n", - "df.to_csv(csvfile)\n", - "myfile = FileLink(csvfile)\n", - "display(myfile)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9", - "metadata": {}, - "outputs": [], - "source": [ - "x = [r['date_added'] for r in recs]\n", - "y = [r['time_lost'] for r in recs]\n", - "plt.plot(x, y) \n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "11", - "metadata": {}, - "outputs": [], - "source": [ - "recs[:4]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12", - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.DataFrame(recs)\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "13", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks_for_times_square/logrep_proto_1.yaml b/notebooks_for_times_square/logrep_proto_1.yaml deleted file mode 100644 index a7e82ac..0000000 --- a/notebooks_for_times_square/logrep_proto_1.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# For use with a Times Square notebook -title: Logging and Reporting -description: Prototype 1 -authors: - - name: Steve Pothier - slack: Steve Pothier -tags: - - reporting - - prototype -parameters: - env: - type: string - description: "tucson | usdf_dev | summit" - default: "tucson" - log: - type: string - description: "The log name: narrativelog | exposurelog" - default: narrativelog - record_limit: - type: integer - description: Max number of records to output - default: 99 - minimum: 1 - maximum: 9999 diff --git a/notebooks_for_times_square/requirements.txt b/notebooks_for_times_square/requirements.txt deleted file mode 100644 index 5ab865b..0000000 --- a/notebooks_for_times_square/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -requests -# jupyter-lab --ip=0.0.0.0 -jupyterlab # =3.1.17 -pandas -matplotlib -#numpy diff --git a/notebooks_for_times_square/scaffolding.org b/notebooks_for_times_square/scaffolding.org deleted file mode 100644 index 6c1c85a..0000000 --- a/notebooks_for_times_square/scaffolding.org +++ /dev/null @@ -1,71 +0,0 @@ -# Scaffolding for Times Square notebooks (thread-1) -* Parameters -- Parameters available to user via Times Square side panel. - -- A schema for these is given in .yaml in same directory. - -- The defaults given here must all be string values. Convert those to - other types in a subsequent cell - -- Include parameters that affect filtering (query) used in Source API - -- Consider common parameters such as: - + record_limit - + num_recs_in_example - + min_date - + max_date - - - -: # Parameters. Set defaults here. -: # Times Square replaces this cell with the user's parameters - - -* Imports and General Setup -- Setup includes conversion of parameter values to usable values -- Get "environment" (server host). e.g. https://usdf-rsp-dev.slac.stanford.edu -- Included non-user parameters: - + timeout - + env - -* Setup Source -- Choose fields of interest. The records (list of dict) in each field - we need in any way. All other fields could be deleted for our - purposes. - -- Choose fields to use for extracting facets. - -- Create full API URL (including query string) from parameters, etc. - -- Choose fields to display to user in table. ~table_fields~ -- Choose fields to display to user in plot. ~(x,y)~ - -* Get Records -- Usually use python "requests" package for accessing API - But, some APIs might have their own client. - -- Use try/except around requests.get() or requests.post() - User friendly error if exception (cannot connect, etc) - User friend error if get non-200 response status. - -- Get list field names from rec[0] - -- Calc facet over selected field names. - -* Table of (mostly raw) results -- Display pandas table of all records using - : df = pd.DataFrame(recs)[table_fields] - -* Plot of results -- Display minimum useful (?!) plot from this Source - Example: - : plt.plot([r['date'] for r in recs], [r['time_lost'] for r in recs]) - : plt.show() - -* Output raw content analysis (rec, fields, facets) -** Example records -** Fields found -** Facets of selected Fields -* Stakeholder Elicitation -- Source specific questions to stakeholders. - Link to Confluence doc (form?) for L&R stakeholder feeback From 40c4c15aaaf48031b9ef5b2e78483e4afad3bd6b Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Tue, 27 Aug 2024 09:12:10 -0700 Subject: [PATCH 06/17] WIP --- notebooks_tsqr/logrep_proto_1.ipynb | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/notebooks_tsqr/logrep_proto_1.ipynb b/notebooks_tsqr/logrep_proto_1.ipynb index 0bd42a0..de921b8 100644 --- a/notebooks_tsqr/logrep_proto_1.ipynb +++ b/notebooks_tsqr/logrep_proto_1.ipynb @@ -9,8 +9,6 @@ "source": [ "# Parameters. Set defaults here.\n", "# Times Square replaces this cell with the user's parameters.\n", - "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", - "log_name = 'narrativelog'\n", "record_limit = '999'" ] }, @@ -48,13 +46,11 @@ "cell_type": "code", "execution_count": null, "id": "3", - "metadata": { - "jupyter": { - "source_hidden": true - } - }, + "metadata": {}, "outputs": [], "source": [ + "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", + "log_name = 'narrativelog'\n", "log = log_name\n", "limit = int(record_limit)\n", "response_timeout = 3.05 # seconds, how long to wait for connection\n", From cbd71b44ccdeec317cb77cd18861115b97c08088 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Tue, 27 Aug 2024 09:21:09 -0700 Subject: [PATCH 07/17] WIPO --- notebooks_tsqr/logrep_proto_1.ipynb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/notebooks_tsqr/logrep_proto_1.ipynb b/notebooks_tsqr/logrep_proto_1.ipynb index de921b8..b767518 100644 --- a/notebooks_tsqr/logrep_proto_1.ipynb +++ b/notebooks_tsqr/logrep_proto_1.ipynb @@ -78,9 +78,7 @@ { "cell_type": "markdown", "id": "4", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, + "metadata": {}, "source": [ "\n", "## Setup Source" From 0dc737cbd955f5d8f1888a92b8d13aec9a6aa6a6 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Tue, 27 Aug 2024 13:54:37 -0700 Subject: [PATCH 08/17] WIP --- notebooks_tsqr/SAVE_exposurelog.ipynb | 353 +++++++++++ notebooks_tsqr/SAVE_exposurelog.yaml | 16 + notebooks_tsqr/exposurelog.ipynb | 353 +++++++++++ notebooks_tsqr/exposurelog.yaml | 16 + notebooks_tsqr/logrep_all_env.ipynb | 804 ++++++++++++++++++++++++++ notebooks_tsqr/logrep_proto_1.ipynb | 6 +- notebooks_tsqr/narrativelog.ipynb | 345 +++++++++++ notebooks_tsqr/narrativelog.yaml | 16 + times-square.yaml | 1 + 9 files changed, 1905 insertions(+), 5 deletions(-) create mode 100644 notebooks_tsqr/SAVE_exposurelog.ipynb create mode 100644 notebooks_tsqr/SAVE_exposurelog.yaml create mode 100644 notebooks_tsqr/exposurelog.ipynb create mode 100644 notebooks_tsqr/exposurelog.yaml create mode 100644 notebooks_tsqr/logrep_all_env.ipynb create mode 100644 notebooks_tsqr/narrativelog.ipynb create mode 100644 notebooks_tsqr/narrativelog.yaml diff --git a/notebooks_tsqr/SAVE_exposurelog.ipynb b/notebooks_tsqr/SAVE_exposurelog.ipynb new file mode 100644 index 0000000..1daba58 --- /dev/null +++ b/notebooks_tsqr/SAVE_exposurelog.ipynb @@ -0,0 +1,353 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters. Set defaults here.\n", + "# Times Square replaces this cell with the user's parameters.\n", + "record_limit = '999'" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "\n", + "## Imports and General Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# Only use packages available in the Rubin Science Platform\n", + "import requests\n", + "from collections import defaultdict\n", + "import pandas as pd\n", + "from pprint import pp\n", + "from urllib.parse import urlencode\n", + "from IPython.display import FileLink\n", + "from matplotlib import pyplot as plt\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://tucson-teststand.lsst.codes/exposurelog'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "limit = int(record_limit)\n", + "\n", + "response_timeout = 3.05 # seconds, how long to wait for connection\n", + "read_timeout = 20 # seconds\n", + "timeout = (float(response_timeout), float(read_timeout))\n", + "\n", + "server = os.environ.get('EXTERNAL_INSTANCE_URL', \n", + " 'https://tucson-teststand.lsst.codes')\n", + "log = 'exposurelog'\n", + "service = f'{server}/{log}'\n", + "service" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "\n", + "## Setup Source" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "recs = None\n", + "ok = True\n", + "\n", + "# is_human=either&is_valid=either&offset=0&limit=50' \n", + "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", + "# tags=love&exclude_tags=ignore_message\n", + "qparams = dict(is_human='either',\n", + " is_valid='either',\n", + " limit=limit,\n", + " )\n", + "qstr = urlencode(qparams)\n", + "url = f'{service}/messages?{qstr}'\n", + "\n", + "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", + " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", + " 'date_invalidated', 'date_begin', 'date_end',\n", + " 'time_lost', # float\n", + " #'systems','subsystems','cscs', # values are lists, special handling\n", + " ])" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "\n", + "## Get Records" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/exposurelog/messages?is_human=either&is_valid=either&limit=999'\n", + "Retrieved 0 records, each with numf=0 fields.\n" + ] + } + ], + "source": [ + "try:\n", + " print(f'Attempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " facflds = flds - ignore_fields\n", + " # facets(field) = set(value-1, value-2, ...)\n", + " facets = {fld: set([str(r[fld])\n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + "except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + "numf = len(flds) if ok else 0\n", + "numr = len(recs) if ok else 0\n", + "print(f'Retrieved {numr} records, each with {numf=} fields.')" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "\n", + "## Tables of (mostly raw) results" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "### Fields names provided in records from log." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(flds, columns=['Field Name'])" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "### Facets from log records.\n", + "A *facet* is the set all of values found for a field in the retrieved records. Facets are only calculated for some fields." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame.from_dict(facets, orient='index')" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "### Table of selected log record fields.\n", + "Table can be retrieved as CSV file for local use." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "cols = ['date_added', 'time_lost']\n", + "df = pd.DataFrame(recs)[cols]\n", + "\n", + "# Allow download of CSV version of DataFrame\n", + "csvfile = 'tl.csv'\n", + "df.to_csv(csvfile)\n", + "myfile = FileLink(csvfile)\n", + "print('Table available as CSV file: ')\n", + "display(myfile)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(recs)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "\n", + "## Plots from log" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "x = [r['date_added'] for r in recs]\n", + "y = [r['time_lost'] for r in recs]\n", + "plt.plot(x, y) \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "\n", + "## Raw Content Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "### Example of one record" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "rec = recs[0]\n", + "rec" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "msg = rec[\"message_text\"]\n", + "print(msg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b745aea-a46a-45e1-bdf2-def878182eb9", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "#EXTERNAL_INSTANCE_URL\n", + "with pd.option_context('display.max_rows', None,):\n", + " print(pd.DataFrame(os.environ))" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "\n", + "## Stakeholder Elicitation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks_tsqr/SAVE_exposurelog.yaml b/notebooks_tsqr/SAVE_exposurelog.yaml new file mode 100644 index 0000000..b6406cb --- /dev/null +++ b/notebooks_tsqr/SAVE_exposurelog.yaml @@ -0,0 +1,16 @@ +# For use with a Times Square notebook +title: Logging and Reporting: Narrative Log +description: Prototype 1 +authors: + - name: Steve Pothier + slack: Steve Pothier +tags: + - reporting + - prototype +parameters: + record_limit: + type: integer + description: Max number of records to output + default: 99 + minimum: 1 + maximum: 9999 diff --git a/notebooks_tsqr/exposurelog.ipynb b/notebooks_tsqr/exposurelog.ipynb new file mode 100644 index 0000000..1daba58 --- /dev/null +++ b/notebooks_tsqr/exposurelog.ipynb @@ -0,0 +1,353 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters. Set defaults here.\n", + "# Times Square replaces this cell with the user's parameters.\n", + "record_limit = '999'" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "\n", + "## Imports and General Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# Only use packages available in the Rubin Science Platform\n", + "import requests\n", + "from collections import defaultdict\n", + "import pandas as pd\n", + "from pprint import pp\n", + "from urllib.parse import urlencode\n", + "from IPython.display import FileLink\n", + "from matplotlib import pyplot as plt\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://tucson-teststand.lsst.codes/exposurelog'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "limit = int(record_limit)\n", + "\n", + "response_timeout = 3.05 # seconds, how long to wait for connection\n", + "read_timeout = 20 # seconds\n", + "timeout = (float(response_timeout), float(read_timeout))\n", + "\n", + "server = os.environ.get('EXTERNAL_INSTANCE_URL', \n", + " 'https://tucson-teststand.lsst.codes')\n", + "log = 'exposurelog'\n", + "service = f'{server}/{log}'\n", + "service" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "\n", + "## Setup Source" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "recs = None\n", + "ok = True\n", + "\n", + "# is_human=either&is_valid=either&offset=0&limit=50' \n", + "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", + "# tags=love&exclude_tags=ignore_message\n", + "qparams = dict(is_human='either',\n", + " is_valid='either',\n", + " limit=limit,\n", + " )\n", + "qstr = urlencode(qparams)\n", + "url = f'{service}/messages?{qstr}'\n", + "\n", + "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", + " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", + " 'date_invalidated', 'date_begin', 'date_end',\n", + " 'time_lost', # float\n", + " #'systems','subsystems','cscs', # values are lists, special handling\n", + " ])" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "\n", + "## Get Records" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/exposurelog/messages?is_human=either&is_valid=either&limit=999'\n", + "Retrieved 0 records, each with numf=0 fields.\n" + ] + } + ], + "source": [ + "try:\n", + " print(f'Attempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " facflds = flds - ignore_fields\n", + " # facets(field) = set(value-1, value-2, ...)\n", + " facets = {fld: set([str(r[fld])\n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + "except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + "numf = len(flds) if ok else 0\n", + "numr = len(recs) if ok else 0\n", + "print(f'Retrieved {numr} records, each with {numf=} fields.')" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "\n", + "## Tables of (mostly raw) results" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "### Fields names provided in records from log." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(flds, columns=['Field Name'])" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "### Facets from log records.\n", + "A *facet* is the set all of values found for a field in the retrieved records. Facets are only calculated for some fields." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame.from_dict(facets, orient='index')" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "### Table of selected log record fields.\n", + "Table can be retrieved as CSV file for local use." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "cols = ['date_added', 'time_lost']\n", + "df = pd.DataFrame(recs)[cols]\n", + "\n", + "# Allow download of CSV version of DataFrame\n", + "csvfile = 'tl.csv'\n", + "df.to_csv(csvfile)\n", + "myfile = FileLink(csvfile)\n", + "print('Table available as CSV file: ')\n", + "display(myfile)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(recs)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "\n", + "## Plots from log" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "x = [r['date_added'] for r in recs]\n", + "y = [r['time_lost'] for r in recs]\n", + "plt.plot(x, y) \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "\n", + "## Raw Content Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "### Example of one record" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "rec = recs[0]\n", + "rec" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "msg = rec[\"message_text\"]\n", + "print(msg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b745aea-a46a-45e1-bdf2-def878182eb9", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "#EXTERNAL_INSTANCE_URL\n", + "with pd.option_context('display.max_rows', None,):\n", + " print(pd.DataFrame(os.environ))" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "\n", + "## Stakeholder Elicitation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks_tsqr/exposurelog.yaml b/notebooks_tsqr/exposurelog.yaml new file mode 100644 index 0000000..b6406cb --- /dev/null +++ b/notebooks_tsqr/exposurelog.yaml @@ -0,0 +1,16 @@ +# For use with a Times Square notebook +title: Logging and Reporting: Narrative Log +description: Prototype 1 +authors: + - name: Steve Pothier + slack: Steve Pothier +tags: + - reporting + - prototype +parameters: + record_limit: + type: integer + description: Max number of records to output + default: 99 + minimum: 1 + maximum: 9999 diff --git a/notebooks_tsqr/logrep_all_env.ipynb b/notebooks_tsqr/logrep_all_env.ipynb new file mode 100644 index 0000000..3653ea6 --- /dev/null +++ b/notebooks_tsqr/logrep_all_env.ipynb @@ -0,0 +1,804 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "27d224c4-b9b2-43d6-bef4-76a0e17bf2b1", + "metadata": {}, + "source": [ + "# Logging and Reporting" + ] + }, + { + "cell_type": "markdown", + "id": "4e56da66-e40a-4ef2-93ba-fc288a2c60bd", + "metadata": {}, + "source": [ + "## Table of contents\n", + "* [Parameters](#params)\n", + "* [Imports and setup](#imports)\n", + "* [Try every server](#every-server)\n", + "* [Report](#report)" + ] + }, + { + "cell_type": "markdown", + "id": "9bab8290-360c-4784-ba92-f733701dac59", + "metadata": {}, + "source": [ + "\n", + "## Parameters\n", + "The first code cell must contain parameters with string values for compatibility with Times Square.\n", + "\n", + "See: https://rsp.lsst.io/v/usdfdev/guides/times-square/index.html" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b4278d59-484d-4adc-8f0b-fd2100d9dcdc", + "metadata": {}, + "outputs": [], + "source": [ + "#Parameters\n", + "env = 'tucson' # usdf-dev, tucson, slac, summit\n", + "record_limit = '9999'\n", + "response_timeout = '3.05' # seconds, how long to wait for connection\n", + "read_timeout = '20' # seconds" + ] + }, + { + "cell_type": "markdown", + "id": "1ba64706-2d9a-46b7-9b94-915dc669b7db", + "metadata": {}, + "source": [ + "\n", + "## Imports and General Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4368be95-2c7d-4111-8056-93237b8fa331", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "from collections import defaultdict\n", + "import pandas as pd\n", + "from pprint import pp" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9e701445-ff88-4b42-93e1-4d14452c8a78", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'summit': 'https://summit-lsp.lsst.codes',\n", + " 'usdf_dev': 'https://usdf-rsp-dev.slac.stanford.edu',\n", + " 'tucson': 'https://tucson-teststand.lsst.codes'}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "limit = int(record_limit)\n", + "timeout = (float(response_timeout), float(read_timeout))\n", + "\n", + "# Env list comes from drop-down menu top of:\n", + "# https://rsp.lsst.io/v/usdfdev/guides/times-square/\n", + "envs = dict(\n", + " #rubin_usdf_dev = '',\n", + " #data_lsst_cloud = '',\n", + " #usdf = '',\n", + " #base_data_facility = '',\n", + " summit = 'https://summit-lsp.lsst.codes',\n", + " usdf_dev = 'https://usdf-rsp-dev.slac.stanford.edu',\n", + " #rubin_idf_int = '',\n", + " tucson = 'https://tucson-teststand.lsst.codes',\n", + ")\n", + "envs" + ] + }, + { + "cell_type": "markdown", + "id": "d83d76bc-3169-45eb-bf7a-32ecf8d75563", + "metadata": {}, + "source": [ + "\n", + "## Try to access every Server, every Log in our list\n", + "We call the combination of a specific Server and specific Log a \"service\".\n", + "This is a First Look. As such, we don't try to get a useful list of records. \n", + "Instead, we save a few pieces of data from each service. A more tailored web-service call should be done to get useful records. For each service, we save:\n", + "1. The number of records retrieved\n", + "1. The list of fields found in a record (we assume all records from a service have the same fields)\n", + "1. An example of 1-2 records.\n", + "1. The [Facets](https://en.wikipedia.org/wiki/Faceted_search) of the service for all service fields that are not explictly excluded." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d2ee9226-ce4d-43ff-936a-4127c19466ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Attempt to get logs from url='https://summit-lsp.lsst.codes/exposurelog/messages?is_human=either&is_valid=either&limit=9999'\n", + "ERROR getting exposurelog from env='summit' using url='https://summit-lsp.lsst.codes/exposurelog/messages?is_human=either&is_valid=either&limit=9999': err=ConnectTimeout(MaxRetryError(\"HTTPSConnectionPool(host='summit-lsp.lsst.codes', port=443): Max retries exceeded with url: /exposurelog/messages?is_human=either&is_valid=either&limit=9999 (Caused by ConnectTimeoutError(, 'Connection to summit-lsp.lsst.codes timed out. (connect timeout=3.05)'))\"))\n", + "\n", + "\n", + "Attempt to get logs from url='https://summit-lsp.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=9999'\n", + "ERROR getting narrativelog from env='summit' using url='https://summit-lsp.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=9999': err=ConnectTimeout(MaxRetryError(\"HTTPSConnectionPool(host='summit-lsp.lsst.codes', port=443): Max retries exceeded with url: /narrativelog/messages?is_human=either&is_valid=either&limit=9999 (Caused by ConnectTimeoutError(, 'Connection to summit-lsp.lsst.codes timed out. (connect timeout=3.05)'))\"))\n", + "\n", + "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/exposurelog/messages?is_human=either&is_valid=either&limit=9999'\n", + "\n", + "\n", + "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/narrativelog/messages?is_human=either&is_valid=either&limit=9999'\n", + "\n", + "Attempt to get logs from url='https://tucson-teststand.lsst.codes/exposurelog/messages?is_human=either&is_valid=either&limit=9999'\n", + "\n", + "\n", + "Attempt to get logs from url='https://tucson-teststand.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=9999'\n" + ] + } + ], + "source": [ + "verbose=False\n", + "fields = defaultdict(set) # fields[(env,log)] = {field1, field2, ...}\n", + "examples = defaultdict(list) # examples[(env,log)] = [rec1, rec2]\n", + "results = defaultdict(dict) # results[(env,log)] = dict(server,url, ok, numfields, numrecs)\n", + "facets = defaultdict(dict) # facets[(env,log)] = dict(field) = set(value-1, value-2, ...)\n", + "\n", + "# Dumb! Using same ignore set for all LOGS.\n", + "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", + " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", + " 'date_invalidated', 'date_begin', 'date_end',\n", + " 'time_lost', # float\n", + " #'systems','subsystems','cscs', # values are lists, special handling\n", + " ])\n", + "for env,server in envs.items():\n", + " ok = True\n", + " try:\n", + " recs = None\n", + " log = 'exposurelog'\n", + " #!url = f'{server}/{log}/messages?is_human=either&is_valid=either&offset=0&{limit=}'\n", + " url = f'{server}/{log}/messages?is_human=either&is_valid=either&{limit=}'\n", + " print(f'\\nAttempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " if verbose:\n", + " print(f'Number of {log} records: {len(recs):,}')\n", + " print(f'Got {log} fields: {flds}')\n", + " print(f'Example record: {recs[0]}') \n", + " fields[(env,log)] = flds\n", + " examples[(env,log)] = recs[:2] \n", + "\n", + " facflds = flds - ignore_fields\n", + " # Fails when r[fld] is a LIST instead of singleton\n", + " # I think when that happens occasionaly, its a BUG in the data! It happens.\n", + " facets[(env,log)] = {fld: set([str(r[fld])\n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + " except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + " numf = len(flds) if ok else 0\n", + " numr = len(recs) if ok else 0\n", + " results[(env,log)] = dict(ok=ok, server=server, url=url,numfields=numf, numrecs=numr)\n", + "\n", + " print()\n", + " try:\n", + " recs = None\n", + " log = 'narrativelog'\n", + " #! url = f'{server}/{log}/messages?is_human=either&is_valid=true&offset=0&{limit=}'\n", + " url = f'{server}/{log}/messages?is_human=either&is_valid=either&{limit=}'\n", + " print(f'\\nAttempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " if verbose:\n", + " print(f'Number of {log} records: {len(recs):,}')\n", + " print(f'Got {log} fields: {flds}')\n", + " print(f'Example record: {recs[0]}')\n", + " fields[(env,log)] = flds \n", + " examples[(env,log)] = recs[:2] \n", + "\n", + " facflds = flds - ignore_fields\n", + " # Fails when r[fld] is a LIST instead of singleton\n", + " # I think when that happens occasionaly, its a BUG in the data! It happens.\n", + " # Look for BAD facet values like: {'None', None}\n", + " facets[(env,log)] = {fld: set([r[fld] \n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + " except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + " numf = len(flds) if ok else 0\n", + " numr = len(recs) if ok else 0\n", + " results[(env,log)] = dict(ok=ok, server=server, url=url,numfields=numf, numrecs=numr)" + ] + }, + { + "cell_type": "markdown", + "id": "c59da227-15e7-4f10-9509-405a9d1c230d", + "metadata": {}, + "source": [ + "\n", + "## Report\n", + "This is a silly report that may be useful for developers. Not so much for astronomers." + ] + }, + { + "cell_type": "markdown", + "id": "402a093d-4443-468f-85a4-b82ee6d3ab06", + "metadata": {}, + "source": [ + "\n", + "### Success/Failure table" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "147c066a-bc3a-4c0e-8499-eaa2f1ec9f4c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Got results from 4 of 6 env/logs\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
okservernumfieldsnumrecs
summitexposurelogFalsehttps://summit-lsp.lsst.codes00
narrativelogFalsehttps://summit-lsp.lsst.codes00
usdf_devexposurelogTruehttps://usdf-rsp-dev.slac.stanford.edu187895
narrativelogTruehttps://usdf-rsp-dev.slac.stanford.edu247597
tucsonexposurelogTruehttps://tucson-teststand.lsst.codes1820
narrativelogTruehttps://tucson-teststand.lsst.codes24110
\n", + "
" + ], + "text/plain": [ + " ok server \\\n", + "summit exposurelog False https://summit-lsp.lsst.codes \n", + " narrativelog False https://summit-lsp.lsst.codes \n", + "usdf_dev exposurelog True https://usdf-rsp-dev.slac.stanford.edu \n", + " narrativelog True https://usdf-rsp-dev.slac.stanford.edu \n", + "tucson exposurelog True https://tucson-teststand.lsst.codes \n", + " narrativelog True https://tucson-teststand.lsst.codes \n", + "\n", + " numfields numrecs \n", + "summit exposurelog 0 0 \n", + " narrativelog 0 0 \n", + "usdf_dev exposurelog 18 7895 \n", + " narrativelog 24 7597 \n", + "tucson exposurelog 18 20 \n", + " narrativelog 24 110 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "show_columns = ['ok', 'server', 'numfields', 'numrecs']\n", + "df = pd.DataFrame(data=dict(results)).T.loc[:,show_columns]\n", + "print(f'Got results from {df[\"ok\"].values.sum()} of {len(df)} env/logs')\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "f6ce4545-74d6-4551-b125-44c7c4021c19", + "metadata": {}, + "source": [ + "\n", + "### Field Names" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0abedbf3-5976-4713-b5ab-f953396dbcff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Field names for each Environment/Log source:\n", + "\n", + "usdf_dev/exposurelog: parent_id, instrument, obs_id, user_id, site_id, user_agent, is_human, date_added, message_text, level, tags, day_obs, exposure_flag, is_valid, seq_num, urls, date_invalidated, id\n", + "\n", + "usdf_dev/narrativelog: systems, date_end, message_text, primary_hardware_components, user_agent, site_id, is_human, cscs, category, is_valid, date_invalidated, time_lost_type, tags, urls, time_lost, components, date_begin, parent_id, subsystems, user_id, date_added, level, primary_software_components, id\n", + "\n", + "tucson/exposurelog: parent_id, instrument, obs_id, user_id, site_id, user_agent, is_human, date_added, message_text, level, tags, day_obs, exposure_flag, is_valid, seq_num, urls, date_invalidated, id\n", + "\n", + "tucson/narrativelog: systems, date_end, message_text, primary_hardware_components, user_agent, site_id, is_human, cscs, category, is_valid, date_invalidated, time_lost_type, tags, urls, time_lost, components, date_begin, parent_id, subsystems, user_id, date_added, level, primary_software_components, id\n" + ] + } + ], + "source": [ + "print('Field names for each Environment/Log source:')\n", + "for (env,log),flds in fields.items():\n", + " field_names = ', '.join(flds)\n", + " print(f'\\n{env}/{log}: {field_names}')\n", + "#!dict(fields)" + ] + }, + { + "cell_type": "markdown", + "id": "557803ba-3f59-432a-9d39-efca609a1f97", + "metadata": {}, + "source": [ + "\n", + "### Facets" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4d98ac00-6694-47e9-a53e-5c5dfef96948", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "usdf_dev/exposurelog:\n", + " instrument: \t{'LSSTComCam', 'LATISS'}\n", + " user_agent: \t{'notebook:nublado', 'LOVE'}\n", + " is_human: \t{'True'}\n", + " site_id: \t{'summit'}\n", + " level: \t{'20', '10'}\n", + " exposure_flag: \t{'junk', 'none', 'questionable'}\n", + " is_valid: \t{'False', 'True'}\n", + "usdf_dev/narrativelog:\n", + " subsystems: \t{None}\n", + " systems: \t{None}\n", + " user_agent: \t{'LOVE', 'string'}\n", + " is_human: \t{True}\n", + " site_id: \t{'summit'}\n", + " cscs: \t{None}\n", + " time_lost_type: \t{'weather', 'fault', None}\n", + " level: \t{0, 100}\n", + " primary_software_components: \t{None}\n", + " primary_hardware_components: \t{None}\n", + " category: \t{'None', 'SCIENCE', 'ENG', None}\n", + " is_valid: \t{False, True}\n", + " components: \t{None}\n", + "tucson/exposurelog:\n", + " instrument: \t{'LSSTComCam', 'LATISS'}\n", + " user_agent: \t{'LOVE'}\n", + " is_human: \t{'True'}\n", + " site_id: \t{'tucson'}\n", + " level: \t{'10'}\n", + " exposure_flag: \t{'junk', 'none', 'questionable'}\n", + " is_valid: \t{'False', 'True'}\n", + "tucson/narrativelog:\n", + " subsystems: \t{None}\n", + " systems: \t{None}\n", + " user_agent: \t{'LOVE', 'string'}\n", + " is_human: \t{False, True}\n", + " site_id: \t{'tucson'}\n", + " cscs: \t{None}\n", + " time_lost_type: \t{'fault', None}\n", + " level: \t{0, 100}\n", + " primary_software_components: \t{None}\n", + " primary_hardware_components: \t{None}\n", + " category: \t{'None', None}\n", + " is_valid: \t{False, True}\n", + " components: \t{None}\n" + ] + } + ], + "source": [ + "dict(facets)\n", + "for (env,log),flds in facets.items():\n", + " print(f'{env}/{log}:')\n", + " for fld,vals in flds.items():\n", + " print(f' {fld}: \\t{vals}')" + ] + }, + { + "cell_type": "markdown", + "id": "fb8c376d-13aa-4740-bd01-9c565b331bab", + "metadata": {}, + "source": [ + "\n", + "### Example Records" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a4a4725b-ff92-44f2-b6eb-13c52c14b5da", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "env='usdf_dev', log='exposurelog': \n", + " Example records: \n", + "[{'id': '0005ebfa-1832-4e53-bc7a-a69254deef88',\n", + " 'site_id': 'summit',\n", + " 'obs_id': 'AT_O_20230118_000113',\n", + " 'instrument': 'LATISS',\n", + " 'day_obs': 20230118,\n", + " 'seq_num': 113,\n", + " 'message_text': ' ',\n", + " 'level': 20,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'user_id': 'dsanmartim',\n", + " 'user_agent': 'notebook:nublado',\n", + " 'is_human': True,\n", + " 'is_valid': False,\n", + " 'exposure_flag': 'junk',\n", + " 'date_added': '2023-01-19T07:26:28.887152',\n", + " 'date_invalidated': '2023-01-19T07:32:32.435376',\n", + " 'parent_id': '18345e26-3c8c-4472-864f-68257ced64f4'},\n", + " {'id': '0007f3e6-ac70-4cf3-8edd-70d4a311aa4e',\n", + " 'site_id': 'summit',\n", + " 'obs_id': 'AT_O_20230118_000215',\n", + " 'instrument': 'LATISS',\n", + " 'day_obs': 20230118,\n", + " 'seq_num': 215,\n", + " 'message_text': '',\n", + " 'level': 20,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'user_id': 'dsanmartim',\n", + " 'user_agent': 'notebook:nublado',\n", + " 'is_human': True,\n", + " 'is_valid': False,\n", + " 'exposure_flag': 'none',\n", + " 'date_added': '2023-01-19T07:00:11.295541',\n", + " 'date_invalidated': '2023-01-19T07:32:03.334049',\n", + " 'parent_id': 'cde04ee9-01b3-4428-8e4a-09c5bb25a0e3'}]\n", + "\n", + "env='usdf_dev', log='narrativelog': \n", + " Example records: \n", + "[{'id': '0005d0e0-6de7-4857-b658-cfca7147374a',\n", + " 'site_id': 'summit',\n", + " 'message_text': 'The moveShutterMainDoor command Fail\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " 'we try the parameter with uppercase now\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " ' open: False\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " 'Error in run\\r\\n'\n", + " 'Traceback (most recent call last):\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", '\n", + " 'line 500, in wait_for\\r\\n'\n", + " ' return fut.result()\\r\\n'\n", + " ' ^^^^^^^^^^^^\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", + " 'line 239, in _get_next_ackcmd\\r\\n'\n", + " ' await self._next_ack_event.wait()\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", '\n", + " 'line 213, in wait\\r\\n'\n", + " ' await fut\\r\\n'\n", + " 'asyncio.exceptions.CancelledError\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " 'The above exception was the direct cause of the following '\n", + " 'exception:\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " 'Traceback (most recent call last):\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", + " 'line 189, in next_ackcmd\\r\\n'\n", + " ' ackcmd = await self._wait_task\\r\\n'\n", + " ' ^^^^^^^^^^^^^^^^^^^^^\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", + " 'line 214, in _basic_next_ackcmd\\r\\n'\n", + " ' ackcmd = await asyncio.wait_for(\\r\\n'\n", + " ' ^^^^^^^^^^^^^^^^^^^^^^^\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", '\n", + " 'line 502, in wait_for\\r\\n'\n", + " ' raise exceptions.TimeoutError() from exc\\r\\n'\n", + " 'TimeoutError\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " 'During handling of the above exception, another exception '\n", + " 'occurred:\\r\\n'\n", + " '\\r\\n'\n", + " '\\r\\n'\n", + " 'Traceback (most recent call last):\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", '\n", + " 'line 603, in do_run\\r\\n'\n", + " ' await self._run_task\\r\\n'\n", + " ' File '\n", + " '\"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", '\n", + " 'line 170, in run\\r\\n'\n", + " ' await getattr(self.remote, f\"cmd_{self.cmd}\").start(\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", + " 'line 487, in start\\r\\n'\n", + " ' return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n'\n", + " ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n'\n", + " ' File '\n", + " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", + " 'line 205, in next_ackcmd\\r\\n'\n", + " ' raise base.AckTimeoutError(\\r\\n'\n", + " \"lsst.ts.salobj.base.AckTimeoutError: msg='Timed out waiting \"\n", + " \"for command acknowledgement', ackcmd=(ackcmd \"\n", + " 'private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: '\n", + " \"-301>, error=0, result='No command acknowledgement \"\n", + " \"seen')\\r\\n\",\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-03-20T04:15:26.769000',\n", + " 'user_id': 'cmorales@summit-lsp.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-03-20T04:16:06.976595',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-03-20T04:15:26.769000',\n", + " 'components': ['AuxTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'},\n", + " {'id': '00067b6a-1741-41f3-87af-57261dff30ac',\n", + " 'site_id': 'summit',\n", + " 'message_text': 'David updated environment. But no need to cycle Scheduler '\n", + " '1. Waiting for completion of the current block. \\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-04-24T20:53:41.843000',\n", + " 'user_id': 'ykang@summit-lsp.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-04-24T20:54:19.346646',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-04-24T20:53:41.843000',\n", + " 'components': ['MainTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'}]\n", + "\n", + "env='tucson', log='exposurelog': \n", + " Example records: \n", + "[{'id': '0076ce05-752f-46df-b8a5-90ffd51d612e',\n", + " 'site_id': 'tucson',\n", + " 'obs_id': 'AT_O_20221129_000001',\n", + " 'instrument': 'LSSTComCam',\n", + " 'day_obs': 20221129,\n", + " 'seq_num': 1,\n", + " 'message_text': 'this was a test image for LOVE LVV November test cycle',\n", + " 'level': 10,\n", + " 'tags': ['undefined'],\n", + " 'urls': [],\n", + " 'user_id': 'admin@love1.tu.lsst.org',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'exposure_flag': 'junk',\n", + " 'date_added': '2022-11-30T02:13:46.847038',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None},\n", + " {'id': '1e61fbbe-cb87-45f2-88be-cb6647b0cd43',\n", + " 'site_id': 'tucson',\n", + " 'obs_id': 'AT_C_20230613_000001',\n", + " 'instrument': 'LATISS',\n", + " 'day_obs': 20230613,\n", + " 'seq_num': 1,\n", + " 'message_text': 'Exposure log creation test',\n", + " 'level': 10,\n", + " 'tags': ['undefined'],\n", + " 'urls': [],\n", + " 'user_id': 'admin@love1.tu.lsst.org',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': False,\n", + " 'exposure_flag': 'none',\n", + " 'date_added': '2023-07-18T22:13:41.228510',\n", + " 'date_invalidated': '2023-07-18T22:15:14.006037',\n", + " 'parent_id': None}]\n", + "\n", + "env='tucson', log='narrativelog': \n", + " Example records: \n", + "[{'id': '01806d0e-c21a-4e2e-8a53-1db4e8f88c0b',\n", + " 'site_id': 'tucson',\n", + " 'message_text': 'Wubba. Using do_makeLogEntry; vr=0.1',\n", + " 'level': 0,\n", + " 'tags': ['watcher', 'alarm'],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-08-15T12:44:06.456000',\n", + " 'user_id': 'admin@love1.tu.lsst.org',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': False,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-08-15T17:54:06.567418',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': ['ObservatorySoftwareTools'],\n", + " 'subsystems': ['LOVE'],\n", + " 'cscs': [],\n", + " 'date_end': '2024-08-15T12:44:06.456000',\n", + " 'components': None,\n", + " 'primary_software_components': None,\n", + " 'primary_hardware_components': None,\n", + " 'category': None,\n", + " 'time_lost_type': None},\n", + " {'id': '05b046b7-1266-47a9-b1de-93b6d44af242',\n", + " 'site_id': 'tucson',\n", + " 'message_text': '',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2023-01-19T22:50:03.167000',\n", + " 'user_id': 'admin@love1.tu.lsst.org',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2023-01-19T22:57:39.561293',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': [],\n", + " 'subsystems': [],\n", + " 'cscs': [],\n", + " 'date_end': '2023-01-19T22:50:03.167000',\n", + " 'components': None,\n", + " 'primary_software_components': None,\n", + " 'primary_hardware_components': None,\n", + " 'category': None,\n", + " 'time_lost_type': None}]\n" + ] + } + ], + "source": [ + "for (env,log),recs in examples.items():\n", + " print(f'\\n{env=}, {log=}: ')\n", + " print(' Example records: ')\n", + " pp(recs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c59d4f72-4bdb-4613-b634-26c2bb315221", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks_tsqr/logrep_proto_1.ipynb b/notebooks_tsqr/logrep_proto_1.ipynb index b767518..03549c9 100644 --- a/notebooks_tsqr/logrep_proto_1.ipynb +++ b/notebooks_tsqr/logrep_proto_1.ipynb @@ -25,11 +25,7 @@ "cell_type": "code", "execution_count": null, "id": "2", - "metadata": { - "jupyter": { - "source_hidden": true - } - }, + "metadata": {}, "outputs": [], "source": [ "# Only use packages available in the Rubin Science Platform\n", diff --git a/notebooks_tsqr/narrativelog.ipynb b/notebooks_tsqr/narrativelog.ipynb new file mode 100644 index 0000000..b767518 --- /dev/null +++ b/notebooks_tsqr/narrativelog.ipynb @@ -0,0 +1,345 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters. Set defaults here.\n", + "# Times Square replaces this cell with the user's parameters.\n", + "record_limit = '999'" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "\n", + "## Imports and General Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "# Only use packages available in the Rubin Science Platform\n", + "import requests\n", + "from collections import defaultdict\n", + "import pandas as pd\n", + "from pprint import pp\n", + "from urllib.parse import urlencode\n", + "from IPython.display import FileLink\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", + "log_name = 'narrativelog'\n", + "log = log_name\n", + "limit = int(record_limit)\n", + "response_timeout = 3.05 # seconds, how long to wait for connection\n", + "read_timeout = 20 # seconds\n", + "\n", + "timeout = (float(response_timeout), float(read_timeout))\n", + "\n", + "# Env list comes from drop-down menu top of:\n", + "# https://rsp.lsst.io/v/usdfdev/guides/times-square/\n", + "envs = dict(\n", + " #rubin_usdf_dev = '',\n", + " #data_lsst_cloud = '',\n", + " #usdf = '',\n", + " #base_data_facility = '',\n", + " summit = 'https://summit-lsp.lsst.codes',\n", + " usdf_dev = 'https://usdf-rsp-dev.slac.stanford.edu',\n", + " #rubin_idf_int = '',\n", + " tucson = 'https://tucson-teststand.lsst.codes',\n", + ")\n", + "server = envs[env]\n", + "service = f'{server}/{log}'\n", + "service" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "\n", + "## Setup Source" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "recs = None\n", + "ok = True\n", + "\n", + "# is_human=either&is_valid=either&offset=0&limit=50' \n", + "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", + "# tags=love&exclude_tags=ignore_message\n", + "qparams = dict(is_human='either',\n", + " is_valid='either',\n", + " limit=limit,\n", + " )\n", + "qstr = urlencode(qparams)\n", + "url = f'{service}/messages?{qstr}'\n", + "\n", + "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", + " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", + " 'date_invalidated', 'date_begin', 'date_end',\n", + " 'time_lost', # float\n", + " #'systems','subsystems','cscs', # values are lists, special handling\n", + " ])" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "\n", + "## Get Records" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO Often fails on first request. Find out why!\n", + "try:\n", + " response = requests.get(url, timeout=timeout)\n", + "except:\n", + " pass \n", + " \n", + "try:\n", + " print(f'Attempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " facflds = flds - ignore_fields\n", + " # facets(field) = set(value-1, value-2, ...)\n", + " facets = {fld: set([str(r[fld])\n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + "except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + "numf = len(flds) if ok else 0\n", + "numr = len(recs) if ok else 0\n", + "print(f'Retrieved {numr} records, each with {numf=} fields.')" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "\n", + "## Tables of (mostly raw) results" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "### Fields names provided in records from log." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(flds, columns=['Field Name'])" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "### Facets from log records.\n", + "A *facet* is the set all of values found for a field in the retrieved records. Facets are only calculated for some fields." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame.from_dict(facets, orient='index')" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "### Table of selected log record fields.\n", + "Table can be retrieved as CSV file for local use." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "cols = ['date_added', 'time_lost']\n", + "df = pd.DataFrame(recs)[cols]\n", + "\n", + "# Allow download of CSV version of DataFrame\n", + "csvfile = 'tl.csv'\n", + "df.to_csv(csvfile)\n", + "myfile = FileLink(csvfile)\n", + "print('Table available as CSV file: ')\n", + "display(myfile)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(recs)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "\n", + "## Plots from log" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "x = [r['date_added'] for r in recs]\n", + "y = [r['time_lost'] for r in recs]\n", + "plt.plot(x, y) \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "\n", + "## Raw Content Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "### Example of one record" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "rec = recs[0]\n", + "rec" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "msg = rec[\"message_text\"]\n", + "print(msg)" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "\n", + "## Stakeholder Elicitation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks_tsqr/narrativelog.yaml b/notebooks_tsqr/narrativelog.yaml new file mode 100644 index 0000000..b6406cb --- /dev/null +++ b/notebooks_tsqr/narrativelog.yaml @@ -0,0 +1,16 @@ +# For use with a Times Square notebook +title: Logging and Reporting: Narrative Log +description: Prototype 1 +authors: + - name: Steve Pothier + slack: Steve Pothier +tags: + - reporting + - prototype +parameters: + record_limit: + type: integer + description: Max number of records to output + default: 99 + minimum: 1 + maximum: 9999 diff --git a/times-square.yaml b/times-square.yaml index 3e6e1d5..e4692c5 100644 --- a/times-square.yaml +++ b/times-square.yaml @@ -1,4 +1,5 @@ enabled: true root: notebooks_tsqr +ignore: SAVE* description: > Times Square for project-wide Logging and Reporting. From 52c288ed0c498493509649d7597c0dc54a3c3647 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Tue, 27 Aug 2024 14:27:17 -0700 Subject: [PATCH 09/17] WIP --- notebooks_tsqr/SAVE_exposurelog.ipynb | 40 +- notebooks_tsqr/SAVE_exposurelog.yaml | 2 +- notebooks_tsqr/exposurelog.ipynb | 40 +- notebooks_tsqr/exposurelog.yaml | 2 +- notebooks_tsqr/logrep_all_env.ipynb | 543 ++------------------------ notebooks_tsqr/narrativelog.yaml | 2 +- 6 files changed, 56 insertions(+), 573 deletions(-) diff --git a/notebooks_tsqr/SAVE_exposurelog.ipynb b/notebooks_tsqr/SAVE_exposurelog.ipynb index 1daba58..a29966d 100644 --- a/notebooks_tsqr/SAVE_exposurelog.ipynb +++ b/notebooks_tsqr/SAVE_exposurelog.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0", "metadata": {}, "outputs": [], @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "2", "metadata": {}, "outputs": [], @@ -41,21 +41,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://tucson-teststand.lsst.codes/exposurelog'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "\n", "limit = int(record_limit)\n", @@ -82,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "5", "metadata": {}, "outputs": [], @@ -119,19 +108,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/exposurelog/messages?is_human=either&is_valid=either&limit=999'\n", - "Retrieved 0 records, each with numf=0 fields.\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", " print(f'Attempt to get logs from {url=}')\n", @@ -301,7 +281,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3b745aea-a46a-45e1-bdf2-def878182eb9", + "id": "22", "metadata": {}, "outputs": [], "source": [ @@ -313,7 +293,7 @@ }, { "cell_type": "markdown", - "id": "22", + "id": "23", "metadata": {}, "source": [ "\n", @@ -323,7 +303,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23", + "id": "24", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks_tsqr/SAVE_exposurelog.yaml b/notebooks_tsqr/SAVE_exposurelog.yaml index b6406cb..a26b1dc 100644 --- a/notebooks_tsqr/SAVE_exposurelog.yaml +++ b/notebooks_tsqr/SAVE_exposurelog.yaml @@ -1,5 +1,5 @@ # For use with a Times Square notebook -title: Logging and Reporting: Narrative Log +title: Logging and Reporting for Narrative Log description: Prototype 1 authors: - name: Steve Pothier diff --git a/notebooks_tsqr/exposurelog.ipynb b/notebooks_tsqr/exposurelog.ipynb index 1daba58..a29966d 100644 --- a/notebooks_tsqr/exposurelog.ipynb +++ b/notebooks_tsqr/exposurelog.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0", "metadata": {}, "outputs": [], @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "2", "metadata": {}, "outputs": [], @@ -41,21 +41,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://tucson-teststand.lsst.codes/exposurelog'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "\n", "limit = int(record_limit)\n", @@ -82,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "5", "metadata": {}, "outputs": [], @@ -119,19 +108,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/exposurelog/messages?is_human=either&is_valid=either&limit=999'\n", - "Retrieved 0 records, each with numf=0 fields.\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", " print(f'Attempt to get logs from {url=}')\n", @@ -301,7 +281,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3b745aea-a46a-45e1-bdf2-def878182eb9", + "id": "22", "metadata": {}, "outputs": [], "source": [ @@ -313,7 +293,7 @@ }, { "cell_type": "markdown", - "id": "22", + "id": "23", "metadata": {}, "source": [ "\n", @@ -323,7 +303,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23", + "id": "24", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks_tsqr/exposurelog.yaml b/notebooks_tsqr/exposurelog.yaml index b6406cb..a26b1dc 100644 --- a/notebooks_tsqr/exposurelog.yaml +++ b/notebooks_tsqr/exposurelog.yaml @@ -1,5 +1,5 @@ # For use with a Times Square notebook -title: Logging and Reporting: Narrative Log +title: Logging and Reporting for Narrative Log description: Prototype 1 authors: - name: Steve Pothier diff --git a/notebooks_tsqr/logrep_all_env.ipynb b/notebooks_tsqr/logrep_all_env.ipynb index 3653ea6..4036bdf 100644 --- a/notebooks_tsqr/logrep_all_env.ipynb +++ b/notebooks_tsqr/logrep_all_env.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "27d224c4-b9b2-43d6-bef4-76a0e17bf2b1", + "id": "0", "metadata": {}, "source": [ "# Logging and Reporting" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "4e56da66-e40a-4ef2-93ba-fc288a2c60bd", + "id": "1", "metadata": {}, "source": [ "## Table of contents\n", @@ -22,7 +22,7 @@ }, { "cell_type": "markdown", - "id": "9bab8290-360c-4784-ba92-f733701dac59", + "id": "2", "metadata": {}, "source": [ "\n", @@ -34,8 +34,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "b4278d59-484d-4adc-8f0b-fd2100d9dcdc", + "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ }, { "cell_type": "markdown", - "id": "1ba64706-2d9a-46b7-9b94-915dc669b7db", + "id": "4", "metadata": {}, "source": [ "\n", @@ -57,8 +57,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "4368be95-2c7d-4111-8056-93237b8fa331", + "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -70,23 +70,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "9e701445-ff88-4b42-93e1-4d14452c8a78", + "execution_count": null, + "id": "6", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'summit': 'https://summit-lsp.lsst.codes',\n", - " 'usdf_dev': 'https://usdf-rsp-dev.slac.stanford.edu',\n", - " 'tucson': 'https://tucson-teststand.lsst.codes'}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "limit = int(record_limit)\n", "timeout = (float(response_timeout), float(read_timeout))\n", @@ -108,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "d83d76bc-3169-45eb-bf7a-32ecf8d75563", + "id": "7", "metadata": {}, "source": [ "\n", @@ -124,34 +111,10 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "d2ee9226-ce4d-43ff-936a-4127c19466ce", + "execution_count": null, + "id": "8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Attempt to get logs from url='https://summit-lsp.lsst.codes/exposurelog/messages?is_human=either&is_valid=either&limit=9999'\n", - "ERROR getting exposurelog from env='summit' using url='https://summit-lsp.lsst.codes/exposurelog/messages?is_human=either&is_valid=either&limit=9999': err=ConnectTimeout(MaxRetryError(\"HTTPSConnectionPool(host='summit-lsp.lsst.codes', port=443): Max retries exceeded with url: /exposurelog/messages?is_human=either&is_valid=either&limit=9999 (Caused by ConnectTimeoutError(, 'Connection to summit-lsp.lsst.codes timed out. (connect timeout=3.05)'))\"))\n", - "\n", - "\n", - "Attempt to get logs from url='https://summit-lsp.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=9999'\n", - "ERROR getting narrativelog from env='summit' using url='https://summit-lsp.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=9999': err=ConnectTimeout(MaxRetryError(\"HTTPSConnectionPool(host='summit-lsp.lsst.codes', port=443): Max retries exceeded with url: /narrativelog/messages?is_human=either&is_valid=either&limit=9999 (Caused by ConnectTimeoutError(, 'Connection to summit-lsp.lsst.codes timed out. (connect timeout=3.05)'))\"))\n", - "\n", - "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/exposurelog/messages?is_human=either&is_valid=either&limit=9999'\n", - "\n", - "\n", - "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/narrativelog/messages?is_human=either&is_valid=either&limit=9999'\n", - "\n", - "Attempt to get logs from url='https://tucson-teststand.lsst.codes/exposurelog/messages?is_human=either&is_valid=either&limit=9999'\n", - "\n", - "\n", - "Attempt to get logs from url='https://tucson-teststand.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=9999'\n" - ] - } - ], + "outputs": [], "source": [ "verbose=False\n", "fields = defaultdict(set) # fields[(env,log)] = {field1, field2, ...}\n", @@ -233,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "c59da227-15e7-4f10-9509-405a9d1c230d", + "id": "9", "metadata": {}, "source": [ "\n", @@ -243,7 +206,7 @@ }, { "cell_type": "markdown", - "id": "402a093d-4443-468f-85a4-b82ee6d3ab06", + "id": "10", "metadata": {}, "source": [ "\n", @@ -252,118 +215,10 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "147c066a-bc3a-4c0e-8499-eaa2f1ec9f4c", + "execution_count": null, + "id": "11", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Got results from 4 of 6 env/logs\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
okservernumfieldsnumrecs
summitexposurelogFalsehttps://summit-lsp.lsst.codes00
narrativelogFalsehttps://summit-lsp.lsst.codes00
usdf_devexposurelogTruehttps://usdf-rsp-dev.slac.stanford.edu187895
narrativelogTruehttps://usdf-rsp-dev.slac.stanford.edu247597
tucsonexposurelogTruehttps://tucson-teststand.lsst.codes1820
narrativelogTruehttps://tucson-teststand.lsst.codes24110
\n", - "
" - ], - "text/plain": [ - " ok server \\\n", - "summit exposurelog False https://summit-lsp.lsst.codes \n", - " narrativelog False https://summit-lsp.lsst.codes \n", - "usdf_dev exposurelog True https://usdf-rsp-dev.slac.stanford.edu \n", - " narrativelog True https://usdf-rsp-dev.slac.stanford.edu \n", - "tucson exposurelog True https://tucson-teststand.lsst.codes \n", - " narrativelog True https://tucson-teststand.lsst.codes \n", - "\n", - " numfields numrecs \n", - "summit exposurelog 0 0 \n", - " narrativelog 0 0 \n", - "usdf_dev exposurelog 18 7895 \n", - " narrativelog 24 7597 \n", - "tucson exposurelog 18 20 \n", - " narrativelog 24 110 " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "show_columns = ['ok', 'server', 'numfields', 'numrecs']\n", "df = pd.DataFrame(data=dict(results)).T.loc[:,show_columns]\n", @@ -373,7 +228,7 @@ }, { "cell_type": "markdown", - "id": "f6ce4545-74d6-4551-b125-44c7c4021c19", + "id": "12", "metadata": {}, "source": [ "\n", @@ -382,26 +237,10 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "0abedbf3-5976-4713-b5ab-f953396dbcff", + "execution_count": null, + "id": "13", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Field names for each Environment/Log source:\n", - "\n", - "usdf_dev/exposurelog: parent_id, instrument, obs_id, user_id, site_id, user_agent, is_human, date_added, message_text, level, tags, day_obs, exposure_flag, is_valid, seq_num, urls, date_invalidated, id\n", - "\n", - "usdf_dev/narrativelog: systems, date_end, message_text, primary_hardware_components, user_agent, site_id, is_human, cscs, category, is_valid, date_invalidated, time_lost_type, tags, urls, time_lost, components, date_begin, parent_id, subsystems, user_id, date_added, level, primary_software_components, id\n", - "\n", - "tucson/exposurelog: parent_id, instrument, obs_id, user_id, site_id, user_agent, is_human, date_added, message_text, level, tags, day_obs, exposure_flag, is_valid, seq_num, urls, date_invalidated, id\n", - "\n", - "tucson/narrativelog: systems, date_end, message_text, primary_hardware_components, user_agent, site_id, is_human, cscs, category, is_valid, date_invalidated, time_lost_type, tags, urls, time_lost, components, date_begin, parent_id, subsystems, user_id, date_added, level, primary_software_components, id\n" - ] - } - ], + "outputs": [], "source": [ "print('Field names for each Environment/Log source:')\n", "for (env,log),flds in fields.items():\n", @@ -412,7 +251,7 @@ }, { "cell_type": "markdown", - "id": "557803ba-3f59-432a-9d39-efca609a1f97", + "id": "14", "metadata": {}, "source": [ "\n", @@ -421,61 +260,10 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "4d98ac00-6694-47e9-a53e-5c5dfef96948", + "execution_count": null, + "id": "15", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "usdf_dev/exposurelog:\n", - " instrument: \t{'LSSTComCam', 'LATISS'}\n", - " user_agent: \t{'notebook:nublado', 'LOVE'}\n", - " is_human: \t{'True'}\n", - " site_id: \t{'summit'}\n", - " level: \t{'20', '10'}\n", - " exposure_flag: \t{'junk', 'none', 'questionable'}\n", - " is_valid: \t{'False', 'True'}\n", - "usdf_dev/narrativelog:\n", - " subsystems: \t{None}\n", - " systems: \t{None}\n", - " user_agent: \t{'LOVE', 'string'}\n", - " is_human: \t{True}\n", - " site_id: \t{'summit'}\n", - " cscs: \t{None}\n", - " time_lost_type: \t{'weather', 'fault', None}\n", - " level: \t{0, 100}\n", - " primary_software_components: \t{None}\n", - " primary_hardware_components: \t{None}\n", - " category: \t{'None', 'SCIENCE', 'ENG', None}\n", - " is_valid: \t{False, True}\n", - " components: \t{None}\n", - "tucson/exposurelog:\n", - " instrument: \t{'LSSTComCam', 'LATISS'}\n", - " user_agent: \t{'LOVE'}\n", - " is_human: \t{'True'}\n", - " site_id: \t{'tucson'}\n", - " level: \t{'10'}\n", - " exposure_flag: \t{'junk', 'none', 'questionable'}\n", - " is_valid: \t{'False', 'True'}\n", - "tucson/narrativelog:\n", - " subsystems: \t{None}\n", - " systems: \t{None}\n", - " user_agent: \t{'LOVE', 'string'}\n", - " is_human: \t{False, True}\n", - " site_id: \t{'tucson'}\n", - " cscs: \t{None}\n", - " time_lost_type: \t{'fault', None}\n", - " level: \t{0, 100}\n", - " primary_software_components: \t{None}\n", - " primary_hardware_components: \t{None}\n", - " category: \t{'None', None}\n", - " is_valid: \t{False, True}\n", - " components: \t{None}\n" - ] - } - ], + "outputs": [], "source": [ "dict(facets)\n", "for (env,log),flds in facets.items():\n", @@ -486,7 +274,7 @@ }, { "cell_type": "markdown", - "id": "fb8c376d-13aa-4740-bd01-9c565b331bab", + "id": "16", "metadata": {}, "source": [ "\n", @@ -495,275 +283,10 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "a4a4725b-ff92-44f2-b6eb-13c52c14b5da", + "execution_count": null, + "id": "17", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "env='usdf_dev', log='exposurelog': \n", - " Example records: \n", - "[{'id': '0005ebfa-1832-4e53-bc7a-a69254deef88',\n", - " 'site_id': 'summit',\n", - " 'obs_id': 'AT_O_20230118_000113',\n", - " 'instrument': 'LATISS',\n", - " 'day_obs': 20230118,\n", - " 'seq_num': 113,\n", - " 'message_text': ' ',\n", - " 'level': 20,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'user_id': 'dsanmartim',\n", - " 'user_agent': 'notebook:nublado',\n", - " 'is_human': True,\n", - " 'is_valid': False,\n", - " 'exposure_flag': 'junk',\n", - " 'date_added': '2023-01-19T07:26:28.887152',\n", - " 'date_invalidated': '2023-01-19T07:32:32.435376',\n", - " 'parent_id': '18345e26-3c8c-4472-864f-68257ced64f4'},\n", - " {'id': '0007f3e6-ac70-4cf3-8edd-70d4a311aa4e',\n", - " 'site_id': 'summit',\n", - " 'obs_id': 'AT_O_20230118_000215',\n", - " 'instrument': 'LATISS',\n", - " 'day_obs': 20230118,\n", - " 'seq_num': 215,\n", - " 'message_text': '',\n", - " 'level': 20,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'user_id': 'dsanmartim',\n", - " 'user_agent': 'notebook:nublado',\n", - " 'is_human': True,\n", - " 'is_valid': False,\n", - " 'exposure_flag': 'none',\n", - " 'date_added': '2023-01-19T07:00:11.295541',\n", - " 'date_invalidated': '2023-01-19T07:32:03.334049',\n", - " 'parent_id': 'cde04ee9-01b3-4428-8e4a-09c5bb25a0e3'}]\n", - "\n", - "env='usdf_dev', log='narrativelog': \n", - " Example records: \n", - "[{'id': '0005d0e0-6de7-4857-b658-cfca7147374a',\n", - " 'site_id': 'summit',\n", - " 'message_text': 'The moveShutterMainDoor command Fail\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " 'we try the parameter with uppercase now\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " ' open: False\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " 'Error in run\\r\\n'\n", - " 'Traceback (most recent call last):\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", '\n", - " 'line 500, in wait_for\\r\\n'\n", - " ' return fut.result()\\r\\n'\n", - " ' ^^^^^^^^^^^^\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", - " 'line 239, in _get_next_ackcmd\\r\\n'\n", - " ' await self._next_ack_event.wait()\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/locks.py\", '\n", - " 'line 213, in wait\\r\\n'\n", - " ' await fut\\r\\n'\n", - " 'asyncio.exceptions.CancelledError\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " 'The above exception was the direct cause of the following '\n", - " 'exception:\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " 'Traceback (most recent call last):\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", - " 'line 189, in next_ackcmd\\r\\n'\n", - " ' ackcmd = await self._wait_task\\r\\n'\n", - " ' ^^^^^^^^^^^^^^^^^^^^^\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", - " 'line 214, in _basic_next_ackcmd\\r\\n'\n", - " ' ackcmd = await asyncio.wait_for(\\r\\n'\n", - " ' ^^^^^^^^^^^^^^^^^^^^^^^\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/asyncio/tasks.py\", '\n", - " 'line 502, in wait_for\\r\\n'\n", - " ' raise exceptions.TimeoutError() from exc\\r\\n'\n", - " 'TimeoutError\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " 'During handling of the above exception, another exception '\n", - " 'occurred:\\r\\n'\n", - " '\\r\\n'\n", - " '\\r\\n'\n", - " 'Traceback (most recent call last):\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/base_script.py\", '\n", - " 'line 603, in do_run\\r\\n'\n", - " ' await self._run_task\\r\\n'\n", - " ' File '\n", - " '\"/net/obs-env/auto_base_packages/ts_standardscripts/python/lsst/ts/standardscripts/run_command.py\", '\n", - " 'line 170, in run\\r\\n'\n", - " ' await getattr(self.remote, f\"cmd_{self.cmd}\").start(\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", - " 'line 487, in start\\r\\n'\n", - " ' return await cmd_info.next_ackcmd(timeout=timeout)\\r\\n'\n", - " ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n'\n", - " ' File '\n", - " '\"/opt/lsst/software/stack/conda/envs/lsst-scipipe-8.0.0/lib/python3.11/site-packages/lsst/ts/salobj/topics/remote_command.py\", '\n", - " 'line 205, in next_ackcmd\\r\\n'\n", - " ' raise base.AckTimeoutError(\\r\\n'\n", - " \"lsst.ts.salobj.base.AckTimeoutError: msg='Timed out waiting \"\n", - " \"for command acknowledgement', ackcmd=(ackcmd \"\n", - " 'private_seqNum=1142844592, ack=<SalRetCode.CMD_NOACK: '\n", - " \"-301>, error=0, result='No command acknowledgement \"\n", - " \"seen')\\r\\n\",\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-03-20T04:15:26.769000',\n", - " 'user_id': 'cmorales@summit-lsp.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-03-20T04:16:06.976595',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-03-20T04:15:26.769000',\n", - " 'components': ['AuxTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'},\n", - " {'id': '00067b6a-1741-41f3-87af-57261dff30ac',\n", - " 'site_id': 'summit',\n", - " 'message_text': 'David updated environment. But no need to cycle Scheduler '\n", - " '1. Waiting for completion of the current block. \\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-04-24T20:53:41.843000',\n", - " 'user_id': 'ykang@summit-lsp.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-04-24T20:54:19.346646',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-04-24T20:53:41.843000',\n", - " 'components': ['MainTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'}]\n", - "\n", - "env='tucson', log='exposurelog': \n", - " Example records: \n", - "[{'id': '0076ce05-752f-46df-b8a5-90ffd51d612e',\n", - " 'site_id': 'tucson',\n", - " 'obs_id': 'AT_O_20221129_000001',\n", - " 'instrument': 'LSSTComCam',\n", - " 'day_obs': 20221129,\n", - " 'seq_num': 1,\n", - " 'message_text': 'this was a test image for LOVE LVV November test cycle',\n", - " 'level': 10,\n", - " 'tags': ['undefined'],\n", - " 'urls': [],\n", - " 'user_id': 'admin@love1.tu.lsst.org',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'exposure_flag': 'junk',\n", - " 'date_added': '2022-11-30T02:13:46.847038',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None},\n", - " {'id': '1e61fbbe-cb87-45f2-88be-cb6647b0cd43',\n", - " 'site_id': 'tucson',\n", - " 'obs_id': 'AT_C_20230613_000001',\n", - " 'instrument': 'LATISS',\n", - " 'day_obs': 20230613,\n", - " 'seq_num': 1,\n", - " 'message_text': 'Exposure log creation test',\n", - " 'level': 10,\n", - " 'tags': ['undefined'],\n", - " 'urls': [],\n", - " 'user_id': 'admin@love1.tu.lsst.org',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': False,\n", - " 'exposure_flag': 'none',\n", - " 'date_added': '2023-07-18T22:13:41.228510',\n", - " 'date_invalidated': '2023-07-18T22:15:14.006037',\n", - " 'parent_id': None}]\n", - "\n", - "env='tucson', log='narrativelog': \n", - " Example records: \n", - "[{'id': '01806d0e-c21a-4e2e-8a53-1db4e8f88c0b',\n", - " 'site_id': 'tucson',\n", - " 'message_text': 'Wubba. Using do_makeLogEntry; vr=0.1',\n", - " 'level': 0,\n", - " 'tags': ['watcher', 'alarm'],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-08-15T12:44:06.456000',\n", - " 'user_id': 'admin@love1.tu.lsst.org',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': False,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-08-15T17:54:06.567418',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': ['ObservatorySoftwareTools'],\n", - " 'subsystems': ['LOVE'],\n", - " 'cscs': [],\n", - " 'date_end': '2024-08-15T12:44:06.456000',\n", - " 'components': None,\n", - " 'primary_software_components': None,\n", - " 'primary_hardware_components': None,\n", - " 'category': None,\n", - " 'time_lost_type': None},\n", - " {'id': '05b046b7-1266-47a9-b1de-93b6d44af242',\n", - " 'site_id': 'tucson',\n", - " 'message_text': '',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2023-01-19T22:50:03.167000',\n", - " 'user_id': 'admin@love1.tu.lsst.org',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2023-01-19T22:57:39.561293',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': [],\n", - " 'subsystems': [],\n", - " 'cscs': [],\n", - " 'date_end': '2023-01-19T22:50:03.167000',\n", - " 'components': None,\n", - " 'primary_software_components': None,\n", - " 'primary_hardware_components': None,\n", - " 'category': None,\n", - " 'time_lost_type': None}]\n" - ] - } - ], + "outputs": [], "source": [ "for (env,log),recs in examples.items():\n", " print(f'\\n{env=}, {log=}: ')\n", @@ -774,7 +297,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c59d4f72-4bdb-4613-b634-26c2bb315221", + "id": "18", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks_tsqr/narrativelog.yaml b/notebooks_tsqr/narrativelog.yaml index b6406cb..a26b1dc 100644 --- a/notebooks_tsqr/narrativelog.yaml +++ b/notebooks_tsqr/narrativelog.yaml @@ -1,5 +1,5 @@ # For use with a Times Square notebook -title: Logging and Reporting: Narrative Log +title: Logging and Reporting for Narrative Log description: Prototype 1 authors: - name: Steve Pothier From bcc4669fe21509ce104ab20a53d5164f60ccdf87 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Tue, 27 Aug 2024 15:20:18 -0700 Subject: [PATCH 10/17] ignore as list --- times-square.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/times-square.yaml b/times-square.yaml index e4692c5..2e9f430 100644 --- a/times-square.yaml +++ b/times-square.yaml @@ -1,5 +1,6 @@ enabled: true root: notebooks_tsqr -ignore: SAVE* +ignore: + - SAVE* description: > Times Square for project-wide Logging and Reporting. From 19a5316d00c1f57278f0aa37e13b981171e7e893 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Wed, 28 Aug 2024 02:29:48 -0700 Subject: [PATCH 11/17] WIP --- notebooks_tsqr/TEMPLATE_logrep.ipynb | 1289 ++++++++++++++++++++++++++ notebooks_tsqr/TEMPLATE_logrep.yaml | 16 + notebooks_tsqr/exposurelog.yaml | 3 +- notebooks_tsqr/logrep_proto_1.yaml | 2 +- notebooks_tsqr/narrativelog.yaml | 3 +- times-square.yaml | 2 +- 6 files changed, 1311 insertions(+), 4 deletions(-) create mode 100644 notebooks_tsqr/TEMPLATE_logrep.ipynb create mode 100644 notebooks_tsqr/TEMPLATE_logrep.yaml diff --git a/notebooks_tsqr/TEMPLATE_logrep.ipynb b/notebooks_tsqr/TEMPLATE_logrep.ipynb new file mode 100644 index 0000000..423ca04 --- /dev/null +++ b/notebooks_tsqr/TEMPLATE_logrep.ipynb @@ -0,0 +1,1289 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters. Set defaults here.\n", + "# Times Square replaces this cell with the user's parameters.\n", + "record_limit = '999'" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "\n", + "## Imports and General Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# Only use packages available in the Rubin Science Platform\n", + "import requests\n", + "from collections import defaultdict\n", + "import pandas as pd\n", + "from pprint import pp, pformat\n", + "from urllib.parse import urlencode\n", + "from IPython.display import FileLink, display_markdown\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://usdf-rsp-dev.slac.stanford.edu/narrativelog'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", + "log_name = 'narrativelog'\n", + "log = log_name\n", + "limit = int(record_limit)\n", + "response_timeout = 3.05 # seconds, how long to wait for connection\n", + "read_timeout = 20 # seconds\n", + "\n", + "timeout = (float(response_timeout), float(read_timeout))\n", + "\n", + "# Env list comes from drop-down menu top of:\n", + "# https://rsp.lsst.io/v/usdfdev/guides/times-square/\n", + "envs = dict(\n", + " #rubin_usdf_dev = '',\n", + " #data_lsst_cloud = '',\n", + " #usdf = '',\n", + " #base_data_facility = '',\n", + " summit = 'https://summit-lsp.lsst.codes',\n", + " usdf_dev = 'https://usdf-rsp-dev.slac.stanford.edu',\n", + " #rubin_idf_int = '',\n", + " tucson = 'https://tucson-teststand.lsst.codes',\n", + ")\n", + "server = envs[env]\n", + "service = f'{server}/{log}'\n", + "service" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "\n", + "## Setup Source" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ffc71e94-c046-4c02-8154-689c98dbdc5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "### Will retrieve from https://usdf-rsp-dev.slac.stanford.edu/narrativelog" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "md = f'### Will retrieve from {service}'\n", + "display_markdown(md, raw=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "recs = None\n", + "ok = True\n", + "\n", + "# is_human=either&is_valid=either&offset=0&limit=50' \n", + "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", + "# tags=love&exclude_tags=ignore_message\n", + "qparams = dict(is_human='either',\n", + " is_valid='either',\n", + " limit=limit,\n", + " )\n", + "qstr = urlencode(qparams)\n", + "url = f'{service}/messages?{qstr}'\n", + "\n", + "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", + " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", + " 'date_invalidated', 'date_begin', 'date_end',\n", + " 'time_lost', # float\n", + " #'systems','subsystems','cscs', # values are lists, special handling\n", + " ])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "209d16ac-946a-4202-a88d-e5e45db471fe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "## Get (up to 999) Records" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_markdown(f'## Get (up to {limit}) Records', raw=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/narrativelog/messages?is_human=either&is_valid=either&limit=999'\n", + "Retrieved 999 records, each with 24 fields.\n" + ] + } + ], + "source": [ + "# TODO Often fails on first request. Find out why!\n", + "try:\n", + " response = requests.get(url, timeout=timeout)\n", + "except:\n", + " pass \n", + " \n", + "try:\n", + " print(f'Attempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " facflds = flds - ignore_fields\n", + " # facets(field) = set(value-1, value-2, ...)\n", + " facets = {fld: set([str(r[fld])\n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + "except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + "numf = len(flds) if ok else 0\n", + "numr = len(recs) if ok else 0\n", + "print(f'Retrieved {numr} records, each with {numf} fields.')" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "\n", + "## Tables of (mostly raw) results" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "### Fields names provided in records from log." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "10", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Field Name
0cscs
1user_id
2time_lost
3primary_software_components
4site_id
5category
6date_added
7level
8user_agent
9systems
10components
11date_invalidated
12message_text
13id
14primary_hardware_components
15subsystems
16date_end
17tags
18date_begin
19is_human
20time_lost_type
21is_valid
22urls
23parent_id
\n", + "
" + ], + "text/plain": [ + " Field Name\n", + "0 cscs\n", + "1 user_id\n", + "2 time_lost\n", + "3 primary_software_components\n", + "4 site_id\n", + "5 category\n", + "6 date_added\n", + "7 level\n", + "8 user_agent\n", + "9 systems\n", + "10 components\n", + "11 date_invalidated\n", + "12 message_text\n", + "13 id\n", + "14 primary_hardware_components\n", + "15 subsystems\n", + "16 date_end\n", + "17 tags\n", + "18 date_begin\n", + "19 is_human\n", + "20 time_lost_type\n", + "21 is_valid\n", + "22 urls\n", + "23 parent_id" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(flds, columns=['Field Name'])" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "### Facets from log records.\n", + "A *facet* is the set all of values found for a field in the retrieved records. Facets are only calculated for some fields." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "12", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
cscsNoneNone
is_humanTrueNone
time_lost_typeNonefault
level0100
user_agentLOVENone
systemsNoneNone
is_validTrueFalse
componentsNoneNone
primary_hardware_componentsNoneNone
primary_software_componentsNoneNone
site_idsummitNone
subsystemsNoneNone
categoryNoneSCIENCE
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "cscs None None\n", + "is_human True None\n", + "time_lost_type None fault\n", + "level 0 100\n", + "user_agent LOVE None\n", + "systems None None\n", + "is_valid True False\n", + "components None None\n", + "primary_hardware_components None None\n", + "primary_software_components None None\n", + "site_id summit None\n", + "subsystems None None\n", + "category None SCIENCE" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'cscs': {'None'},\n", + " 'is_human': {'True'},\n", + " 'time_lost_type': {'None', 'fault'},\n", + " 'level': {'0', '100'},\n", + " 'user_agent': {'LOVE'},\n", + " 'systems': {'None'},\n", + " 'is_valid': {'False', 'True'},\n", + " 'components': {'None'},\n", + " 'primary_hardware_components': {'None'},\n", + " 'primary_software_components': {'None'},\n", + " 'site_id': {'summit'},\n", + " 'subsystems': {'None'},\n", + " 'category': {'None', 'SCIENCE'}}" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(pd.DataFrame.from_dict(facets, orient='index'))\n", + "display(facets)" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "### Table of selected log record fields.\n", + "Table can be retrieved as CSV file for local use." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "14", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Table available as CSV file: \n" + ] + }, + { + "data": { + "text/html": [ + "tl.csv
" + ], + "text/plain": [ + "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
date_addedtime_lost
02024-03-20T04:16:06.9765950.0
12024-04-24T20:54:19.3466460.0
22024-06-19T01:59:58.7013430.0
32024-08-21T04:22:26.2326530.0
42023-11-21T19:55:36.7871050.0
.........
9942024-03-13T04:54:25.1291110.0
9952023-12-27T23:02:35.3813340.0
9962024-03-04T22:41:03.5431190.0
9972024-05-27T23:17:00.0612450.0
9982024-01-10T20:54:21.6852480.0
\n", + "

999 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " date_added time_lost\n", + "0 2024-03-20T04:16:06.976595 0.0\n", + "1 2024-04-24T20:54:19.346646 0.0\n", + "2 2024-06-19T01:59:58.701343 0.0\n", + "3 2024-08-21T04:22:26.232653 0.0\n", + "4 2023-11-21T19:55:36.787105 0.0\n", + ".. ... ...\n", + "994 2024-03-13T04:54:25.129111 0.0\n", + "995 2023-12-27T23:02:35.381334 0.0\n", + "996 2024-03-04T22:41:03.543119 0.0\n", + "997 2024-05-27T23:17:00.061245 0.0\n", + "998 2024-01-10T20:54:21.685248 0.0\n", + "\n", + "[999 rows x 2 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cols = ['date_added', 'time_lost']\n", + "df = pd.DataFrame(recs)[cols]\n", + "\n", + "# Allow download of CSV version of DataFrame\n", + "csvfile = 'tl.csv'\n", + "df.to_csv(csvfile)\n", + "myfile = FileLink(csvfile)\n", + "print('Table available as CSV file: ')\n", + "display(myfile)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "15", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsite_idmessage_textleveltagsurlstime_lostdate_beginuser_iduser_agent...parent_idsystemssubsystemscscsdate_endcomponentsprimary_software_componentsprimary_hardware_componentscategorytime_lost_type
00005d0e0-6de7-4857-b658-cfca7147374asummitThe moveShutterMainDoor command Fail\\r\\n\\r\\n\\r...0[][]0.02024-03-20T04:15:26.769000cmorales@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-03-20T04:15:26.769000[AuxTel][None][None]Nonefault
100067b6a-1741-41f3-87af-57261dff30acsummitDavid updated environment. But no need to cycl...0[][]0.02024-04-24T20:53:41.843000ykang@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-04-24T20:53:41.843000[MainTel][None][None]Nonefault
2000a3ba8-b1a9-4b04-9c4a-263da3dac1d1summitRuning BLOCK-T22 AuxTel filter Scans, the auxt...0[][]0.02024-06-19T01:59:08.706000cmd_user@summit-lsp.lsst.codesLOVE...af0157e3-d7f0-4068-9a8a-e51a0a77d260NoneNoneNone2024-06-19T01:59:08.706000[AuxTel][None][None]Nonefault
30010e246-8039-4741-b4c6-54047e9464c5summitStill checking updates in the wavefront estima...0[][]0.02024-08-21T04:04:38.053000kpena@summit-lsp.lsst.codesLOVE...99de2a12-20eb-45ae-b189-a793b63e6ab5NoneNoneNone2024-08-21T04:04:38.053000[AuxTel][None][None]Nonefault
40017b90e-26aa-4a7c-8186-fc06ac9b5aa6summitThe m1m3 ump test failed for actuator 108. \\r\\...0[][]0.02023-11-21T19:51:54.868000bquint@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2023-11-21T19:51:54.868000[MainTel][None][None]Nonefault
..................................................................
99421dfca3e-1ed9-4b3d-b8af-0af7cc20bba5summitRun [BLOCK-218|https://jira.lsstcorp.org/brows...0[][]0.02024-03-13T04:51:31.209000ykang@love01.cp.lsst.orgLOVE...d10bbbf9-4255-42f0-bab1-0267f8d0d009NoneNoneNone2024-03-13T04:51:31.209000[MainTel][None][None]Nonefault
99521e07833-b8d5-47f2-9723-c4c8e860607csummitPreparing Block-175 - staging TMA at az=0, el=...0[][]0.02023-12-27T21:12:33.991000echristensen@love02.cp.lsst.orgLOVE...NoneNoneNoneNone2023-12-27T21:12:33.991000[MainTel][None][None]Nonefault
99621e74884-fd34-4538-85da-2c47305855d0summitTesting create ticket comment from LOVE K8S Su...0[][https://rubinobs.atlassian.net/browse/OBS-454]0.02024-03-04T22:40:24.642000saranda@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-03-04T22:40:24.642000None[None][None]Nonefault
99721e7c640-6163-4358-90fc-a29352c940c3summitEnabling the scheduler again to pull in change...0[][]0.02024-05-27T23:16:22.284000kkelkar@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-05-27T23:16:22.284000[AuxTel][None][None]Nonefault
99821ebee65-b30b-4620-ac1c-a2235d27f907summitOSS didn't turned on, we got a timeout.\\r\\n0[][]0.02024-01-10T20:53:36.828000jseron@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2024-01-10T20:53:36.828000[MainTel][None][None]Nonefault
\n", + "

999 rows × 24 columns

\n", + "
" + ], + "text/plain": [ + " id site_id \\\n", + "0 0005d0e0-6de7-4857-b658-cfca7147374a summit \n", + "1 00067b6a-1741-41f3-87af-57261dff30ac summit \n", + "2 000a3ba8-b1a9-4b04-9c4a-263da3dac1d1 summit \n", + "3 0010e246-8039-4741-b4c6-54047e9464c5 summit \n", + "4 0017b90e-26aa-4a7c-8186-fc06ac9b5aa6 summit \n", + ".. ... ... \n", + "994 21dfca3e-1ed9-4b3d-b8af-0af7cc20bba5 summit \n", + "995 21e07833-b8d5-47f2-9723-c4c8e860607c summit \n", + "996 21e74884-fd34-4538-85da-2c47305855d0 summit \n", + "997 21e7c640-6163-4358-90fc-a29352c940c3 summit \n", + "998 21ebee65-b30b-4620-ac1c-a2235d27f907 summit \n", + "\n", + " message_text level tags \\\n", + "0 The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r... 0 [] \n", + "1 David updated environment. But no need to cycl... 0 [] \n", + "2 Runing BLOCK-T22 AuxTel filter Scans, the auxt... 0 [] \n", + "3 Still checking updates in the wavefront estima... 0 [] \n", + "4 The m1m3 ump test failed for actuator 108. \\r\\... 0 [] \n", + ".. ... ... ... \n", + "994 Run [BLOCK-218|https://jira.lsstcorp.org/brows... 0 [] \n", + "995 Preparing Block-175 - staging TMA at az=0, el=... 0 [] \n", + "996 Testing create ticket comment from LOVE K8S Su... 0 [] \n", + "997 Enabling the scheduler again to pull in change... 0 [] \n", + "998 OSS didn't turned on, we got a timeout.\\r\\n 0 [] \n", + "\n", + " urls time_lost \\\n", + "0 [] 0.0 \n", + "1 [] 0.0 \n", + "2 [] 0.0 \n", + "3 [] 0.0 \n", + "4 [] 0.0 \n", + ".. ... ... \n", + "994 [] 0.0 \n", + "995 [] 0.0 \n", + "996 [https://rubinobs.atlassian.net/browse/OBS-454] 0.0 \n", + "997 [] 0.0 \n", + "998 [] 0.0 \n", + "\n", + " date_begin user_id user_agent \\\n", + "0 2024-03-20T04:15:26.769000 cmorales@summit-lsp.lsst.codes LOVE \n", + "1 2024-04-24T20:53:41.843000 ykang@summit-lsp.lsst.codes LOVE \n", + "2 2024-06-19T01:59:08.706000 cmd_user@summit-lsp.lsst.codes LOVE \n", + "3 2024-08-21T04:04:38.053000 kpena@summit-lsp.lsst.codes LOVE \n", + "4 2023-11-21T19:51:54.868000 bquint@love01.cp.lsst.org LOVE \n", + ".. ... ... ... \n", + "994 2024-03-13T04:51:31.209000 ykang@love01.cp.lsst.org LOVE \n", + "995 2023-12-27T21:12:33.991000 echristensen@love02.cp.lsst.org LOVE \n", + "996 2024-03-04T22:40:24.642000 saranda@summit-lsp.lsst.codes LOVE \n", + "997 2024-05-27T23:16:22.284000 kkelkar@summit-lsp.lsst.codes LOVE \n", + "998 2024-01-10T20:53:36.828000 jseron@love01.cp.lsst.org LOVE \n", + "\n", + " ... parent_id systems subsystems cscs \\\n", + "0 ... None None None None \n", + "1 ... None None None None \n", + "2 ... af0157e3-d7f0-4068-9a8a-e51a0a77d260 None None None \n", + "3 ... 99de2a12-20eb-45ae-b189-a793b63e6ab5 None None None \n", + "4 ... None None None None \n", + ".. ... ... ... ... ... \n", + "994 ... d10bbbf9-4255-42f0-bab1-0267f8d0d009 None None None \n", + "995 ... None None None None \n", + "996 ... None None None None \n", + "997 ... None None None None \n", + "998 ... None None None None \n", + "\n", + " date_end components primary_software_components \\\n", + "0 2024-03-20T04:15:26.769000 [AuxTel] [None] \n", + "1 2024-04-24T20:53:41.843000 [MainTel] [None] \n", + "2 2024-06-19T01:59:08.706000 [AuxTel] [None] \n", + "3 2024-08-21T04:04:38.053000 [AuxTel] [None] \n", + "4 2023-11-21T19:51:54.868000 [MainTel] [None] \n", + ".. ... ... ... \n", + "994 2024-03-13T04:51:31.209000 [MainTel] [None] \n", + "995 2023-12-27T21:12:33.991000 [MainTel] [None] \n", + "996 2024-03-04T22:40:24.642000 None [None] \n", + "997 2024-05-27T23:16:22.284000 [AuxTel] [None] \n", + "998 2024-01-10T20:53:36.828000 [MainTel] [None] \n", + "\n", + " primary_hardware_components category time_lost_type \n", + "0 [None] None fault \n", + "1 [None] None fault \n", + "2 [None] None fault \n", + "3 [None] None fault \n", + "4 [None] None fault \n", + ".. ... ... ... \n", + "994 [None] None fault \n", + "995 [None] None fault \n", + "996 [None] None fault \n", + "997 [None] None fault \n", + "998 [None] None fault \n", + "\n", + "[999 rows x 24 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(recs)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "\n", + "## Plots from log" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "17", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = [r['date_added'] for r in recs]\n", + "y = [r['time_lost'] for r in recs]\n", + "plt.plot(x, y) \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "\n", + "## Raw Content Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "e1447b6f-4061-4e7e-9129-ee42a8adee29", + "metadata": {}, + "source": [ + "### Example of one record" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "51c18ed6-02b4-4e9d-8afa-ff8109bdbfbb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'id': '21ebee65-b30b-4620-ac1c-a2235d27f907',\n", + " 'site_id': 'summit',\n", + " 'message_text': \"OSS didn't turned on, we got a timeout.\\r\\n\",\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-01-10T20:53:36.828000',\n", + " 'user_id': 'jseron@love01.cp.lsst.org',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-01-10T20:54:21.685248',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-01-10T20:53:36.828000',\n", + " 'components': ['MainTel'],\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'}" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(recs[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "21", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "Message text from log:\n", + "> OSS didn't turned on, we got a timeout.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "msg = rec[\"message_text\"]\n", + "md = f'Message text from log:\\n> {msg}'\n", + "display_markdown(md, raw=True)" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "\n", + "## Stakeholder Elicitation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks_tsqr/TEMPLATE_logrep.yaml b/notebooks_tsqr/TEMPLATE_logrep.yaml new file mode 100644 index 0000000..ada7411 --- /dev/null +++ b/notebooks_tsqr/TEMPLATE_logrep.yaml @@ -0,0 +1,16 @@ +# For use with a Times Square notebook +title: LR mix +description: Prototype 1 +authors: + - name: Steve Pothier + slack: Steve Pothier +tags: + - reporting + - prototype +parameters: + record_limit: + type: integer + description: Max number of records to output + default: 99 + minimum: 1 + maximum: 9999 diff --git a/notebooks_tsqr/exposurelog.yaml b/notebooks_tsqr/exposurelog.yaml index a26b1dc..6d1e4ab 100644 --- a/notebooks_tsqr/exposurelog.yaml +++ b/notebooks_tsqr/exposurelog.yaml @@ -1,5 +1,5 @@ # For use with a Times Square notebook -title: Logging and Reporting for Narrative Log +title: LR Exposure Log description: Prototype 1 authors: - name: Steve Pothier @@ -7,6 +7,7 @@ authors: tags: - reporting - prototype + - exposure parameters: record_limit: type: integer diff --git a/notebooks_tsqr/logrep_proto_1.yaml b/notebooks_tsqr/logrep_proto_1.yaml index 3c1d085..ada7411 100644 --- a/notebooks_tsqr/logrep_proto_1.yaml +++ b/notebooks_tsqr/logrep_proto_1.yaml @@ -1,5 +1,5 @@ # For use with a Times Square notebook -title: Logging and Reporting +title: LR mix description: Prototype 1 authors: - name: Steve Pothier diff --git a/notebooks_tsqr/narrativelog.yaml b/notebooks_tsqr/narrativelog.yaml index a26b1dc..f47ecf3 100644 --- a/notebooks_tsqr/narrativelog.yaml +++ b/notebooks_tsqr/narrativelog.yaml @@ -1,5 +1,5 @@ # For use with a Times Square notebook -title: Logging and Reporting for Narrative Log +title: LR Narrative Log description: Prototype 1 authors: - name: Steve Pothier @@ -7,6 +7,7 @@ authors: tags: - reporting - prototype + - narrativelog parameters: record_limit: type: integer diff --git a/times-square.yaml b/times-square.yaml index 2e9f430..ed3fa57 100644 --- a/times-square.yaml +++ b/times-square.yaml @@ -1,6 +1,6 @@ enabled: true root: notebooks_tsqr ignore: - - SAVE* + - SAVE_* description: > Times Square for project-wide Logging and Reporting. From dd18a8cced9e79d20e1908d0b84338b3e653b8a9 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Wed, 28 Aug 2024 02:38:09 -0700 Subject: [PATCH 12/17] WIP --- notebooks_tsqr/TEMPLATE_logrep.ipynb | 1021 ++------------------------ 1 file changed, 45 insertions(+), 976 deletions(-) diff --git a/notebooks_tsqr/TEMPLATE_logrep.ipynb b/notebooks_tsqr/TEMPLATE_logrep.ipynb index 423ca04..89b0795 100644 --- a/notebooks_tsqr/TEMPLATE_logrep.ipynb +++ b/notebooks_tsqr/TEMPLATE_logrep.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0", "metadata": {}, "outputs": [], @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "2", "metadata": {}, "outputs": [], @@ -40,21 +40,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://usdf-rsp-dev.slac.stanford.edu/narrativelog'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", "log_name = 'narrativelog'\n", @@ -93,20 +82,10 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "ffc71e94-c046-4c02-8154-689c98dbdc5f", + "execution_count": null, + "id": "5", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### Will retrieve from https://usdf-rsp-dev.slac.stanford.edu/narrativelog" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "md = f'### Will retrieve from {service}'\n", "display_markdown(md, raw=True)" @@ -114,8 +93,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "5", + "execution_count": null, + "id": "6", "metadata": {}, "outputs": [], "source": [ @@ -142,39 +121,20 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "209d16ac-946a-4202-a88d-e5e45db471fe", + "execution_count": null, + "id": "7", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "## Get (up to 999) Records" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "display_markdown(f'## Get (up to {limit}) Records', raw=True)" ] }, { "cell_type": "code", - "execution_count": 38, - "id": "7", + "execution_count": null, + "id": "8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attempt to get logs from url='https://usdf-rsp-dev.slac.stanford.edu/narrativelog/messages?is_human=either&is_valid=either&limit=999'\n", - "Retrieved 999 records, each with 24 fields.\n" - ] - } - ], + "outputs": [], "source": [ "# TODO Often fails on first request. Find out why!\n", "try:\n", @@ -203,7 +163,7 @@ }, { "cell_type": "markdown", - "id": "8", + "id": "9", "metadata": {}, "source": [ "\n", @@ -212,7 +172,7 @@ }, { "cell_type": "markdown", - "id": "9", + "id": "10", "metadata": {}, "source": [ "### Fields names provided in records from log." @@ -220,175 +180,17 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "10", + "execution_count": null, + "id": "11", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Field Name
0cscs
1user_id
2time_lost
3primary_software_components
4site_id
5category
6date_added
7level
8user_agent
9systems
10components
11date_invalidated
12message_text
13id
14primary_hardware_components
15subsystems
16date_end
17tags
18date_begin
19is_human
20time_lost_type
21is_valid
22urls
23parent_id
\n", - "
" - ], - "text/plain": [ - " Field Name\n", - "0 cscs\n", - "1 user_id\n", - "2 time_lost\n", - "3 primary_software_components\n", - "4 site_id\n", - "5 category\n", - "6 date_added\n", - "7 level\n", - "8 user_agent\n", - "9 systems\n", - "10 components\n", - "11 date_invalidated\n", - "12 message_text\n", - "13 id\n", - "14 primary_hardware_components\n", - "15 subsystems\n", - "16 date_end\n", - "17 tags\n", - "18 date_begin\n", - "19 is_human\n", - "20 time_lost_type\n", - "21 is_valid\n", - "22 urls\n", - "23 parent_id" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.DataFrame(flds, columns=['Field Name'])" ] }, { "cell_type": "markdown", - "id": "11", + "id": "12", "metadata": {}, "source": [ "### Facets from log records.\n", @@ -397,151 +199,14 @@ }, { "cell_type": "code", - "execution_count": 37, - "id": "12", + "execution_count": null, + "id": "13", "metadata": { "jupyter": { "source_hidden": true } }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
01
cscsNoneNone
is_humanTrueNone
time_lost_typeNonefault
level0100
user_agentLOVENone
systemsNoneNone
is_validTrueFalse
componentsNoneNone
primary_hardware_componentsNoneNone
primary_software_componentsNoneNone
site_idsummitNone
subsystemsNoneNone
categoryNoneSCIENCE
\n", - "
" - ], - "text/plain": [ - " 0 1\n", - "cscs None None\n", - "is_human True None\n", - "time_lost_type None fault\n", - "level 0 100\n", - "user_agent LOVE None\n", - "systems None None\n", - "is_valid True False\n", - "components None None\n", - "primary_hardware_components None None\n", - "primary_software_components None None\n", - "site_id summit None\n", - "subsystems None None\n", - "category None SCIENCE" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "{'cscs': {'None'},\n", - " 'is_human': {'True'},\n", - " 'time_lost_type': {'None', 'fault'},\n", - " 'level': {'0', '100'},\n", - " 'user_agent': {'LOVE'},\n", - " 'systems': {'None'},\n", - " 'is_valid': {'False', 'True'},\n", - " 'components': {'None'},\n", - " 'primary_hardware_components': {'None'},\n", - " 'primary_software_components': {'None'},\n", - " 'site_id': {'summit'},\n", - " 'subsystems': {'None'},\n", - " 'category': {'None', 'SCIENCE'}}" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "display(pd.DataFrame.from_dict(facets, orient='index'))\n", "display(facets)" @@ -549,7 +214,7 @@ }, { "cell_type": "markdown", - "id": "13", + "id": "14", "metadata": {}, "source": [ "### Table of selected log record fields.\n", @@ -558,141 +223,14 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "14", + "execution_count": null, + "id": "15", "metadata": { "jupyter": { "source_hidden": true } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table available as CSV file: \n" - ] - }, - { - "data": { - "text/html": [ - "tl.csv
" - ], - "text/plain": [ - "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
date_addedtime_lost
02024-03-20T04:16:06.9765950.0
12024-04-24T20:54:19.3466460.0
22024-06-19T01:59:58.7013430.0
32024-08-21T04:22:26.2326530.0
42023-11-21T19:55:36.7871050.0
.........
9942024-03-13T04:54:25.1291110.0
9952023-12-27T23:02:35.3813340.0
9962024-03-04T22:41:03.5431190.0
9972024-05-27T23:17:00.0612450.0
9982024-01-10T20:54:21.6852480.0
\n", - "

999 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " date_added time_lost\n", - "0 2024-03-20T04:16:06.976595 0.0\n", - "1 2024-04-24T20:54:19.346646 0.0\n", - "2 2024-06-19T01:59:58.701343 0.0\n", - "3 2024-08-21T04:22:26.232653 0.0\n", - "4 2023-11-21T19:55:36.787105 0.0\n", - ".. ... ...\n", - "994 2024-03-13T04:54:25.129111 0.0\n", - "995 2023-12-27T23:02:35.381334 0.0\n", - "996 2024-03-04T22:41:03.543119 0.0\n", - "997 2024-05-27T23:17:00.061245 0.0\n", - "998 2024-01-10T20:54:21.685248 0.0\n", - "\n", - "[999 rows x 2 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cols = ['date_added', 'time_lost']\n", "df = pd.DataFrame(recs)[cols]\n", @@ -708,424 +246,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "15", + "execution_count": null, + "id": "16", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idsite_idmessage_textleveltagsurlstime_lostdate_beginuser_iduser_agent...parent_idsystemssubsystemscscsdate_endcomponentsprimary_software_componentsprimary_hardware_componentscategorytime_lost_type
00005d0e0-6de7-4857-b658-cfca7147374asummitThe moveShutterMainDoor command Fail\\r\\n\\r\\n\\r...0[][]0.02024-03-20T04:15:26.769000cmorales@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-03-20T04:15:26.769000[AuxTel][None][None]Nonefault
100067b6a-1741-41f3-87af-57261dff30acsummitDavid updated environment. But no need to cycl...0[][]0.02024-04-24T20:53:41.843000ykang@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-04-24T20:53:41.843000[MainTel][None][None]Nonefault
2000a3ba8-b1a9-4b04-9c4a-263da3dac1d1summitRuning BLOCK-T22 AuxTel filter Scans, the auxt...0[][]0.02024-06-19T01:59:08.706000cmd_user@summit-lsp.lsst.codesLOVE...af0157e3-d7f0-4068-9a8a-e51a0a77d260NoneNoneNone2024-06-19T01:59:08.706000[AuxTel][None][None]Nonefault
30010e246-8039-4741-b4c6-54047e9464c5summitStill checking updates in the wavefront estima...0[][]0.02024-08-21T04:04:38.053000kpena@summit-lsp.lsst.codesLOVE...99de2a12-20eb-45ae-b189-a793b63e6ab5NoneNoneNone2024-08-21T04:04:38.053000[AuxTel][None][None]Nonefault
40017b90e-26aa-4a7c-8186-fc06ac9b5aa6summitThe m1m3 ump test failed for actuator 108. \\r\\...0[][]0.02023-11-21T19:51:54.868000bquint@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2023-11-21T19:51:54.868000[MainTel][None][None]Nonefault
..................................................................
99421dfca3e-1ed9-4b3d-b8af-0af7cc20bba5summitRun [BLOCK-218|https://jira.lsstcorp.org/brows...0[][]0.02024-03-13T04:51:31.209000ykang@love01.cp.lsst.orgLOVE...d10bbbf9-4255-42f0-bab1-0267f8d0d009NoneNoneNone2024-03-13T04:51:31.209000[MainTel][None][None]Nonefault
99521e07833-b8d5-47f2-9723-c4c8e860607csummitPreparing Block-175 - staging TMA at az=0, el=...0[][]0.02023-12-27T21:12:33.991000echristensen@love02.cp.lsst.orgLOVE...NoneNoneNoneNone2023-12-27T21:12:33.991000[MainTel][None][None]Nonefault
99621e74884-fd34-4538-85da-2c47305855d0summitTesting create ticket comment from LOVE K8S Su...0[][https://rubinobs.atlassian.net/browse/OBS-454]0.02024-03-04T22:40:24.642000saranda@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-03-04T22:40:24.642000None[None][None]Nonefault
99721e7c640-6163-4358-90fc-a29352c940c3summitEnabling the scheduler again to pull in change...0[][]0.02024-05-27T23:16:22.284000kkelkar@summit-lsp.lsst.codesLOVE...NoneNoneNoneNone2024-05-27T23:16:22.284000[AuxTel][None][None]Nonefault
99821ebee65-b30b-4620-ac1c-a2235d27f907summitOSS didn't turned on, we got a timeout.\\r\\n0[][]0.02024-01-10T20:53:36.828000jseron@love01.cp.lsst.orgLOVE...NoneNoneNoneNone2024-01-10T20:53:36.828000[MainTel][None][None]Nonefault
\n", - "

999 rows × 24 columns

\n", - "
" - ], - "text/plain": [ - " id site_id \\\n", - "0 0005d0e0-6de7-4857-b658-cfca7147374a summit \n", - "1 00067b6a-1741-41f3-87af-57261dff30ac summit \n", - "2 000a3ba8-b1a9-4b04-9c4a-263da3dac1d1 summit \n", - "3 0010e246-8039-4741-b4c6-54047e9464c5 summit \n", - "4 0017b90e-26aa-4a7c-8186-fc06ac9b5aa6 summit \n", - ".. ... ... \n", - "994 21dfca3e-1ed9-4b3d-b8af-0af7cc20bba5 summit \n", - "995 21e07833-b8d5-47f2-9723-c4c8e860607c summit \n", - "996 21e74884-fd34-4538-85da-2c47305855d0 summit \n", - "997 21e7c640-6163-4358-90fc-a29352c940c3 summit \n", - "998 21ebee65-b30b-4620-ac1c-a2235d27f907 summit \n", - "\n", - " message_text level tags \\\n", - "0 The moveShutterMainDoor command Fail\\r\\n\\r\\n\\r... 0 [] \n", - "1 David updated environment. But no need to cycl... 0 [] \n", - "2 Runing BLOCK-T22 AuxTel filter Scans, the auxt... 0 [] \n", - "3 Still checking updates in the wavefront estima... 0 [] \n", - "4 The m1m3 ump test failed for actuator 108. \\r\\... 0 [] \n", - ".. ... ... ... \n", - "994 Run [BLOCK-218|https://jira.lsstcorp.org/brows... 0 [] \n", - "995 Preparing Block-175 - staging TMA at az=0, el=... 0 [] \n", - "996 Testing create ticket comment from LOVE K8S Su... 0 [] \n", - "997 Enabling the scheduler again to pull in change... 0 [] \n", - "998 OSS didn't turned on, we got a timeout.\\r\\n 0 [] \n", - "\n", - " urls time_lost \\\n", - "0 [] 0.0 \n", - "1 [] 0.0 \n", - "2 [] 0.0 \n", - "3 [] 0.0 \n", - "4 [] 0.0 \n", - ".. ... ... \n", - "994 [] 0.0 \n", - "995 [] 0.0 \n", - "996 [https://rubinobs.atlassian.net/browse/OBS-454] 0.0 \n", - "997 [] 0.0 \n", - "998 [] 0.0 \n", - "\n", - " date_begin user_id user_agent \\\n", - "0 2024-03-20T04:15:26.769000 cmorales@summit-lsp.lsst.codes LOVE \n", - "1 2024-04-24T20:53:41.843000 ykang@summit-lsp.lsst.codes LOVE \n", - "2 2024-06-19T01:59:08.706000 cmd_user@summit-lsp.lsst.codes LOVE \n", - "3 2024-08-21T04:04:38.053000 kpena@summit-lsp.lsst.codes LOVE \n", - "4 2023-11-21T19:51:54.868000 bquint@love01.cp.lsst.org LOVE \n", - ".. ... ... ... \n", - "994 2024-03-13T04:51:31.209000 ykang@love01.cp.lsst.org LOVE \n", - "995 2023-12-27T21:12:33.991000 echristensen@love02.cp.lsst.org LOVE \n", - "996 2024-03-04T22:40:24.642000 saranda@summit-lsp.lsst.codes LOVE \n", - "997 2024-05-27T23:16:22.284000 kkelkar@summit-lsp.lsst.codes LOVE \n", - "998 2024-01-10T20:53:36.828000 jseron@love01.cp.lsst.org LOVE \n", - "\n", - " ... parent_id systems subsystems cscs \\\n", - "0 ... None None None None \n", - "1 ... None None None None \n", - "2 ... af0157e3-d7f0-4068-9a8a-e51a0a77d260 None None None \n", - "3 ... 99de2a12-20eb-45ae-b189-a793b63e6ab5 None None None \n", - "4 ... None None None None \n", - ".. ... ... ... ... ... \n", - "994 ... d10bbbf9-4255-42f0-bab1-0267f8d0d009 None None None \n", - "995 ... None None None None \n", - "996 ... None None None None \n", - "997 ... None None None None \n", - "998 ... None None None None \n", - "\n", - " date_end components primary_software_components \\\n", - "0 2024-03-20T04:15:26.769000 [AuxTel] [None] \n", - "1 2024-04-24T20:53:41.843000 [MainTel] [None] \n", - "2 2024-06-19T01:59:08.706000 [AuxTel] [None] \n", - "3 2024-08-21T04:04:38.053000 [AuxTel] [None] \n", - "4 2023-11-21T19:51:54.868000 [MainTel] [None] \n", - ".. ... ... ... \n", - "994 2024-03-13T04:51:31.209000 [MainTel] [None] \n", - "995 2023-12-27T21:12:33.991000 [MainTel] [None] \n", - "996 2024-03-04T22:40:24.642000 None [None] \n", - "997 2024-05-27T23:16:22.284000 [AuxTel] [None] \n", - "998 2024-01-10T20:53:36.828000 [MainTel] [None] \n", - "\n", - " primary_hardware_components category time_lost_type \n", - "0 [None] None fault \n", - "1 [None] None fault \n", - "2 [None] None fault \n", - "3 [None] None fault \n", - "4 [None] None fault \n", - ".. ... ... ... \n", - "994 [None] None fault \n", - "995 [None] None fault \n", - "996 [None] None fault \n", - "997 [None] None fault \n", - "998 [None] None fault \n", - "\n", - "[999 rows x 24 columns]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.DataFrame(recs)\n", "df" @@ -1133,7 +257,7 @@ }, { "cell_type": "markdown", - "id": "16", + "id": "17", "metadata": {}, "source": [ "\n", @@ -1142,21 +266,10 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "17", + "execution_count": null, + "id": "18", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "x = [r['date_added'] for r in recs]\n", "y = [r['time_lost'] for r in recs]\n", @@ -1166,7 +279,7 @@ }, { "cell_type": "markdown", - "id": "18", + "id": "19", "metadata": {}, "source": [ "\n", @@ -1175,7 +288,7 @@ }, { "cell_type": "markdown", - "id": "e1447b6f-4061-4e7e-9129-ee42a8adee29", + "id": "20", "metadata": {}, "source": [ "### Example of one record" @@ -1183,64 +296,20 @@ }, { "cell_type": "code", - "execution_count": 34, - "id": "51c18ed6-02b4-4e9d-8afa-ff8109bdbfbb", + "execution_count": null, + "id": "21", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': '21ebee65-b30b-4620-ac1c-a2235d27f907',\n", - " 'site_id': 'summit',\n", - " 'message_text': \"OSS didn't turned on, we got a timeout.\\r\\n\",\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-01-10T20:53:36.828000',\n", - " 'user_id': 'jseron@love01.cp.lsst.org',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-01-10T20:54:21.685248',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-01-10T20:53:36.828000',\n", - " 'components': ['MainTel'],\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'}" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "display(recs[-1])" ] }, { "cell_type": "code", - "execution_count": 35, - "id": "21", + "execution_count": null, + "id": "22", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "Message text from log:\n", - "> OSS didn't turned on, we got a timeout.\r\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "msg = rec[\"message_text\"]\n", "md = f'Message text from log:\\n> {msg}'\n", @@ -1249,7 +318,7 @@ }, { "cell_type": "markdown", - "id": "22", + "id": "23", "metadata": {}, "source": [ "\n", @@ -1259,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23", + "id": "24", "metadata": {}, "outputs": [], "source": [] From 3b170726907f2c3933e8e622109e4b55ecff6ab6 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Wed, 28 Aug 2024 07:18:55 -0700 Subject: [PATCH 13/17] WIP --- notebooks_tsqr/TEMPLATE_logrep.ipynb | 1120 +++++++++++++- notebooks_tsqr/TEMPLATE_logrep.yaml | 2 +- notebooks_tsqr/exposurelog.ipynb | 2131 +++++++++++++++++++++++++- notebooks_tsqr/narrativelog.ipynb | 772 +++++++++- 4 files changed, 3877 insertions(+), 148 deletions(-) diff --git a/notebooks_tsqr/TEMPLATE_logrep.ipynb b/notebooks_tsqr/TEMPLATE_logrep.ipynb index 89b0795..488dd6f 100644 --- a/notebooks_tsqr/TEMPLATE_logrep.ipynb +++ b/notebooks_tsqr/TEMPLATE_logrep.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "0", "metadata": {}, "outputs": [], @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "2", "metadata": {}, "outputs": [], @@ -35,15 +35,27 @@ "from pprint import pp, pformat\n", "from urllib.parse import urlencode\n", "from IPython.display import FileLink, display_markdown\n", - "from matplotlib import pyplot as plt" + "from matplotlib import pyplot as plt\n", + "import os" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'https://tucson-teststand.lsst.codes/narrativelog'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", "log_name = 'narrativelog'\n", @@ -54,19 +66,8 @@ "\n", "timeout = (float(response_timeout), float(read_timeout))\n", "\n", - "# Env list comes from drop-down menu top of:\n", - "# https://rsp.lsst.io/v/usdfdev/guides/times-square/\n", - "envs = dict(\n", - " #rubin_usdf_dev = '',\n", - " #data_lsst_cloud = '',\n", - " #usdf = '',\n", - " #base_data_facility = '',\n", - " summit = 'https://summit-lsp.lsst.codes',\n", - " usdf_dev = 'https://usdf-rsp-dev.slac.stanford.edu',\n", - " #rubin_idf_int = '',\n", - " tucson = 'https://tucson-teststand.lsst.codes',\n", - ")\n", - "server = envs[env]\n", + "server = os.environ.get('EXTERNAL_INSTANCE_URL', \n", + " 'https://tucson-teststand.lsst.codes')\n", "service = f'{server}/{log}'\n", "service" ] @@ -82,10 +83,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "### Will retrieve from https://tucson-teststand.lsst.codes/narrativelog" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "md = f'### Will retrieve from {service}'\n", "display_markdown(md, raw=True)" @@ -93,7 +104,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "6", "metadata": {}, "outputs": [], @@ -121,20 +132,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "## Get (up to 999) Records" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "display_markdown(f'## Get (up to {limit}) Records', raw=True)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempt to get logs from url='https://tucson-teststand.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=999'\n", + "Retrieved 138 records, each with 24 fields.\n" + ] + } + ], "source": [ "# TODO Often fails on first request. Find out why!\n", "try:\n", @@ -180,10 +210,168 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "11", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Field Name
0is_human
1category
2date_invalidated
3parent_id
4time_lost
5systems
6components
7id
8primary_hardware_components
9cscs
10subsystems
11time_lost_type
12date_added
13tags
14date_end
15date_begin
16urls
17primary_software_components
18user_agent
19is_valid
20level
21site_id
22message_text
23user_id
\n", + "
" + ], + "text/plain": [ + " Field Name\n", + "0 is_human\n", + "1 category\n", + "2 date_invalidated\n", + "3 parent_id\n", + "4 time_lost\n", + "5 systems\n", + "6 components\n", + "7 id\n", + "8 primary_hardware_components\n", + "9 cscs\n", + "10 subsystems\n", + "11 time_lost_type\n", + "12 date_added\n", + "13 tags\n", + "14 date_end\n", + "15 date_begin\n", + "16 urls\n", + "17 primary_software_components\n", + "18 user_agent\n", + "19 is_valid\n", + "20 level\n", + "21 site_id\n", + "22 message_text\n", + "23 user_id" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "pd.DataFrame(flds, columns=['Field Name'])" ] @@ -199,14 +387,165 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "13", "metadata": { "jupyter": { "source_hidden": true } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
time_lost_typefaultNoneNone
systemsNoneNoneNone
componentsNoneNoneNone
is_humanTrueFalseNone
categoryNoneNoneNone
primary_software_componentsNoneNoneNone
user_agentmake_log_entrystringLOVE
is_validTrueFalseNone
level1000None
primary_hardware_componentsNoneNoneNone
site_idtucsonNoneNone
cscsNoneNoneNone
subsystemsNoneNoneNone
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "time_lost_type fault None None\n", + "systems None None None\n", + "components None None None\n", + "is_human True False None\n", + "category None None None\n", + "primary_software_components None None None\n", + "user_agent make_log_entry string LOVE\n", + "is_valid True False None\n", + "level 100 0 None\n", + "primary_hardware_components None None None\n", + "site_id tucson None None\n", + "cscs None None None\n", + "subsystems None None None" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'time_lost_type': {'None', 'fault'},\n", + " 'systems': {'None'},\n", + " 'components': {'None'},\n", + " 'is_human': {'False', 'True'},\n", + " 'category': {'None'},\n", + " 'primary_software_components': {'None'},\n", + " 'user_agent': {'LOVE', 'make_log_entry', 'string'},\n", + " 'is_valid': {'False', 'True'},\n", + " 'level': {'0', '100'},\n", + " 'primary_hardware_components': {'None'},\n", + " 'site_id': {'tucson'},\n", + " 'cscs': {'None'},\n", + " 'subsystems': {'None'}}" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "display(pd.DataFrame.from_dict(facets, orient='index'))\n", "display(facets)" @@ -223,14 +562,141 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "15", "metadata": { "jupyter": { "source_hidden": true } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Table available as CSV file: \n" + ] + }, + { + "data": { + "text/html": [ + "tl.csv
" + ], + "text/plain": [ + "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
date_addedtime_lost
02024-08-15T17:54:06.5674180.00
12023-01-19T22:57:39.5612930.00
22024-08-16T14:50:09.5070730.00
32023-07-19T15:28:22.02790024.00
42024-08-15T18:08:13.5480590.00
.........
1332022-11-30T02:19:07.3167850.00
1342024-08-16T15:03:39.9964730.00
1352023-05-09T17:26:25.05248724.01
1362024-08-15T20:02:54.2999980.00
1372024-08-23T18:16:32.7167420.00
\n", + "

138 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " date_added time_lost\n", + "0 2024-08-15T17:54:06.567418 0.00\n", + "1 2023-01-19T22:57:39.561293 0.00\n", + "2 2024-08-16T14:50:09.507073 0.00\n", + "3 2023-07-19T15:28:22.027900 24.00\n", + "4 2024-08-15T18:08:13.548059 0.00\n", + ".. ... ...\n", + "133 2022-11-30T02:19:07.316785 0.00\n", + "134 2024-08-16T15:03:39.996473 0.00\n", + "135 2023-05-09T17:26:25.052487 24.01\n", + "136 2024-08-15T20:02:54.299998 0.00\n", + "137 2024-08-23T18:16:32.716742 0.00\n", + "\n", + "[138 rows x 2 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cols = ['date_added', 'time_lost']\n", "df = pd.DataFrame(recs)[cols]\n", @@ -246,10 +712,424 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "16", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsite_idmessage_textleveltagsurlstime_lostdate_beginuser_iduser_agent...parent_idsystemssubsystemscscsdate_endcomponentsprimary_software_componentsprimary_hardware_componentscategorytime_lost_type
001806d0e-c21a-4e2e-8a53-1db4e8f88c0btucsonWubba. Using do_makeLogEntry; vr=0.10[watcher, alarm][]0.002024-08-15T12:44:06.456000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-15T12:44:06.456000NoneNoneNoneNoneNone
105b046b7-1266-47a9-b1de-93b6d44af242tucson0[][]0.002023-01-19T22:50:03.167000admin@love1.tu.lsst.orgLOVE...None[][][]2023-01-19T22:50:03.167000NoneNoneNoneNoneNone
20656b9b5-ccf5-48d2-a712-7e78dd26a64dtucsonWubba. Using do_makeLogEntry {vr=}0[watcher, alarm, wubba][]0.002024-08-16T14:49:32.376667admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-16T14:49:32.376667NoneNoneNoneNoneNone
30829537a-9cef-4f93-8566-7d66532e2184tucsonNarrative log test0[observatorysoftwaretools, love][]24.002023-07-18T15:24:01.754000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2023-07-19T15:24:01.754000NoneNoneNoneNoneNone
408d53806-964c-45cc-981b-d4920b5a1763tucsonWubba. Using do_makeLogEntry; vr=0.10[watcher, alarm][]0.002024-08-15T12:44:06.456000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-15T12:44:06.456000NoneNoneNoneNoneNone
..................................................................
133f73cd42f-543f-4ac7-bfad-a572808e1305tucsonComCam is whack.0[][]0.002022-11-29T02:17:35.179000admin@love1.tu.lsst.orgLOVE...None[ComCam][Hardware][]2022-11-30T02:17:35.179000NoneNoneNoneNoneNone
134f7594406-2ff7-4d9e-9063-3b768e971b1btucsonWubba. Using do_makeLogEntry {vr=}0[watcher, alarm, wubba][]0.002024-08-16T15:03:02.869590admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-16T15:03:02.869590NoneNoneNoneNoneNone
135f9e93e6a-9d13-471e-aa61-215769f56653tucsonInria narrative log test 30[observatorysoftwaretools, love][]24.012023-05-08T17:24:56.463000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2023-05-09T17:25:33.463000NoneNoneNoneNoneNone
136fe5c59d7-6e34-4144-abe6-48f398a1d45dtucsonWubba. Using do_makeLogEntry; vr=0.20[watcher, alarm][]0.002024-08-15T12:54:06.456000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-15T12:54:06.456000NoneNoneNoneNoneNone
137ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5tucsonTesting ampersan &Test&\\r\\n0[][]0.002024-08-23T18:15:55.678000saranda@tucson-teststand.lsst.codesLOVE...NoneNoneNoneNone2024-08-23T18:15:55.678000None[None][None]Nonefault
\n", + "

138 rows × 24 columns

\n", + "
" + ], + "text/plain": [ + " id site_id \\\n", + "0 01806d0e-c21a-4e2e-8a53-1db4e8f88c0b tucson \n", + "1 05b046b7-1266-47a9-b1de-93b6d44af242 tucson \n", + "2 0656b9b5-ccf5-48d2-a712-7e78dd26a64d tucson \n", + "3 0829537a-9cef-4f93-8566-7d66532e2184 tucson \n", + "4 08d53806-964c-45cc-981b-d4920b5a1763 tucson \n", + ".. ... ... \n", + "133 f73cd42f-543f-4ac7-bfad-a572808e1305 tucson \n", + "134 f7594406-2ff7-4d9e-9063-3b768e971b1b tucson \n", + "135 f9e93e6a-9d13-471e-aa61-215769f56653 tucson \n", + "136 fe5c59d7-6e34-4144-abe6-48f398a1d45d tucson \n", + "137 ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5 tucson \n", + "\n", + " message_text level \\\n", + "0 Wubba. Using do_makeLogEntry; vr=0.1 0 \n", + "1 0 \n", + "2 Wubba. Using do_makeLogEntry {vr=} 0 \n", + "3 Narrative log test 0 \n", + "4 Wubba. Using do_makeLogEntry; vr=0.1 0 \n", + ".. ... ... \n", + "133 ComCam is whack. 0 \n", + "134 Wubba. Using do_makeLogEntry {vr=} 0 \n", + "135 Inria narrative log test 3 0 \n", + "136 Wubba. Using do_makeLogEntry; vr=0.2 0 \n", + "137 Testing ampersan &Test&\\r\\n 0 \n", + "\n", + " tags urls time_lost \\\n", + "0 [watcher, alarm] [] 0.00 \n", + "1 [] [] 0.00 \n", + "2 [watcher, alarm, wubba] [] 0.00 \n", + "3 [observatorysoftwaretools, love] [] 24.00 \n", + "4 [watcher, alarm] [] 0.00 \n", + ".. ... ... ... \n", + "133 [] [] 0.00 \n", + "134 [watcher, alarm, wubba] [] 0.00 \n", + "135 [observatorysoftwaretools, love] [] 24.01 \n", + "136 [watcher, alarm] [] 0.00 \n", + "137 [] [] 0.00 \n", + "\n", + " date_begin user_id \\\n", + "0 2024-08-15T12:44:06.456000 admin@love1.tu.lsst.org \n", + "1 2023-01-19T22:50:03.167000 admin@love1.tu.lsst.org \n", + "2 2024-08-16T14:49:32.376667 admin@love1.tu.lsst.org \n", + "3 2023-07-18T15:24:01.754000 admin@love1.tu.lsst.org \n", + "4 2024-08-15T12:44:06.456000 admin@love1.tu.lsst.org \n", + ".. ... ... \n", + "133 2022-11-29T02:17:35.179000 admin@love1.tu.lsst.org \n", + "134 2024-08-16T15:03:02.869590 admin@love1.tu.lsst.org \n", + "135 2023-05-08T17:24:56.463000 admin@love1.tu.lsst.org \n", + "136 2024-08-15T12:54:06.456000 admin@love1.tu.lsst.org \n", + "137 2024-08-23T18:15:55.678000 saranda@tucson-teststand.lsst.codes \n", + "\n", + " user_agent ... parent_id systems subsystems cscs \\\n", + "0 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", + "1 LOVE ... None [] [] [] \n", + "2 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", + "3 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", + "4 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", + ".. ... ... ... ... ... ... \n", + "133 LOVE ... None [ComCam] [Hardware] [] \n", + "134 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", + "135 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", + "136 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", + "137 LOVE ... None None None None \n", + "\n", + " date_end components primary_software_components \\\n", + "0 2024-08-15T12:44:06.456000 None None \n", + "1 2023-01-19T22:50:03.167000 None None \n", + "2 2024-08-16T14:49:32.376667 None None \n", + "3 2023-07-19T15:24:01.754000 None None \n", + "4 2024-08-15T12:44:06.456000 None None \n", + ".. ... ... ... \n", + "133 2022-11-30T02:17:35.179000 None None \n", + "134 2024-08-16T15:03:02.869590 None None \n", + "135 2023-05-09T17:25:33.463000 None None \n", + "136 2024-08-15T12:54:06.456000 None None \n", + "137 2024-08-23T18:15:55.678000 None [None] \n", + "\n", + " primary_hardware_components category time_lost_type \n", + "0 None None None \n", + "1 None None None \n", + "2 None None None \n", + "3 None None None \n", + "4 None None None \n", + ".. ... ... ... \n", + "133 None None None \n", + "134 None None None \n", + "135 None None None \n", + "136 None None None \n", + "137 [None] None fault \n", + "\n", + "[138 rows x 24 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = pd.DataFrame(recs)\n", "df" @@ -266,10 +1146,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "18", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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6lOf0q5du2LW6evr06pVq1RVVaXS0lKtWLFCbW1tMes0NTVp+fLlKi4uVnV1te68804NDQ1l86VgDJhtTO0lpiGSKQAArsj5YLp582atWrVK27Zt08aNGzU4OKglS5aop6fHWueOO+7Q008/rSeeeEKbN29Wc3OzPv3pT1v3B4NBLV++XAMDA9qyZYseffRRPfLII7rnnnvG4iUhi8wxS/Po/AQAgOvyxnoH3Pbcc8/FXH/kkUdUXV2tHTt26IorrlBHR4d+9KMfaf369frYxz4mSXr44Yd17rnnatu2bbrsssv0m9/8Ru+++65eeOEF1dTU6MILL9TXv/513XXXXfra174mv98/Fi8NWWC2J/V6PfJ6wtX4QYIpAACuyPkS03gdHR2SpMrKSknSjh07NDg4qMWLF1vrzJkzRzNmzNDWrVslSVu3btW8efNUU1NjrbN06VJ1dnbqnXfeSfo8/f396uzsjFlw+jFDqNfjkdcTLjUllwIA4I4JFUxDoZC+9KUvadGiRTr//PMlSa2trfL7/aqoqIhZt6amRq2trdY69lBq3m/el8y6detUXl5uLfX19aP8apANZgj1eTzyRqrz6ZUPAIA7JlQwXbVqld5++209/vjjrj/X2rVr1dHRYS0HDx50/Tkx+swQ6vFIZjNT2pgCAOCOnG9jalq9erU2bNigl19+WdOnT7dur62t1cDAgNrb22NKTdva2lRbW2ut88orr8Rsz+y1b64Tr6CgQAUFBaP8KpBtZgj1eT3yRaryQ6Gx3CMAAHJXzpeYGoah1atX68knn9SLL76oWbNmxdy/YMEC5efna9OmTdZtu3btUlNTkxobGyVJjY2N2rlzpw4fPmyts3HjRgUCAc2dOzc7LwRjIpSkjSklpgAAuCPnS0xXrVql9evX65e//KXKysqsNqHl5eUqKipSeXm5brrpJq1Zs0aVlZUKBAK6/fbb1djYqMsuu0yStGTJEs2dO1ef//zndf/996u1tVV33323Vq1aRalojjNLR71eWxtTgikAAK7I+WD64IMPSpKuvPLKmNsffvhhfeELX5Akfec735HX69WKFSvU39+vpUuX6oc//KG1rs/n04YNG3TbbbepsbFRJSUlWrlype67775svQyMkWiv/GgbU4NgCgCAK3I+mGYSIgoLC/XAAw/ogQcecFynoaFBzzzzzGjuGk4D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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "x = [r['date_added'] for r in recs]\n", "y = [r['time_lost'] for r in recs]\n", @@ -296,24 +1187,61 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "21", - "metadata": {}, - "outputs": [], - "source": [ - "display(recs[-1])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22", + "execution_count": 13, + "id": "cb254bc8-b764-417f-ae51-bd816c6b7ddf", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "Message text from log:\n", + "> Testing ampersan &Test&\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'id': 'ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5',\n", + " 'site_id': 'tucson',\n", + " 'message_text': 'Testing ampersan &Test&\\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-08-23T18:15:55.678000',\n", + " 'user_id': 'saranda@tucson-teststand.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-08-23T18:16:32.716742',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-08-23T18:15:55.678000',\n", + " 'components': None,\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'}" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ + "rec = recs[-1]\n", + "\n", "msg = rec[\"message_text\"]\n", "md = f'Message text from log:\\n> {msg}'\n", - "display_markdown(md, raw=True)" + "display_markdown(md, raw=True)\n", + "\n", + "display(rec)" ] }, { @@ -325,10 +1253,102 @@ "## Stakeholder Elicitation" ] }, + { + "cell_type": "code", + "execution_count": 15, + "id": "111abb6b-5e2b-4c44-b780-7844bd7f63fb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0\n", + "SHELL /bin/bash\n", + "SESSION_MANAGER local/chimp20:@/tmp/.ICE-unix/6143,unix/chimp2...\n", + "QT_ACCESSIBILITY 1\n", + "XDG_CONFIG_DIRS /etc/xdg/xdg-mate:/etc/xdg\n", + "XDG_SESSION_PATH /org/freedesktop/DisplayManager/Session0\n", + "GTK_IM_MODULE ibus\n", + "LANGUAGE en_US\n", + "TERMCAP \n", + "SSH_AUTH_SOCK /run/user/1000/keyring/ssh\n", + "INSIDE_EMACS 29.4,comint\n", + "XMODIFIERS @im=ibus\n", + "DESKTOP_SESSION mate\n", + "EDITOR /usr/bin/emacsclient\n", + "GTK_MODULES appmenu-gtk-module:gail:atk-bridge:canberra-gt...\n", + "XDG_SEAT seat0\n", + "MATE_DESKTOP_SESSION_ID this-is-deprecated\n", + "SNAP_EUID 1000\n", + "PWD /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "GSETTINGS_SCHEMA_DIR /home/pothiers/snap/emacs/common/.local/share/...\n", + "XDG_SESSION_DESKTOP mate\n", + "LOGNAME pothiers\n", + "QT_QPA_PLATFORMTHEME gtk2\n", + "XDG_SESSION_TYPE x11\n", + "GPG_AGENT_INFO /run/user/1000/gnupg/S.gpg-agent:0:1\n", + "XAUTHORITY /home/pothiers/.Xauthority\n", + "XDG_GREETER_DATA_DIR /var/lib/lightdm-data/pothiers\n", + "GDM_LANG en_US\n", + "HOME /home/pothiers\n", + "LANG en_US.UTF-8\n", + "LS_COLORS \n", + "XDG_CURRENT_DESKTOP MATE\n", + "COLUMNS 80\n", + "EMACS_SNAP_DIR /snap/emacs/2504\n", + "VIRTUAL_ENV /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "XDG_SEAT_PATH /org/freedesktop/DisplayManager/Seat0\n", + "SNAP_UID 1000\n", + "CLUTTER_IM_MODULE ibus\n", + "LESSCLOSE /usr/bin/lesspipe %s %s\n", + "XDG_SESSION_CLASS user\n", + "TERM xterm-color\n", + "GTK_OVERLAY_SCROLLING 0\n", + "LESSOPEN | /usr/bin/lesspipe %s\n", + "USER pothiers\n", + "GIT_PAGER cat\n", + "DISPLAY :0\n", + "SHLVL 1\n", + "QT_IM_MODULE ibus\n", + "XDG_VTNR 7\n", + "UBUNTU_MENUPROXY 1\n", + "XDG_SESSION_ID c2\n", + "VIRTUAL_ENV_PROMPT (venv) \n", + "XDG_RUNTIME_DIR /run/user/1000\n", + "COMPIZ_CONFIG_PROFILE mate\n", + "PS1 (venv) ${debian_chroot:+($debian_chroot)}\\u@\\h...\n", + "XDG_DATA_DIRS /snap/emacs/2504/usr/share:/usr/share/mate:/us...\n", + "PATH /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "GDMSESSION mate\n", + "DBUS_SESSION_BUS_ADDRESS unix:path=/run/user/1000/bus\n", + "QT_FONT_DPI 96\n", + "QT_SCALE_FACTOR 1\n", + "GIO_LAUNCHED_DESKTOP_FILE_PID 19241\n", + "OLDPWD /home/pothiers/sandbox/ts_logging_and_reporting\n", + "_ /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "JPY_SESSION_NAME /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "JPY_PARENT_PID 431334\n", + "PYDEVD_USE_FRAME_EVAL NO\n", + "CLICOLOR 1\n", + "FORCE_COLOR 1\n", + "CLICOLOR_FORCE 1\n", + "PAGER cat\n", + "MPLBACKEND module://matplotlib_inline.backend_inline\n" + ] + } + ], + "source": [ + "#EXTERNAL_INSTANCE_URL\n", + "ed = dict(os.environ.items())\n", + "with pd.option_context('display.max_rows', None,):\n", + " print(pd.DataFrame(ed.values(), index=ed.keys()))" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "24", + "id": "e5ef7955-76f8-4c7f-9b3a-9f436ef1f7f7", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks_tsqr/TEMPLATE_logrep.yaml b/notebooks_tsqr/TEMPLATE_logrep.yaml index ada7411..c6eb836 100644 --- a/notebooks_tsqr/TEMPLATE_logrep.yaml +++ b/notebooks_tsqr/TEMPLATE_logrep.yaml @@ -1,5 +1,5 @@ # For use with a Times Square notebook -title: LR mix +title: TEMPLATE for LR description: Prototype 1 authors: - name: Steve Pothier diff --git a/notebooks_tsqr/exposurelog.ipynb b/notebooks_tsqr/exposurelog.ipynb index a29966d..5a237c9 100644 --- a/notebooks_tsqr/exposurelog.ipynb +++ b/notebooks_tsqr/exposurelog.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "0", "metadata": {}, "outputs": [], @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "2", "metadata": {}, "outputs": [], @@ -34,19 +34,29 @@ "import pandas as pd\n", "from pprint import pp\n", "from urllib.parse import urlencode\n", - "from IPython.display import FileLink\n", + "from IPython.display import FileLink, display_markdown\n", "from matplotlib import pyplot as plt\n", "import os" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'https://tucson-teststand.lsst.codes/exposurelog'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "\n", "limit = int(record_limit)\n", "\n", "response_timeout = 3.05 # seconds, how long to wait for connection\n", @@ -71,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "5", "metadata": {}, "outputs": [], @@ -108,10 +118,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempt to get logs from url='https://tucson-teststand.lsst.codes/exposurelog/messages?is_human=either&is_valid=either&limit=999'\n", + "Retrieved 21 records, each with numf=18 fields.\n" + ] + } + ], "source": [ "try:\n", " print(f'Attempt to get logs from {url=}')\n", @@ -151,10 +170,138 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "10", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Field Name
0seq_num
1urls
2site_id
3exposure_flag
4date_invalidated
5user_id
6is_human
7message_text
8day_obs
9instrument
10date_added
11is_valid
12parent_id
13obs_id
14level
15user_agent
16id
17tags
\n", + "
" + ], + "text/plain": [ + " Field Name\n", + "0 seq_num\n", + "1 urls\n", + "2 site_id\n", + "3 exposure_flag\n", + "4 date_invalidated\n", + "5 user_id\n", + "6 is_human\n", + "7 message_text\n", + "8 day_obs\n", + "9 instrument\n", + "10 date_added\n", + "11 is_valid\n", + "12 parent_id\n", + "13 obs_id\n", + "14 level\n", + "15 user_agent\n", + "16 id\n", + "17 tags" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "pd.DataFrame(flds, columns=['Field Name'])" ] @@ -170,10 +317,99 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "12", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
exposure_flagnonequestionablejunk
site_idtucsonNoneNone
is_humanTrueNoneNone
instrumentLATISSLSSTComCamNone
level10NoneNone
user_agentLOVENoneNone
is_validFalseTrueNone
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "exposure_flag none questionable junk\n", + "site_id tucson None None\n", + "is_human True None None\n", + "instrument LATISS LSSTComCam None\n", + "level 10 None None\n", + "user_agent LOVE None None\n", + "is_valid False True None" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "pd.DataFrame.from_dict(facets, orient='index')" ] @@ -189,12 +425,307 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "14", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Table available as CSV file: \n" + ] + }, + { + "data": { + "text/html": [ + "tl.csv
" + ], + "text/plain": [ + "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
obs_iduser_iduser_agentis_humanis_validexposure_flag
0AT_O_20221129_000001admin@love1.tu.lsst.orgLOVETrueTruejunk
1AT_C_20230613_000001admin@love1.tu.lsst.orgLOVETrueFalsenone
2AT_O_20230906_000003tribeiro@tucson-teststand.lsst.codesLOVETrueTruequestionable
3AT_C_20230613_000001admin@love1.tu.lsst.orgLOVETrueFalsenone
4AT_O_20230906_000003admin@localhostLOVETrueTruenone
5AT_O_20221129_000001admin@love1.tu.lsst.orgLOVETrueTruequestionable
6AT_O_20221115_000020admin@love1.tu.lsst.orgLOVETrueTruequestionable
7AT_O_20221115_000023admin@love1.tu.lsst.orgLOVETrueTruenone
8AT_O_20230830_000003admin@localhostLOVETrueFalsenone
9AT_O_20230830_000003admin@localhostLOVETrueFalsenone
10AT_O_20240822_000010saranda@tucson-teststand.lsst.codesLOVETrueTruenone
11AT_O_20230830_000003admin@localhostLOVETrueTruenone
12AT_O_20220929_000031admin@localhostLOVETrueTruejunk
13AT_O_20220929_000031admin@localhostLOVETrueTruenone
14AT_O_20230207_000003admin@love1.tu.lsst.orgLOVETrueTruenone
15AT_O_20221115_000020admin@love1.tu.lsst.orgLOVETrueTruequestionable
16AT_C_20230613_000001admin@love1.tu.lsst.orgLOVETrueTruenone
17AT_O_20230830_000003admin@localhostLOVETrueTruenone
18AT_O_20221115_000022admin@love1.tu.lsst.orgLOVETrueTruequestionable
19AT_O_20221129_000001admin@love1.tu.lsst.orgLOVETrueTruequestionable
20AT_O_20221115_000019admin@love1.tu.lsst.orgLOVETrueTruequestionable
\n", + "
" + ], + "text/plain": [ + " obs_id user_id user_agent \\\n", + "0 AT_O_20221129_000001 admin@love1.tu.lsst.org LOVE \n", + "1 AT_C_20230613_000001 admin@love1.tu.lsst.org LOVE \n", + "2 AT_O_20230906_000003 tribeiro@tucson-teststand.lsst.codes LOVE \n", + "3 AT_C_20230613_000001 admin@love1.tu.lsst.org LOVE \n", + "4 AT_O_20230906_000003 admin@localhost LOVE \n", + "5 AT_O_20221129_000001 admin@love1.tu.lsst.org LOVE \n", + "6 AT_O_20221115_000020 admin@love1.tu.lsst.org LOVE \n", + "7 AT_O_20221115_000023 admin@love1.tu.lsst.org LOVE \n", + "8 AT_O_20230830_000003 admin@localhost LOVE \n", + "9 AT_O_20230830_000003 admin@localhost LOVE \n", + "10 AT_O_20240822_000010 saranda@tucson-teststand.lsst.codes LOVE \n", + "11 AT_O_20230830_000003 admin@localhost LOVE \n", + "12 AT_O_20220929_000031 admin@localhost LOVE \n", + "13 AT_O_20220929_000031 admin@localhost LOVE \n", + "14 AT_O_20230207_000003 admin@love1.tu.lsst.org LOVE \n", + "15 AT_O_20221115_000020 admin@love1.tu.lsst.org LOVE \n", + "16 AT_C_20230613_000001 admin@love1.tu.lsst.org LOVE \n", + "17 AT_O_20230830_000003 admin@localhost LOVE \n", + "18 AT_O_20221115_000022 admin@love1.tu.lsst.org LOVE \n", + "19 AT_O_20221129_000001 admin@love1.tu.lsst.org LOVE \n", + "20 AT_O_20221115_000019 admin@love1.tu.lsst.org LOVE \n", + "\n", + " is_human is_valid exposure_flag \n", + "0 True True junk \n", + "1 True False none \n", + "2 True True questionable \n", + "3 True False none \n", + "4 True True none \n", + "5 True True questionable \n", + "6 True True questionable \n", + "7 True True none \n", + "8 True False none \n", + "9 True False none \n", + "10 True True none \n", + "11 True True none \n", + "12 True True junk \n", + "13 True True none \n", + "14 True True none \n", + "15 True True questionable \n", + "16 True True none \n", + "17 True True none \n", + "18 True True questionable \n", + "19 True True questionable \n", + "20 True True questionable " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "cols = ['date_added', 'time_lost']\n", + "cols = ['obs_id', 'user_id', 'user_agent','is_human','is_valid','exposure_flag']\n", "df = pd.DataFrame(recs)[cols]\n", "\n", "# Allow download of CSV version of DataFrame\n", @@ -208,15 +739,1383 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "15", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsite_idobs_idinstrumentday_obsseq_nummessage_textleveltagsurlsuser_iduser_agentis_humanis_validexposure_flagdate_addeddate_invalidatedparent_id
00076ce05-752f-46df-b8a5-90ffd51d612etucsonAT_O_20221129_000001LSSTComCam202211291this was a test image for LOVE LVV November te...10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruejunk2022-11-30T02:13:46.847038NoneNone
11e61fbbe-cb87-45f2-88be-cb6647b0cd43tucsonAT_C_20230613_000001LATISS202306131Exposure log creation test10[undefined][]admin@love1.tu.lsst.orgLOVETrueFalsenone2023-07-18T22:13:41.2285102023-07-18T22:15:14.006037None
221fc4a19-37af-42c1-b475-c6cd26df21b5tucsonAT_O_20230906_000003LATISS202309063Testing exposure log in OLE!\\r\\n10[undefined][]tribeiro@tucson-teststand.lsst.codesLOVETrueTruequestionable2024-01-20T21:44:20.605672NoneNone
324ce7289-36ae-49f8-ac17-044296a6e7d7tucsonAT_C_20230613_000001LATISS202306131Exposure log test10[undefined][]admin@love1.tu.lsst.orgLOVETrueFalsenone2023-07-18T22:16:40.4409622023-07-18T22:53:40.503894None
428783f56-b5cb-4f1f-a66e-993c6d8d384etucsonAT_O_20230906_000003LATISS202309063Add 1 log from upper panel with 1 tag and 1 file10[ticketed_issue][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T15:25:00.394949NoneNone
537b1ecb2-5f15-4bdb-8fa9-d7fdae7a1658tucsonAT_O_20221129_000001LATISS202211291This is another test message10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-30T02:53:02.671106NoneNone
6490b3fc8-3775-41c1-b7a6-19b881e6d333tucsonAT_O_20221115_000020LATISS2022111520weird detector issue10[camera_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-15T23:35:31.497612NoneNone
7575d30c4-0b75-4ead-bf3f-6ed58f554468tucsonAT_O_20221115_000023LATISS2022111723LOVE test10[bright_artifact, background_issue][]admin@love1.tu.lsst.orgLOVETrueTruenone2022-11-17T20:53:55.058907NoneNone
858e6cdb9-5945-4175-aa84-f64622ddb5f4tucsonAT_O_20230830_000003LATISS202308303test log\\r\\n\\r\\nUpdate 1: add 4th file10[undefined][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueFalsenone2023-09-06T22:20:59.0617592023-09-07T14:51:04.96040558f06d12-da95-4505-9729-5f388cc60703
958f06d12-da95-4505-9729-5f388cc60703tucsonAT_O_20230830_000003LATISS202308303test log10[undefined][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueFalsenone2023-09-06T16:27:02.9417202023-09-06T22:20:59.061759None
107a550d27-16d4-48a0-bcab-8328b1a7adabtucsonAT_O_20240822_000010LATISS2024082210Testing ampersan &amp;Test&amp;\\r\\n10[undefined][]saranda@tucson-teststand.lsst.codesLOVETrueTruenone2024-08-23T18:23:24.840967NoneNone
117e53f5b9-2173-453f-ba77-552c0c907fc7tucsonAT_O_20230830_000003LATISS202308303test log\\r\\n\\r\\nUpdate 1: add 4th file\\r\\nUpda...10[background_issue, bad_psf_movement, bright_ar...[https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T14:51:04.960405None58e6cdb9-5945-4175-aa84-f64622ddb5f4
128f196dbd-4200-469d-9498-e6adf3cff21dtucsonAT_O_20220929_000031LSSTComCam2022100631LOVE testing #210[undefined][]admin@localhostLOVETrueTruejunk2022-10-06T18:51:16.905173NoneNone
13a578755a-662b-45b6-b391-a9661e084800tucsonAT_O_20220929_000031LSSTComCam2022100631LOVE testing #110[undefined][]admin@localhostLOVETrueTruenone2022-10-06T18:50:25.039355NoneNone
14ac5ccfe2-a0d7-433e-b8f2-4db5ae182a4etucsonAT_O_20230207_000003LATISS202302133LOVE OLE test10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruenone2023-02-13T18:04:45.987029NoneNone
15ae4210d1-9f5a-48fb-945b-2df229eeca33tucsonAT_O_20221115_000020LATISS2022111520investigating banding issue10[background_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-16T04:57:30.898604NoneNone
16b48dbd8a-87f8-4a57-84a8-20990b068e29tucsonAT_C_20230613_000001LATISS202306131Exposure log test - edit 110[undefined][]admin@love1.tu.lsst.orgLOVETrueTruenone2023-07-18T22:53:40.503894None24ce7289-36ae-49f8-ac17-044296a6e7d7
17b7de0ab1-a289-4091-a7b5-8fcde3d2b448tucsonAT_O_20230830_000003LATISS202308303Adding 1 log with 1 tag and 1 file10[clouds][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T15:24:12.233843NoneNone
18bbdd0553-f917-43a9-a952-a95df472a44dtucsonAT_O_20221115_000022LATISS2022111522weird detector issue10[camera_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-15T23:35:31.172991NoneNone
19d37d0f1e-b989-4c5e-a795-16c44c6c00e2tucsonAT_O_20221129_000001LATISS202211291adding new message10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-30T02:15:01.922201NoneNone
20f9a4b932-18e9-47db-9b7d-a2fbe3c15e70tucsonAT_O_20221115_000019LATISS2022111519investigating banding issue10[background_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-16T04:57:30.954849NoneNone
\n", + "
" + ], + "text/plain": [ + " id site_id obs_id \\\n", + "0 0076ce05-752f-46df-b8a5-90ffd51d612e tucson AT_O_20221129_000001 \n", + "1 1e61fbbe-cb87-45f2-88be-cb6647b0cd43 tucson AT_C_20230613_000001 \n", + "2 21fc4a19-37af-42c1-b475-c6cd26df21b5 tucson AT_O_20230906_000003 \n", + "3 24ce7289-36ae-49f8-ac17-044296a6e7d7 tucson AT_C_20230613_000001 \n", + "4 28783f56-b5cb-4f1f-a66e-993c6d8d384e tucson AT_O_20230906_000003 \n", + "5 37b1ecb2-5f15-4bdb-8fa9-d7fdae7a1658 tucson AT_O_20221129_000001 \n", + "6 490b3fc8-3775-41c1-b7a6-19b881e6d333 tucson AT_O_20221115_000020 \n", + "7 575d30c4-0b75-4ead-bf3f-6ed58f554468 tucson AT_O_20221115_000023 \n", + "8 58e6cdb9-5945-4175-aa84-f64622ddb5f4 tucson AT_O_20230830_000003 \n", + "9 58f06d12-da95-4505-9729-5f388cc60703 tucson AT_O_20230830_000003 \n", + "10 7a550d27-16d4-48a0-bcab-8328b1a7adab tucson AT_O_20240822_000010 \n", + "11 7e53f5b9-2173-453f-ba77-552c0c907fc7 tucson AT_O_20230830_000003 \n", + "12 8f196dbd-4200-469d-9498-e6adf3cff21d tucson AT_O_20220929_000031 \n", + "13 a578755a-662b-45b6-b391-a9661e084800 tucson AT_O_20220929_000031 \n", + "14 ac5ccfe2-a0d7-433e-b8f2-4db5ae182a4e tucson AT_O_20230207_000003 \n", + "15 ae4210d1-9f5a-48fb-945b-2df229eeca33 tucson AT_O_20221115_000020 \n", + "16 b48dbd8a-87f8-4a57-84a8-20990b068e29 tucson AT_C_20230613_000001 \n", + "17 b7de0ab1-a289-4091-a7b5-8fcde3d2b448 tucson AT_O_20230830_000003 \n", + "18 bbdd0553-f917-43a9-a952-a95df472a44d tucson AT_O_20221115_000022 \n", + "19 d37d0f1e-b989-4c5e-a795-16c44c6c00e2 tucson AT_O_20221129_000001 \n", + "20 f9a4b932-18e9-47db-9b7d-a2fbe3c15e70 tucson AT_O_20221115_000019 \n", + "\n", + " instrument day_obs seq_num \\\n", + "0 LSSTComCam 20221129 1 \n", + "1 LATISS 20230613 1 \n", + "2 LATISS 20230906 3 \n", + "3 LATISS 20230613 1 \n", + "4 LATISS 20230906 3 \n", + "5 LATISS 20221129 1 \n", + "6 LATISS 20221115 20 \n", + "7 LATISS 20221117 23 \n", + "8 LATISS 20230830 3 \n", + "9 LATISS 20230830 3 \n", + "10 LATISS 20240822 10 \n", + "11 LATISS 20230830 3 \n", + "12 LSSTComCam 20221006 31 \n", + "13 LSSTComCam 20221006 31 \n", + "14 LATISS 20230213 3 \n", + "15 LATISS 20221115 20 \n", + "16 LATISS 20230613 1 \n", + "17 LATISS 20230830 3 \n", + "18 LATISS 20221115 22 \n", + "19 LATISS 20221129 1 \n", + "20 LATISS 20221115 19 \n", + "\n", + " message_text level \\\n", + "0 this was a test image for LOVE LVV November te... 10 \n", + "1 Exposure log creation test 10 \n", + "2 Testing exposure log in OLE!\\r\\n 10 \n", + "3 Exposure log test 10 \n", + "4 Add 1 log from upper panel with 1 tag and 1 file 10 \n", + "5 This is another test message 10 \n", + "6 weird detector issue 10 \n", + "7 LOVE test 10 \n", + "8 test log\\r\\n\\r\\nUpdate 1: add 4th file 10 \n", + "9 test log 10 \n", + "10 Testing ampersan &Test&\\r\\n 10 \n", + "11 test log\\r\\n\\r\\nUpdate 1: add 4th file\\r\\nUpda... 10 \n", + "12 LOVE testing #2 10 \n", + "13 LOVE testing #1 10 \n", + "14 LOVE OLE test 10 \n", + "15 investigating banding issue 10 \n", + "16 Exposure log test - edit 1 10 \n", + "17 Adding 1 log with 1 tag and 1 file 10 \n", + "18 weird detector issue 10 \n", + "19 adding new message 10 \n", + "20 investigating banding issue 10 \n", + "\n", + " tags \\\n", + "0 [undefined] \n", + "1 [undefined] \n", + "2 [undefined] \n", + "3 [undefined] \n", + "4 [ticketed_issue] \n", + "5 [undefined] \n", + "6 [camera_issue] \n", + "7 [bright_artifact, background_issue] \n", + "8 [undefined] \n", + "9 [undefined] \n", + "10 [undefined] \n", + "11 [background_issue, bad_psf_movement, bright_ar... \n", + "12 [undefined] \n", + "13 [undefined] \n", + "14 [undefined] \n", + "15 [background_issue] \n", + "16 [undefined] \n", + "17 [clouds] \n", + "18 [camera_issue] \n", + "19 [undefined] \n", + "20 [background_issue] \n", + "\n", + " urls \\\n", + "0 [] \n", + "1 [] \n", + "2 [] \n", + "3 [] \n", + "4 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "5 [] \n", + "6 [] \n", + "7 [] \n", + "8 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "9 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "10 [] \n", + "11 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "12 [] \n", + "13 [] \n", + "14 [] \n", + "15 [] \n", + "16 [] \n", + "17 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "18 [] \n", + "19 [] \n", + "20 [] \n", + "\n", + " user_id user_agent is_human is_valid \\\n", + "0 admin@love1.tu.lsst.org LOVE True True \n", + "1 admin@love1.tu.lsst.org LOVE True False \n", + "2 tribeiro@tucson-teststand.lsst.codes LOVE True True \n", + "3 admin@love1.tu.lsst.org LOVE True False \n", + "4 admin@localhost LOVE True True \n", + "5 admin@love1.tu.lsst.org LOVE True True \n", + "6 admin@love1.tu.lsst.org LOVE True True \n", + "7 admin@love1.tu.lsst.org LOVE True True \n", + "8 admin@localhost LOVE True False \n", + "9 admin@localhost LOVE True False \n", + "10 saranda@tucson-teststand.lsst.codes LOVE True True \n", + "11 admin@localhost LOVE True True \n", + "12 admin@localhost LOVE True True \n", + "13 admin@localhost LOVE True True \n", + "14 admin@love1.tu.lsst.org LOVE True True \n", + "15 admin@love1.tu.lsst.org LOVE True True \n", + "16 admin@love1.tu.lsst.org LOVE True True \n", + "17 admin@localhost LOVE True True \n", + "18 admin@love1.tu.lsst.org LOVE True True \n", + "19 admin@love1.tu.lsst.org LOVE True True \n", + "20 admin@love1.tu.lsst.org LOVE True True \n", + "\n", + " exposure_flag date_added date_invalidated \\\n", + "0 junk 2022-11-30T02:13:46.847038 None \n", + "1 none 2023-07-18T22:13:41.228510 2023-07-18T22:15:14.006037 \n", + "2 questionable 2024-01-20T21:44:20.605672 None \n", + "3 none 2023-07-18T22:16:40.440962 2023-07-18T22:53:40.503894 \n", + "4 none 2023-09-07T15:25:00.394949 None \n", + "5 questionable 2022-11-30T02:53:02.671106 None \n", + "6 questionable 2022-11-15T23:35:31.497612 None \n", + "7 none 2022-11-17T20:53:55.058907 None \n", + "8 none 2023-09-06T22:20:59.061759 2023-09-07T14:51:04.960405 \n", + "9 none 2023-09-06T16:27:02.941720 2023-09-06T22:20:59.061759 \n", + "10 none 2024-08-23T18:23:24.840967 None \n", + "11 none 2023-09-07T14:51:04.960405 None \n", + "12 junk 2022-10-06T18:51:16.905173 None \n", + "13 none 2022-10-06T18:50:25.039355 None \n", + "14 none 2023-02-13T18:04:45.987029 None \n", + "15 questionable 2022-11-16T04:57:30.898604 None \n", + "16 none 2023-07-18T22:53:40.503894 None \n", + "17 none 2023-09-07T15:24:12.233843 None \n", + "18 questionable 2022-11-15T23:35:31.172991 None \n", + "19 questionable 2022-11-30T02:15:01.922201 None \n", + "20 questionable 2022-11-16T04:57:30.954849 None \n", + "\n", + " parent_id \n", + "0 None \n", + "1 None \n", + "2 None \n", + "3 None \n", + "4 None \n", + "5 None \n", + "6 None \n", + "7 None \n", + "8 58f06d12-da95-4505-9729-5f388cc60703 \n", + "9 None \n", + "10 None \n", + "11 58e6cdb9-5945-4175-aa84-f64622ddb5f4 \n", + "12 None \n", + "13 None \n", + "14 None \n", + "15 None \n", + "16 24ce7289-36ae-49f8-ac17-044296a6e7d7 \n", + "17 None \n", + "18 None \n", + "19 None \n", + "20 None " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = pd.DataFrame(recs)\n", "df" ] }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0bfce99d-bde7-4dae-b099-f5666908fa32", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsite_idobs_idinstrumentday_obsseq_nummessage_textleveltagsurlsuser_iduser_agentis_humanis_validexposure_flagdate_addeddate_invalidatedparent_id
00076ce05-752f-46df-b8a5-90ffd51d612etucsonAT_O_20221129_000001LSSTComCam202211291this was a test image for LOVE LVV November te...10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruejunk2022-11-30T02:13:46.847038NoneNone
11e61fbbe-cb87-45f2-88be-cb6647b0cd43tucsonAT_C_20230613_000001LATISS202306131Exposure log creation test10[undefined][]admin@love1.tu.lsst.orgLOVETrueFalsenone2023-07-18T22:13:41.2285102023-07-18T22:15:14.006037None
221fc4a19-37af-42c1-b475-c6cd26df21b5tucsonAT_O_20230906_000003LATISS202309063Testing exposure log in OLE!\\r\\n10[undefined][]tribeiro@tucson-teststand.lsst.codesLOVETrueTruequestionable2024-01-20T21:44:20.605672NoneNone
324ce7289-36ae-49f8-ac17-044296a6e7d7tucsonAT_C_20230613_000001LATISS202306131Exposure log test10[undefined][]admin@love1.tu.lsst.orgLOVETrueFalsenone2023-07-18T22:16:40.4409622023-07-18T22:53:40.503894None
428783f56-b5cb-4f1f-a66e-993c6d8d384etucsonAT_O_20230906_000003LATISS202309063Add 1 log from upper panel with 1 tag and 1 file10[ticketed_issue][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T15:25:00.394949NoneNone
537b1ecb2-5f15-4bdb-8fa9-d7fdae7a1658tucsonAT_O_20221129_000001LATISS202211291This is another test message10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-30T02:53:02.671106NoneNone
6490b3fc8-3775-41c1-b7a6-19b881e6d333tucsonAT_O_20221115_000020LATISS2022111520weird detector issue10[camera_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-15T23:35:31.497612NoneNone
7575d30c4-0b75-4ead-bf3f-6ed58f554468tucsonAT_O_20221115_000023LATISS2022111723LOVE test10[bright_artifact, background_issue][]admin@love1.tu.lsst.orgLOVETrueTruenone2022-11-17T20:53:55.058907NoneNone
858e6cdb9-5945-4175-aa84-f64622ddb5f4tucsonAT_O_20230830_000003LATISS202308303test log\\r\\n\\r\\nUpdate 1: add 4th file10[undefined][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueFalsenone2023-09-06T22:20:59.0617592023-09-07T14:51:04.96040558f06d12-da95-4505-9729-5f388cc60703
958f06d12-da95-4505-9729-5f388cc60703tucsonAT_O_20230830_000003LATISS202308303test log10[undefined][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueFalsenone2023-09-06T16:27:02.9417202023-09-06T22:20:59.061759None
107a550d27-16d4-48a0-bcab-8328b1a7adabtucsonAT_O_20240822_000010LATISS2024082210Testing ampersan &amp;Test&amp;\\r\\n10[undefined][]saranda@tucson-teststand.lsst.codesLOVETrueTruenone2024-08-23T18:23:24.840967NoneNone
117e53f5b9-2173-453f-ba77-552c0c907fc7tucsonAT_O_20230830_000003LATISS202308303test log\\r\\n\\r\\nUpdate 1: add 4th file\\r\\nUpda...10[background_issue, bad_psf_movement, bright_ar...[https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T14:51:04.960405None58e6cdb9-5945-4175-aa84-f64622ddb5f4
128f196dbd-4200-469d-9498-e6adf3cff21dtucsonAT_O_20220929_000031LSSTComCam2022100631LOVE testing #210[undefined][]admin@localhostLOVETrueTruejunk2022-10-06T18:51:16.905173NoneNone
13a578755a-662b-45b6-b391-a9661e084800tucsonAT_O_20220929_000031LSSTComCam2022100631LOVE testing #110[undefined][]admin@localhostLOVETrueTruenone2022-10-06T18:50:25.039355NoneNone
14ac5ccfe2-a0d7-433e-b8f2-4db5ae182a4etucsonAT_O_20230207_000003LATISS202302133LOVE OLE test10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruenone2023-02-13T18:04:45.987029NoneNone
15ae4210d1-9f5a-48fb-945b-2df229eeca33tucsonAT_O_20221115_000020LATISS2022111520investigating banding issue10[background_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-16T04:57:30.898604NoneNone
16b48dbd8a-87f8-4a57-84a8-20990b068e29tucsonAT_C_20230613_000001LATISS202306131Exposure log test - edit 110[undefined][]admin@love1.tu.lsst.orgLOVETrueTruenone2023-07-18T22:53:40.503894None24ce7289-36ae-49f8-ac17-044296a6e7d7
17b7de0ab1-a289-4091-a7b5-8fcde3d2b448tucsonAT_O_20230830_000003LATISS202308303Adding 1 log with 1 tag and 1 file10[clouds][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T15:24:12.233843NoneNone
18bbdd0553-f917-43a9-a952-a95df472a44dtucsonAT_O_20221115_000022LATISS2022111522weird detector issue10[camera_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-15T23:35:31.172991NoneNone
19d37d0f1e-b989-4c5e-a795-16c44c6c00e2tucsonAT_O_20221129_000001LATISS202211291adding new message10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-30T02:15:01.922201NoneNone
20f9a4b932-18e9-47db-9b7d-a2fbe3c15e70tucsonAT_O_20221115_000019LATISS2022111519investigating banding issue10[background_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-16T04:57:30.954849NoneNone
\n", + "
" + ], + "text/plain": [ + " id site_id obs_id \\\n", + "0 0076ce05-752f-46df-b8a5-90ffd51d612e tucson AT_O_20221129_000001 \n", + "1 1e61fbbe-cb87-45f2-88be-cb6647b0cd43 tucson AT_C_20230613_000001 \n", + "2 21fc4a19-37af-42c1-b475-c6cd26df21b5 tucson AT_O_20230906_000003 \n", + "3 24ce7289-36ae-49f8-ac17-044296a6e7d7 tucson AT_C_20230613_000001 \n", + "4 28783f56-b5cb-4f1f-a66e-993c6d8d384e tucson AT_O_20230906_000003 \n", + "5 37b1ecb2-5f15-4bdb-8fa9-d7fdae7a1658 tucson AT_O_20221129_000001 \n", + "6 490b3fc8-3775-41c1-b7a6-19b881e6d333 tucson AT_O_20221115_000020 \n", + "7 575d30c4-0b75-4ead-bf3f-6ed58f554468 tucson AT_O_20221115_000023 \n", + "8 58e6cdb9-5945-4175-aa84-f64622ddb5f4 tucson AT_O_20230830_000003 \n", + "9 58f06d12-da95-4505-9729-5f388cc60703 tucson AT_O_20230830_000003 \n", + "10 7a550d27-16d4-48a0-bcab-8328b1a7adab tucson AT_O_20240822_000010 \n", + "11 7e53f5b9-2173-453f-ba77-552c0c907fc7 tucson AT_O_20230830_000003 \n", + "12 8f196dbd-4200-469d-9498-e6adf3cff21d tucson AT_O_20220929_000031 \n", + "13 a578755a-662b-45b6-b391-a9661e084800 tucson AT_O_20220929_000031 \n", + "14 ac5ccfe2-a0d7-433e-b8f2-4db5ae182a4e tucson AT_O_20230207_000003 \n", + "15 ae4210d1-9f5a-48fb-945b-2df229eeca33 tucson AT_O_20221115_000020 \n", + "16 b48dbd8a-87f8-4a57-84a8-20990b068e29 tucson AT_C_20230613_000001 \n", + "17 b7de0ab1-a289-4091-a7b5-8fcde3d2b448 tucson AT_O_20230830_000003 \n", + "18 bbdd0553-f917-43a9-a952-a95df472a44d tucson AT_O_20221115_000022 \n", + "19 d37d0f1e-b989-4c5e-a795-16c44c6c00e2 tucson AT_O_20221129_000001 \n", + "20 f9a4b932-18e9-47db-9b7d-a2fbe3c15e70 tucson AT_O_20221115_000019 \n", + "\n", + " instrument day_obs seq_num \\\n", + "0 LSSTComCam 20221129 1 \n", + "1 LATISS 20230613 1 \n", + "2 LATISS 20230906 3 \n", + "3 LATISS 20230613 1 \n", + "4 LATISS 20230906 3 \n", + "5 LATISS 20221129 1 \n", + "6 LATISS 20221115 20 \n", + "7 LATISS 20221117 23 \n", + "8 LATISS 20230830 3 \n", + "9 LATISS 20230830 3 \n", + "10 LATISS 20240822 10 \n", + "11 LATISS 20230830 3 \n", + "12 LSSTComCam 20221006 31 \n", + "13 LSSTComCam 20221006 31 \n", + "14 LATISS 20230213 3 \n", + "15 LATISS 20221115 20 \n", + "16 LATISS 20230613 1 \n", + "17 LATISS 20230830 3 \n", + "18 LATISS 20221115 22 \n", + "19 LATISS 20221129 1 \n", + "20 LATISS 20221115 19 \n", + "\n", + " message_text level \\\n", + "0 this was a test image for LOVE LVV November te... 10 \n", + "1 Exposure log creation test 10 \n", + "2 Testing exposure log in OLE!\\r\\n 10 \n", + "3 Exposure log test 10 \n", + "4 Add 1 log from upper panel with 1 tag and 1 file 10 \n", + "5 This is another test message 10 \n", + "6 weird detector issue 10 \n", + "7 LOVE test 10 \n", + "8 test log\\r\\n\\r\\nUpdate 1: add 4th file 10 \n", + "9 test log 10 \n", + "10 Testing ampersan &Test&\\r\\n 10 \n", + "11 test log\\r\\n\\r\\nUpdate 1: add 4th file\\r\\nUpda... 10 \n", + "12 LOVE testing #2 10 \n", + "13 LOVE testing #1 10 \n", + "14 LOVE OLE test 10 \n", + "15 investigating banding issue 10 \n", + "16 Exposure log test - edit 1 10 \n", + "17 Adding 1 log with 1 tag and 1 file 10 \n", + "18 weird detector issue 10 \n", + "19 adding new message 10 \n", + "20 investigating banding issue 10 \n", + "\n", + " tags \\\n", + "0 [undefined] \n", + "1 [undefined] \n", + "2 [undefined] \n", + "3 [undefined] \n", + "4 [ticketed_issue] \n", + "5 [undefined] \n", + "6 [camera_issue] \n", + "7 [bright_artifact, background_issue] \n", + "8 [undefined] \n", + "9 [undefined] \n", + "10 [undefined] \n", + "11 [background_issue, bad_psf_movement, bright_ar... \n", + "12 [undefined] \n", + "13 [undefined] \n", + "14 [undefined] \n", + "15 [background_issue] \n", + "16 [undefined] \n", + "17 [clouds] \n", + "18 [camera_issue] \n", + "19 [undefined] \n", + "20 [background_issue] \n", + "\n", + " urls \\\n", + "0 [] \n", + "1 [] \n", + "2 [] \n", + "3 [] \n", + "4 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "5 [] \n", + "6 [] \n", + "7 [] \n", + "8 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "9 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "10 [] \n", + "11 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "12 [] \n", + "13 [] \n", + "14 [] \n", + "15 [] \n", + "16 [] \n", + "17 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", + "18 [] \n", + "19 [] \n", + "20 [] \n", + "\n", + " user_id user_agent is_human is_valid \\\n", + "0 admin@love1.tu.lsst.org LOVE True True \n", + "1 admin@love1.tu.lsst.org LOVE True False \n", + "2 tribeiro@tucson-teststand.lsst.codes LOVE True True \n", + "3 admin@love1.tu.lsst.org LOVE True False \n", + "4 admin@localhost LOVE True True \n", + "5 admin@love1.tu.lsst.org LOVE True True \n", + "6 admin@love1.tu.lsst.org LOVE True True \n", + "7 admin@love1.tu.lsst.org LOVE True True \n", + "8 admin@localhost LOVE True False \n", + "9 admin@localhost LOVE True False \n", + "10 saranda@tucson-teststand.lsst.codes LOVE True True \n", + "11 admin@localhost LOVE True True \n", + "12 admin@localhost LOVE True True \n", + "13 admin@localhost LOVE True True \n", + "14 admin@love1.tu.lsst.org LOVE True True \n", + "15 admin@love1.tu.lsst.org LOVE True True \n", + "16 admin@love1.tu.lsst.org LOVE True True \n", + "17 admin@localhost LOVE True True \n", + "18 admin@love1.tu.lsst.org LOVE True True \n", + "19 admin@love1.tu.lsst.org LOVE True True \n", + "20 admin@love1.tu.lsst.org LOVE True True \n", + "\n", + " exposure_flag date_added date_invalidated \\\n", + "0 junk 2022-11-30T02:13:46.847038 None \n", + "1 none 2023-07-18T22:13:41.228510 2023-07-18T22:15:14.006037 \n", + "2 questionable 2024-01-20T21:44:20.605672 None \n", + "3 none 2023-07-18T22:16:40.440962 2023-07-18T22:53:40.503894 \n", + "4 none 2023-09-07T15:25:00.394949 None \n", + "5 questionable 2022-11-30T02:53:02.671106 None \n", + "6 questionable 2022-11-15T23:35:31.497612 None \n", + "7 none 2022-11-17T20:53:55.058907 None \n", + "8 none 2023-09-06T22:20:59.061759 2023-09-07T14:51:04.960405 \n", + "9 none 2023-09-06T16:27:02.941720 2023-09-06T22:20:59.061759 \n", + "10 none 2024-08-23T18:23:24.840967 None \n", + "11 none 2023-09-07T14:51:04.960405 None \n", + "12 junk 2022-10-06T18:51:16.905173 None \n", + "13 none 2022-10-06T18:50:25.039355 None \n", + "14 none 2023-02-13T18:04:45.987029 None \n", + "15 questionable 2022-11-16T04:57:30.898604 None \n", + "16 none 2023-07-18T22:53:40.503894 None \n", + "17 none 2023-09-07T15:24:12.233843 None \n", + "18 questionable 2022-11-15T23:35:31.172991 None \n", + "19 questionable 2022-11-30T02:15:01.922201 None \n", + "20 questionable 2022-11-16T04:57:30.954849 None \n", + "\n", + " parent_id \n", + "0 None \n", + "1 None \n", + "2 None \n", + "3 None \n", + "4 None \n", + "5 None \n", + "6 None \n", + "7 None \n", + "8 58f06d12-da95-4505-9729-5f388cc60703 \n", + "9 None \n", + "10 None \n", + "11 58e6cdb9-5945-4175-aa84-f64622ddb5f4 \n", + "12 None \n", + "13 None \n", + "14 None \n", + "15 None \n", + "16 24ce7289-36ae-49f8-ac17-044296a6e7d7 \n", + "17 None \n", + "18 None \n", + "19 None \n", + "20 None " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cols = ['obs_id', 'site_id', 'instrument', 'message_text', 'tags','user_id', 'user_agent','is_human','is_valid','exposure_flag']\n", + "df = pd.DataFrame(recs, columns=None)\n", + "df" + ] + }, { "cell_type": "markdown", "id": "16", @@ -228,13 +2127,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "17", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "### IsValid vs DateAdded" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqYAAAGdCAYAAADALrFsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABpdElEQVR4nO3deXhU5b0H8N85Z/ZsEwgkJCTsAkE22Uxxo0YRKYrWuiEiUr0K1AVXXOCqLSitiF6htAhqrdaF2+rt1eJCRYtSuSJYsO6KUiEBKlkIJJOZ+d0/kvfNOckkZJkz55yZ7+d55lEmM2femfPOnO95z7sozMwEAAAAAGAx1eoCAAAAAAAQIZgCAAAAgE0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC24rC5AqohGo7R3717KyMggRVGsLg4AAAC0AzNTdXU15efnk6qiPc9sCKYJsnfvXiosLLS6GAAAANAJe/bsod69e1tdjKSHYJogGRkZRNRQsTMzMy0uDQAAALRHVVUVFRYWyuM4mAvBNEHE5fvMzEwEUwAAAIdBN7zEQGcJAAAAALAFBFMAAAAAsAUEUwAAAACwBQRTAAAAALAFBFMAAAAAsAUEUwAAAACwBQRTAAAAALAFBFMAAAAAsAUEUwAAAACwhZQMpm+//TZNmzaN8vPzSVEUevHFF4/5nE2bNtEJJ5xAXq+XBg4cSE888YTp5QQAAABIJSkZTGtqamjkyJG0cuXKdj3+66+/pqlTp9KkSZNox44ddMMNN9BPf/pTevXVV00uKQAAAEDqcFldACtMmTKFpkyZ0u7Hr169mvr160cPPvggERENHTqUNm/eTA899BBNnjzZrGICAAAApJSUDKYdtWXLFiotLTXcN3nyZLrhhhtafU5dXR3V1dXJf1dVVZlStq8P1tDTf/+GMv1uuu70Qaa8hhleeH8P5WX56ORBPawuSrv9Zec+2rr7e6uLYRseTaVLxhdR35w0q4tiuY/2VtKfPviOIsxWFwUgpRV1C9Dsif2sLgZ0AYJpO5SVlVFubq7hvtzcXKqqqqKjR4+S3+9v8ZylS5fSPffcY3rZDh6uo8c2f019uwccE0y/qzhKt6z/B3VP89C2u8+wujjtciQUpp/9YTuFowgeemVVtfTwxaOtLobl7v3zP+m9r3HSAmC1cX2zEUwdDsHUJAsXLqQFCxbIf1dVVVFhYWHcXyfL7yYiooqj9XHftln2V9USEdG/a0JUH4mSW7N/V+d/Hw5ROMrk1hS6+pT+VhfHcl/sP0yvflRO5Y37MtXtr264OnL+CQXUK8tncWkAUldBMGB1EaCLEEzbIS8vj8rLyw33lZeXU2ZmZszWUiIir9dLXq/X9LKJYFp1tJ6iUSZVVUx/za6q1IXoqqP11D3d/M+pq0SZgwEP3TJ5iMWlsd6mT/fTqx+VU+XRsNVFsQVRP64+pT8Nycu0uDQAAM5l/6YqGygpKaGNGzca7nv99deppKTEohI1EcE0ykSHQ84ICfpgWumQlt6qxnKKzzvV6U+IUh0zy3qM+gEA0DUpGUwPHz5MO3bsoB07dhBRw3RQO3bsoG+//ZaIGi7DX3755fLx11xzDX311Vd066230ieffEKrVq2i559/nm688UYrim/gc2vkdTXsxsojzggJVQ4MpggeRuJzcMr+M1NNKEKRxr7HqB8AAF2TksH0/fffp9GjR9Po0Q2DNhYsWECjR4+mRYsWERHRvn37ZEglIurXrx+9/PLL9Prrr9PIkSPpwQcfpMcee8w2U0U5LSQ4scUUwdRIfA6H68JUH4laXBpribrh1hTyuzWLSwMA4Gwp2cf0tNNOI25jWpdYqzqddtpptH37dhNL1XlZfjftr65zzGXViiPOC6ZicFkQwZSIjAHdKf2EzVJxJERERFl+DymK/ft4AwDYWUq2mCYbp43Md3KLaSaCKRERuTSV0r0N57VO2YdmaWpNT8nzfACAuEIwTQLBgIMv5TukXywu5bfktC4kZsHAOACA+EEwTQKZDgsITm4xRfho4rR6ZxbUDQCA+EEwTQJOa7lyYjBFq1hL4tK1U/ahWRBMAQDiB8E0CTgtmDp5uijRbQKIgn4PEWEuU/3iCwAA0DUIpklABlOH9NfUD9JyyoAtMZMAWsWayEF3Dql3ZhHvHwPjAAC6DsE0CTipxbQ+EqUjoYj8t1Na23C5tqUshw26MwvqBgBA/CCYJgEnjcpvXkYnlDkaZaqqRfhozkknRGZCMAUAiB8E0yTgpIDgxGBaXRcmsR4DLtc2waj8BhgYBwAQPwimScCJwTSjcXL2I6EIhcL2XtJSBA+vSyUflpyUnFTvzIQWUwCA+EEwTQKi5aqqtp6i0daXWrUDMUCrd7dA0302DzZicAtG5BsFEUyJSLdcLeoHAECXIZgmAdFSw0xUXRu2uDRtEyEmO+CmDJ8z5sFEi1hsaDFt7H+M+gEAEDcIpknA69LI33iJ2e4hQT8fqFMGbSGYxoZgSnQ4FCZxkQL1AwCg6xBMk4RTQoI+5Iky233KKATT2MTncSQUofqIvfsJm0V0TfGg/zEAQFwgmCYJpwXTTF0wdVKZoYn+87D7PjQLTloAAOILwTRJOC3kZTkwmCJ8GGmqImdXsPs+NAv6lwIAxBeCaZJwypyS+qU9nbKkZeXREBE1rQ0PTcTqT3bfh2aRI/IRTAEA4gLBNEnIkNcYouyqytBi2hD07B6mm1pMXRaXxH6c0k/YLGhNBwCILwTTJOG0Ee5Bv8d5l/IxT2ULTtmHZkEwBQCILwTTJOGUliv0MU0uTtmHZsHAOACA+EIwTRJOCQiYLiq5OKXemQV1AwAgvhBMk4QTAkJdOEJH6yNE1Gzwk837xVbKAVsY/NRclkO6kJhFv2AEAAB0HYJpknDCCHdxEFcUogyfyxFhOhJlqmpc5hWtYi05od6ZqfIIWkwBAOIJwTRJOKHlSlyyz/S5SVUVRwzYqq5tKhvCR0tOOLkwEy7lAwDEF4JpknBCQGh+EBcDRmrro1QXjlhWrraIMvvdGnlc+Lo055R+wmZBMAUAiC8caZOEODBW14YpEmWLSxNb84N4htdFimL8m90geLTNCSdEZkL9AACILwTTJKE/MOovP9tJ84O4qiqU6bN3ixuCR9tSOZhGo0xVtagfAADxhGCaJNyaSgGPRkT2DQmxBorYffAMJtdvW9Ahq3eZobo2TNx4cQLzmAIAxAeCaRKxe8gT64pnxgimdg02FRh13SbxuRytj9i2n7BZRJ31uVXyuTWLSwMAkBwQTJOI3UNerDkf7T4yH5fy25bhs38/YbOgbgAAxB+CaRJxSjDVH8gzbV7mKoSPNqmqQhleFxHZt5+wWRBMAQDiD8E0idg9mMYKeXYvM8LHsTlhDl0zoG4AAMQfgmkScWLIc0qZseRk61J1AFRTfcZStQAA8YJgmkTsHvJiDSSSZbbrgC0Mfjomuw+6M0vF0RARoW4AAMQTgmkSsXvIi9ViGrR5mK6MMZMAGNn9hMgsuJQPABB/CKZJxIkj3O0eahA+js3uA9jMgoFxAADxh2CaROwcEGrrI1QXjhKRcbJ6uwdThI9js/s+NEvTSYvL4pIAACQPBNMkYueAIAKeqhCle5oO5HYO05EoU3VdmIgQTNti53pnJqwKBgAQfwimScTOAUHfV1NVFXm/HDhjwzLr5+VEMG2d6EKSavOYisFeQYzKBwCIGwTTJGLnYFrRyiVx0doUCkeptt5eS1qKMqd5NHJr+Kq0JlVH5WNgHABA/OFom0SCgYaWm8N1YQpHohaXxqhSti4ZD+IZXhdpjS2odgvUGPjUPnY+ITIT6gcAQPwhmCaRTF9T382q2rCFJWmptdYlRVFkue0WbNAi1j6pGEwjUabqWvQ/BgCINwTTJOLSVEr32jvkxTqI2zXYoEWsfey6/8xUXYv+xwAAZkAwTTJ2DQntCqY266OIYNo+okW5zob9hM0i6obfrZHHhZ9RAIB4wS9qksmUA1FCFpfEqK2Ql2nTkflilHkQ0wG1KcPrIjHRQqqMzJcj8lE3AADiCsE0yYjJvp3UYioGbdmtzCLco8W0baqq2PbkwixoTQcAMAeCaZIRcyrareWqso3WRyeGaTCyaxcSs2BgHACAORBMk4xdA0J7+pjaNUwjmB6bXfsJmwV1AwDAHAimSUZMWG/XYBqrhcnuYRqtYsdm131oFgRTAABzIJgmGbsGhPa0mNpvwFbDPJWiDyy0zq71zixyYByCKQBAXCGYJpmmUfn2CQjMLC/xOmoeUwx+aje77kOzVLRRnwEAoPMQTJNM0IYBobY+SqHGJVJjB1N7jsrH5dr2S7VgKusGposCAIgrBNMkY8eAIMqiqYpcmUqvqcz2WUa1PhKlmlDDZPEIpsdmx3pnJpy0AACYA8E0ydhxhLv+IK4oSou/i1anqqP1xMwJLVtr9J9fpq9lmAajVA2mGBgHABBfCKZJxo4B4VitS+L+UCRKtfXRhJWrLaLM6V4XuTR8TY7FjvXOTGgxBQAwB464SUYcKGtCEaqP2Cvktda6lObRSGtc07LiqD1G5iN4dIxdpykzSyVG5QMAmALBNMnow59dQsKxlvZUFMV2LW4VCKYdkmXD2SDMEo5E6XBdQ39o1A8AgPhK2WC6cuVK6tu3L/l8PpowYQJt3bq1zcevWLGCBg8eTH6/nwoLC+nGG2+k2traBJW2/TRVoQyfvZb4bE/rkpxNwCbBpgrBtEP0fZvt0k/YLFW1TYP00McUACC+UjKYPvfcc7RgwQJavHgxffDBBzRy5EiaPHky7d+/P+bjn3nmGbr99ttp8eLF9PHHH9PatWvpueeeozvuuCPBJW8fu7U+tifkZdqszLiU3zF27CdsFlE30jwaudH/GAAgrlLyV3X58uV01VVX0ezZs6m4uJhWr15NgUCA1q1bF/Px7777Lk2cOJEuvfRS6tu3L5155pl0ySWXHLOV1Sp2C6btCXm2KzMmUO+QdK9L9hO2yz40C05aAADMk3LBNBQK0bZt26i0tFTep6oqlZaW0pYtW2I+5wc/+AFt27ZNBtGvvvqKXnnlFTr77LNbfZ26ujqqqqoy3BLFblNGOTKYYgL1DlEURU6rZZd9aBZMFQUAYJ6Um6Dx4MGDFIlEKDc313B/bm4uffLJJzGfc+mll9LBgwfppJNOImamcDhM11xzTZuX8pcuXUr33HNPXMveXnYbiOLoYIrw0W7BgIcOHam3zT40ixjMF8RJCwBA3KVci2lnbNq0iZYsWUKrVq2iDz74gP74xz/Syy+/TPfdd1+rz1m4cCFVVlbK2549exJWXruFvIp2tDAFbTbdEEbld1ymPCGyx5RfZsHAOAAA86Rci2lOTg5pmkbl5eWG+8vLyykvLy/mc+6++26aOXMm/fSnPyUiouHDh1NNTQ1dffXVdOedd5Kqtsz3Xq+XvF5v/N9AO9htTkk5Kr+NFia7hWm0mHac3fahWVA3AADMk3Itph6Ph8aMGUMbN26U90WjUdq4cSOVlJTEfM6RI0dahE9N04iIbDk1jt0CghNH5aNVrOPsVu/MgmAKAGCelGsxJSJasGABzZo1i8aOHUvjx4+nFStWUE1NDc2ePZuIiC6//HIqKCigpUuXEhHRtGnTaPny5TR69GiaMGECffHFF3T33XfTtGnTZEC1EzsFBGZGH9MUkeVv+Dmxy6A7s6BuAACYJyWD6UUXXUQHDhygRYsWUVlZGY0aNYo2bNggB0R9++23hhbSu+66ixRFobvuuou+++476tGjB02bNo1+8YtfWPUW2mSnkHe0PkL1kYZW5XYFU5sN2MIAl/YL+j1EZI96Z6amGRs8FpcEACD5pGQwJSKaP38+zZ8/P+bfNm3aZPi3y+WixYsX0+LFixNQsq6zU8gTMwO4VIUCntZbl+0UpkPhKB0JRYgIrWIdYad9aKYKzHELAGCalOtjmgrs1HKlv+ypKEqrj9OPyre6367+c8vwIXy0l5ymzAb1zky4lA8AYB4E0yRkp5ar9k5UL8ocjrJsrbSKKHOGr2k1Izg2uw1gMwsGxgEAmAfBNAmJA+bR+giFwtauW97e1iW/WyO3Zo8lLdEi1jl2OiEyE+oHAIB5EEyTUIbPReKqudUhob0HcUVRbBNs0CLWOXZbCtcM9ZEo1aD/MQCAaRBMk5CqKpThFeuWW7sKT0dCXtPKQfYI0xiR3zF26idsFv1JU6YvZceOAgCYBsE0Sdll9aeOjGAO2qTFVCypiRaxjhGfV32E6Wi9tf2EzSL7H3td5NLw8wkAEG/4ZU1SdhmZ35H+eHa5FFx5NExECKYdFfBo5GocLGZ1q7dZRH3ORN0AADAFgmmSskt/zc4EU7uUGeGjY+zUT9gsGPgEAGAuBNMkZZdJ9p0cTBE+Os4u+9AsGBgHAGAuBNMk1TSnZNjScnQmmFZYPGBLDn7yY8nJjrJL32azYGAcAIC5EEyTlF1CXmdG5VsdptEq1nnJ3mKK5UgBAMyFYJqkgjZpuRLLUx5r5SciomDAHgO2RJhH+Og4u3QhMQu6eQAAmAvBNEnZYYQ7M3fosrhdWtsQPjrPLvvQLBgYBwBgLgTTJGWHgFATilAkyobytMUOYZoIwbQr7FDvzIS6AQBgLgTTJGWHgCBe26Op5HMfu6rZocx14QjV1kcN5YH2s8M+NBOCKQCAuRBMk5Qc/GRhXz/RzzDT7yZFUY75eH2osWpJSxE8FIUoA0tOdliyB9MqjMoHADAVgmmSskNAaBpE1L6AJ8ociTIdrrNmZL4M0z43qeqxwzQY2aHemQmj8gEAzIVgmqTEKPi6cJRqLVq3vKPTLvncKnlcDVXSqmCDS7Vdk+zBFPUDAMBcCKZJKt3jItHgZ9VgoqbJyNs3Ub0dlrRE8OiaZJ5gPxSO0tHGkzzUDwAAcyCYJilVVXQT1jsn5CGYOpsd+gmbRV8nM3yoHwAAZkAwTWJODHlWT9COYNo1+n7CNSFrupCYRdSNDJ+LNPQ/BgAwBYJpErN6ZH5nJiO3TZjGqOtO8bs18mjW9hM2S2XjYD6MyAcAMA+CaRKzOuR1ZgRz0IFlhiaKoutCkmTLkqI1HQDAfAimSczqYNqZA7nV/WI7OpMAtCSmBxPThSULBFMAAPMhmCYxq4OpnIzciZfyET46zS5Ly8ZbJVrTAQBMh2CaxGwT8jrQJ882ZUb46DSr96FZKo82LPqAugEAYB4E0yRmdcuVk6eL6kgrLxiJeWuTL5iK+ty+eXkBAKDjEEyTmByVb0FAiEbZ0cG0IzMJgJHV+9AsTUvsom4AAJgFwTSJBS1chedwKEzRxvnVOzQq3+KVgypwKb/LrB7AZhYMjAMAMB+CaRKzMiCIgSJel0o+t9bu51nZ2lZbH6FQONpQDsxV2WlWz59rFvQ/BgAwH4JpErMy5HX2IK7vFxuNJnZJS1FmVSFK97gS+trJJFkv5SOYAgCYD8E0iVm5bnlnL3uKVt4oN3QHSCR9/1IVS052mtWD7syCYAoAYD4E0yQmDqChcJRq66MJfe3OHsR9bo28rsYlLRN8KRgj8uPD6n7CZhFdE7AkKQCAeRBMk1i610VaY8tfokNCV1qXrAo2mEA9PpLxUn5tfYTqGvsfY8YGAADzIJgmMUVRLAsJXRndbnWZETy6Rr//Et1P2CyiW4KiEGV40f8YAMAsCKZJzqqQ15lVnwTLy4xg2iVZFvYTNovsf+xD/2MAADMhmCY5q6aM6krIQzB1Np9bI49F/YTNgroBAJAYCKZJzokhT4TpRM+DiQnU4yfZ+pkimAIAJAaCaZJrmuw8lNDX7UrIszpMY9R11wWTbMoojMgHAEgMBNMkZ1VAqOjCCPeg30NEFgx+OoK10OMlWVtMMTAOAMBcCKZJzurWx861mDaMek50mMbl2viRLfVJFkxRNwAAzIVgmuSsDqadufSZZdU8pmgVi5tkbTFFMAUAMBeCaZKzIiBEo0xVtZ0PedaF6bDh9aHzrJoNwiwYGAcAkBgIpkku04JLqtV1YeLGedW7Mvip4mjiBmwxswwfwYAnYa+brJJtWVIsVwsAkBgIpknOitZHEfB8bpW8Lq3Dz5dlTuB0UbX1UQpFoobXh85Ltkv5XVnJDAAA2g/BNMmJlqtEDiTqyoj8huc1tFhW14UTtqSlaJ3VVIXSPB0P02CUlWTTRaGPKQBAYiCYJjl9yxVzYkJe02XPzl0SF2VmJqquTcySlvrgoShYcrKrmubPTa5gioFxAADmQjBNciIg1EeYjtZHEvKaXW1d8rhU8rs1w7bMVtnFVl4wSrZL+WgxBQBIDATTJBfwaORSG1oAExby4tC6lOgBUGgRi69kCqa19REKhRv7H2PlJwAAUyGYJjlFURJ+WTUerUuJDjYYdR1fIsBV1dYnrJ+wWcT3RlMVyvC6LC4NAEByQzBNAYmesD4uwdSBZYYmhn7CdYnpJ2wW2Zruc6H/MQCAyRBMU0DiWx+7vua8VS2mCKbx4XVp5HM3/LwkctovM6BuAAAkDoJpCrDssngX+uMhmDpfsvQzRd0AAEgcBNMUkOg5JZ3cxxThI36SLZhiYBwAgPkQTFOAE0Neold/QjCNv2QLpqgbAADmQzBNAVaNyo/HdFEJD9OYDihuxApejg+mRxr6THelawoAALRPygbTlStXUt++fcnn89GECRNo69atbT6+oqKC5s2bR7169SKv10vHHXccvfLKKwkqbdckOuR1dUlSoqYQgAn2nQstpgAA0FEpOSnfc889RwsWLKDVq1fThAkTaMWKFTR58mT69NNPqWfPni0eHwqF6IwzzqCePXvS+vXrqaCggL755hsKBoOJL3wnJDIgRKIslxHtyoE804HdD8Ao0YskmAV1AwAgcVIymC5fvpyuuuoqmj17NhERrV69ml5++WVat24d3X777S0ev27dOvr+++/p3XffJbe74eDUt2/fRBa5SxIZTKtrm17DKYOfmBnhwwSJHnRnFtQNAIDESblL+aFQiLZt20alpaXyPlVVqbS0lLZs2RLzOf/zP/9DJSUlNG/ePMrNzaXjjz+elixZQpFI62vP19XVUVVVleFmlUQGBHEQD3g08rg6X70SGUyPhCIUblydCOEjfrL8Dee9uJQPAADtlXLB9ODBgxSJRCg3N9dwf25uLpWVlcV8zldffUXr16+nSCRCr7zyCt1999304IMP0s9//vNWX2fp0qWUlZUlb4WFhXF9Hx0hBvRUJDCYdvUgLp5fXRumiMlLWooyuzWFAh7N1NdKJcFAkgx+knXaY3FJAACSX8oF086IRqPUs2dP+u1vf0tjxoyhiy66iO68805avXp1q89ZuHAhVVZWytuePXsSWGIjfesjc2JCXryCKZH5Lb36MmPJyfjB4CcAAOiolOtjmpOTQ5qmUXl5ueH+8vJyysvLi/mcXr16kdvtJk1rak0bOnQolZWVUSgUIo+nZUuK1+slr9cb38J3UrCxpScSZaoJRSjda95uFyPyuzoZuVtTKc2jUU0oQpVH6yk7zbzWqniVGYwSPYDNDIb+x5guCgDAdCnXYurxeGjMmDG0ceNGeV80GqWNGzdSSUlJzOdMnDiRvvjiC4pGo/K+zz77jHr16hUzlNqNz62SR2tctzxBrY/BOIS8RLW4oUXMHImeP9cMR+sjVB9B/2MAgERJuWBKRLRgwQJas2YNPfnkk/Txxx/TtddeSzU1NXKU/uWXX04LFy6Uj7/22mvp+++/p+uvv54+++wzevnll2nJkiU0b948q95ChyiK0tR6ZXJIiGfIS1SLWxWCqSkS2U/YLKLuaapCaeh/DABgupS7lE9EdNFFF9GBAwdo0aJFVFZWRqNGjaINGzbIAVHffvstqWpTZi8sLKRXX32VbrzxRhoxYgQVFBTQ9ddfT7fddptVb6HDsvwuOni4zlEhr2keTOeEaWii/zyra+vlYCgnQf9jAIDESslgSkQ0f/58mj9/fsy/bdq0qcV9JSUl9Pe//93kUpmn6bK4uZOdxzPkJfpSfjy6H0ATj0ulgEejI439hJ0YTEU3BNQNAIDESMlL+akoUVP3xHOgiFiWNJGj8iG+nD4yX5QbA+MAABIDwTRFJCogVMRxzfmElRnhwzTJEkxx0gIAkBgIpinCiSPcsxw4YAuMMh0+Mh8D4wAAEgvBNEUkaoS7k/uYInzEH1pMAQCgIxBMU0Si5pSMZwuTbG0zecCWKLMTB+fYXTBJgmkQk+sDACQEgmmKSETLVTgSpeq6sOH1uqKpzOEub6staBUzj/hMzR7AZpZ49pkGAIBjQzBNEcEEBISq2qYAGY+BRKIF08wyG5acRPiIu2S5lI+BcQAAiYFgmiLE9E1mBgSx7TSPRm6t61UrEaHmcF3TqkQIpvEn6p1TBz/hpAUAILEQTFNEIkJeZZz7aooyH64LU30kGpdtNifK7NFU8rnxdYg3p7eYYlQ+AEBi4UicIvQBIWrSuuXxvuyZ6WtamMysy/n6MmPJyfhL1GwQZkGLKQBAYiGYpghxYI0y0eGQOYOJmg7i8Vnp1qWplO51GbYdbxh1bS4nj8pnZrn4AuoHAEBiIJimCJ9bI6+rYXebNWG9Ga1LZl8KxqVaczl5VH5NKIL+xwAACYZgmkLMDnmVR0KG14kHs8uM6YDMJT7X6rowhU3qJ2wWUefcmkJ+t2ZxaQAAUgOCaQoxu/XKiS2m6ENoLn1/Y/10Yk5QqTtpQf9jAIDEQDBNIYkKefFcQcmJYRqauDWV0jwNrY1O62eKOUwBABIPwTSFyGVJEzDCPV7MXkoV4cN8Tp0yCictAACJh2CaQpx4WdzshQFkKy/Ch2myGlvQnRdMG/pMo24AACQOgmkKMT/kNfQhRB9T0BPThzkvmKJuAAAkGoJpCsGo/JYQPsyHS/kAANBeCKYpJGGDn5wYTDGBumnkPmw8cXEKBFMAgMRDME0hZo5wr49EqSYUMbxOPKDF1Pmc22La0DUFA+MAABIHwTSFmDnCXR92zRiVb0aoiUZZlhsDXMwTdOzgp/hPfwYAAG1DME0hZoY8sc0Mr4s0NX6TkQdNHLB1OBSmxhUn0Spmokyntpia0GcaAADahmCaQswMeWJu1HgHPBEKjoQiVB/nJS3Fyj5el0o+LDlpGudeykc3DwCAREMwTSEiNFbV1lNUNBXGiVkH8Qxf0/biHWwQPBKjKZg6bElS1A8AgIRDME0h4gDLTFRdF9+QIPtqxnl0u6YqlOEzZx5MBI/EcOKofGamqtr4z8sLAABtQzBNIV6XRj53wy6P98h8M0OeWYO2EEwTw4mX8g/XhSnSeFUB9QMAIHEQTFOMaSHviPnB1KwwHe9WXjASMx7UmNBP2Czi++FxqfJkDgAAzIdf3BQT9JszdY+ZrY9mDdqqNGnAFhjpP18z5tA1g74+K0r8ZpkAAIC2IZimGLMuq5o1Kp/IxDKb2MoLTTRVoQyvOf2EzVKFbh4AAJZAME0xZs0pmYg+pk4qMxiJelfhkGCKugEAYA0E0xRjdsgzo7+mWWEarWKJ47QBUAimAADWQDBNMXLw09H4Tt1jZsjDqHznM2sAm1lQNwAArIFgmmLMHuFuyuAnkwdsYVS++cxcdcwMFQimAACWQDBNMWaPcHfidFEIH+ZrmmTfGcEUdQMAwBoIpinGjL5+oXCUjoQihu3Hk3mj8kOG7YN50McUAADaA8E0xZgREMS2FMW4tn28mFHmaJTlsqyYx9R8ThuVj4FxAADWQDBNMWaMcBfbyvC6SFPjPxm5GQO2qmvDxGzcPpgHLaYAANAeCKYpxowR7vIgbtIgIlHm2voo1YUjcdmmKLPfrZHXpcVlm9A6pw1+wsA4AABrIJimGHGgra4NUyTKcdmm2Zc9M3wuEqtCxivYoEUssZw2XRRWBQMAsAaCaYrRH2ira50R8lRVoUxffIMNgmliOelSfjTKVFWL+gEAYAUE0xTj1lQKeBouXccrJCRidHu8g43or4rgkRhOCqbVdU39jzEwDgAgsRBMU1C8Q0Ll0XDjdj1x2V4s8S9zw3YQPBJD7L8joQiFwlGLS9M20Srvdankc6P/MQBAIiGYpqB4D4BKxGVxJ5YZmuinEbN7qynqBgCAdRBMU1C8p4xKZDCNd5kx6joxNFWhTJ+LiOwfTMXJD+oGAEDiIZimoKATg2mcpxvCBOqJF+99aBa0mAIAWAfBNAXFv/XRgYOfMB1QwjllyigEUwAA6yCYpqB4BwQnX8pH+EgcM1bwMgMGxgEAWAfBNAU5sb+mE8M0GMl6F8dVx8yAugEAYB0E0xQk+vo5aYS7aaPyMcAlYcR0YmJ6MbuSJ1omTn8GAACxIZimoHi2mNaFI1Rb3zAvpZmXPp04YAuMnDLJflOfaZfFJQEASD0IpikongFBbENRiDK85h3I4znFVSTKVF0rFgVAME0U5wRTtKYDAFgFwTQFxTWYNl5az/S5SVWVLm+vNfEss76fKoJp4jgumKJuAAAkHIJpCornQKJETVQvWq/qwlGqrY90aVuizAGPRm4NX4FEaQqmzhiVj2AKAJB4OCqnIHHAra4LUzjStXXLE3UQT/e4SDTIdrXFDcHDGo5pMcUctwAAlkEwTUH6QUpVtV0bIZ2okKeqStz6mSKYWiPogJWfIlGm6jrR/xij8gEAEi2lg+nKlSupb9++5PP5aMKECbR169Z2Pe/ZZ58lRVFo+vTp5hbQJG5NpXRvfNYtT+Rk5PEamY9gag0ntJhW19YTc8P/o34AACReygbT5557jhYsWECLFy+mDz74gEaOHEmTJ0+m/fv3t/m83bt3080330wnn3xygkpqjniFhESGvHhN0I5gag1x8lJbH6W6cNf6CZtF1A2/WyOPK2V/HgEALJOyv7zLly+nq666imbPnk3FxcW0evVqCgQCtG7dulafE4lEaMaMGXTPPfdQ//79E1ja+IvXZfFErjmPS/nOluF1kRKnfsJmQd0AALBWSgbTUChE27Zto9LSUnmfqqpUWlpKW7ZsafV59957L/Xs2ZPmzJlzzNeoq6ujqqoqw81OxOThXQ0IYmR/MJEtpgimjqSqCmX67L0sKeoGAIC1UjKYHjx4kCKRCOXm5hruz83NpbKyspjP2bx5M61du5bWrFnTrtdYunQpZWVlyVthYWGXyx1PTZfFuzZ1jxWX8iu6Gkwx6toydu9nimAKAGCtlAymHVVdXU0zZ86kNWvWUE5OTrues3DhQqqsrJS3PXv2mFzKjnFi66MY1d3V+VcTNfcqtGT3kfmyawrqBgCAJVJyMeicnBzSNI3Ky8sN95eXl1NeXl6Lx3/55Ze0e/dumjZtmrwvGm2Y/9PlctGnn35KAwYMMDzH6/WS1+s1ofTxEQw0TIXjpGAa7zCdiJkEwAgtpgAA0JaUbDH1eDw0ZswY2rhxo7wvGo3Sxo0bqaSkpMXjhwwZQjt37qQdO3bI2znnnEOTJk2iHTt22O4yfXvEKyBUJDDkxbvMCB+JF68BbGapQt0AALBUSraYEhEtWLCAZs2aRWPHjqXx48fTihUrqKamhmbPnk1ERJdffjkVFBTQ0qVLyefz0fHHH294fjAYJCJqcb9TOHGEe7yCKcKHddBiCgAAbUnZYHrRRRfRgQMHaNGiRVRWVkajRo2iDRs2yAFR3377Lalq8jYoxyMg1NZHKBRu6NKQiP6aIkxXOGjAFhjJAWwYlQ8AADGkbDAlIpo/fz7Nnz8/5t82bdrU5nOfeOKJ+BcogeIREMRBXFMVuZKUmZrCdOeXUQ1HonS4cclJ0c8WEkdMK9bVAWxmwcA4AABrJW+TILQpHgFBDiLyuUgRM6ebSATJqqP1xGLdyA6qqm0KtZm+lD4vs4TdL+WLEzUMjAMAsAaCaYqKR0BI9GVP8TqhSJRq66Od2oYoc7rXRS4N1T/R7B5McSkfAMBaODKnKHHgrQlFqD7SuZCXyOVIiYjSPBppakPLbGeDjeifiuBhDbsHUwyMAwCwFoJpitJfquzs5XzZupSgvpqKonQ52GAOU2vJAWw2DKaRKFN1Y/9jBFMAAGsgmKYoTVUoo3HAUmdDghWXPbO6ODK/qczoX2oFO7eY6k/QEEwBAKyBYJrCujqXqRUhr6tlFuEj6MeIfCuI0e6hcJRq6yMWl8ZInKCleTRyo/8xAIAl8Oubwrq6brkV/fGCcQvTaBGzQrrX1eV+wmZB3QAAsB6CaQrL6uKUUVZeyu9yMMU8lZZQFEVO02XXYIr+xwAA1kEwTWFdDXlWjHDvaphO9EwC0JJd+5mixRQAwHoIpilMBoROrv7UdCBPXH9NjMp3PrsuS4pgCgBgPQTTFJbVxal7LB2V76Ayg1FXB7CZBXOYAgBYD8E0hWV1cfCTWLM+ocG0y2UWo/IRPqwilpa1WzAVXVOC6H8MAGAZBNMU1pXL4szc1MKUwAN5Vy/lo1XMemJ6MbsFU7SmAwBYD8E0hXUl5B2tj1CocSlTJ43Kr0D4sFxXB7CZBcEUAMB6CKYprCsBQRzENVWhNI8W13K1pStlro9E6UgoYtgOJJ7dR+VjYBwAgHUQTFNYV0ZH6/tqKooS13K1RV9mZu7Qc/VBCOHDOl1dVtYsVvSZBgAAIwTTFNaVlqtKi+YDFa8XjrJs/Wwv8T4zfE2rD0HiienF7NZiKperDWC5WgAAqyCYpjCxXvzR+giFwtEOPdeqy54Bj0ZurXNLWqIPoT3Y9VK+FQtGAACAEYJpCsvwuUhchXdKyFMUpdPBBsHUHpr2X9jikjSpj0SpBv2PAQAsh2CawlRVoQxv56busTLkdXaCdqu6H4CRmF6s6mjH+wmbRT+YLtPnsrAkAACpDcE0xXV2wnorgylaTJ1NfP6hSJRq6zvWhcQsom6ke13k0vCzCABgFfwCp7imkNexEdJyVL4Fq+TIMndwNgEEU3tI82hy8FlFB+udWVA3AADsAcE0xTmx9THY1TJjyUlLKYrS6X1oFiy8AABgDwimKU6MzO9s66MV84E6MUyDUWdbvc2CpWoBAOwBwTTFZXZyhDT6mEJXdHYAm1lQNwAA7AHBNMV1OuRZOMIdo/Kdz25zmaJuAADYA4Jpiutq66OVg58q0GLqWLYLpuh/DABgCwimKa4zo/KZ2dGX8kW/WrBOsJPTlJkFJy0AAPaAYJriOhMQjoQiFI42TIxuyaj8xrXMq9Bi6lh2azHFqHwAAHtAME1xnQkI4rFuTSG/WzOlXG3pTJnrwhE6Wo8lJ+3CbsEUJy0AAPaAYJriOhMQKnQDRRRFMaVcbdGXub1LWor3pyhEGVhy0nJ2G5WP6aIAAOwBwTTFdaXF1Io5TImayhyJMtWEIu16jggeGV4XqWriwzQYocUUAABiQTBNcSJc1tZHqba+fSGvaRCRNQdxn1slT+N65hVH2jdoC6Ou7cVuE+wjmAIA2AOCaYrL8LpIXI1v72Aiqy97KorS4UvBGJFvL3YalR8KR+lIY8u7FdOfAQBAEwTTFKeqSocvq9qhdamjwcYOZYYmneknbBZ9HcrwoX4AAFgJwRQcGUzFa7e3lRcr+9iL2A/hKMvWSquI+pzhc5GG/scAAJZCMIUOB9OKxsn47RBM219mawdsgZHfrZFbawiBVl/Ot8OJFgAANEAwhU60mIaJyNqQJ5clbefgGYQPe1GUjnchMYvVfaYBAKAJginIgNnRkCdWYLKCE7sfgFFH651ZUDcAAOwDwRTktE9OCnkdDaZVMkwjfNhFR+udWcSUY6gbAADWQzCFToc8JwVTO4RpMOroADaziK4pqBsAANZDMIWOj3C3QchDMHU+u/QxtXolMwAAaIJgCh0KCMxsi5DX0TBdgemibMduwRR1AwDAegim0DTCvR0B4XBdmCLRhgnRreyTJ5YWbU+ZiRA+7Kip3rVvWVmzoG4AANgHgil0qOVKPMbjUsnn1kwtV1s6Uuba+gjVhaMNz8MAF9vIapzVQfTxtIocGIflagEALIdgCjKsdSSYWt26FNRdyo9G217SUgQPVSFK97hMLxu0j10u5dthwQgAAGiAYAqdajG1+iAuBqpEmehwqO0WN/3gFhVLTtqGXYKpXeo0AAAgmAI1HZBD4SjV1re9brkdpooiIvK5NfK6Gqpv5TEmaEfwsCf7TBeF+gEAYBcIpkDpXhdpavvWLbfT6Pb2trjZqczQxA4tpnXhCNXWRw3lAQAA6yCYAimKQpm+hr6Xx1oeUi5HaoODeHuDDVrE7Em//5jb7idsFlE3FIUow4f+xwAAVkMwBSLqeMizw2TkwXYO2kIwtSex/yJRpsN11ozMF90IMn3ofwwAYAcIpkBE+ql7nBPy0GLqbD63Rh7RT9iiy/no5gEAYC8IpkBEzgx5mQ4sMxhZ3c8UdQMAwF4QTIGInBlMnVhmMEIwBQAAPQRTICKiLH/DwI/KI20vD2mnA7lc0hLTRTmW1VNGoW4AANgLgikQUcdbH4M2WNqzvaEG4cO+2ntyYRY7DeYDAIAUD6YrV66kvn37ks/nowkTJtDWrVtbfeyaNWvo5JNPpuzsbMrOzqbS0tI2H+80Yp1wJ10W7/CofBuEaTAKWnwpXwRiO5xoAQBACgfT5557jhYsWECLFy+mDz74gEaOHEmTJ0+m/fv3x3z8pk2b6JJLLqE333yTtmzZQoWFhXTmmWfSd999l+CSm6M9LabRKNtm5Sd9GZwUpsGovQPYzGKn+gwAACkcTJcvX05XXXUVzZ49m4qLi2n16tUUCARo3bp1MR//9NNP09y5c2nUqFE0ZMgQeuyxxygajdLGjRsTXHJztCcgHA6FKcrGx1upPcGUmRFMbQyDnwAAQC8lg2koFKJt27ZRaWmpvE9VVSotLaUtW7a0axtHjhyh+vp66tatW8y/19XVUVVVleFmZ+0JCGJNeq9LJZ9bS0i52tKeMtfWRykUxpKTdoVgCgAAeikZTA8ePEiRSIRyc3MN9+fm5lJZWVm7tnHbbbdRfn6+IdzqLV26lLKysuStsLCwy+U2U7uCqY0GPhE1tdpW1dZTNBp7SUtRZk1VKN2LJSftBsEUAAD0UjKYdtX9999Pzz77LP3pT38in88X8zELFy6kyspKeduzZ0+CS9kxWbqBRK2tW263g7goBzNRdW3sJS31ZVYULDlpN+0dwGYWu9VpAIBUl5JNSDk5OaRpGpWXlxvuLy8vp7y8vDaf+6tf/Yruv/9+euONN2jEiBGtPs7r9ZLX641LeRNBjI6ujzAdrY9QwNOyatjtIO51aeR3a3S0PkKVR+tjjrq3W5nByOoW0wrUDwAAW0nJFlOPx0NjxowxDFwSA5lKSkpafd6yZcvovvvuow0bNtDYsWMTUdSECXg0cqkNLYqthQQ7hrxjBRvMU2lvVgbT2vpIU/9jm3RPAQBIdSkZTImIFixYQGvWrKEnn3ySPv74Y7r22muppqaGZs+eTUREl19+OS1cuFA+/oEHHqC7776b1q1bR3379qWysjIqKyujw4cPW/UW4kpRFEeGvPaW2U5hGproF0lorZ+wWUTdUBWi9BhXCAAAIPFS9tf4oosuogMHDtCiRYuorKyMRo0aRRs2bJADor799ltS1abc/utf/5pCoRBdcMEFhu0sXryY/vM//zORRTdNlt9N/64JydH3zYnJyO0U8uTKQUdjL6Va0bjEqp3KDE3ESU6UG6Yjy/Qlbj/pT7RUFf2PAQDsIGWDKRHR/Pnzaf78+TH/tmnTJsO/d+/ebX6BLJYpQ17brY9ilSg7ONb8q00TqKd0Vbctn1sjr0ulunCUKo/UWxJMcdICAGAfKXspH1o61ghpO4a8Y5XZjmEajKwamS+XI0UwBQCwDQRTkPT9/WKx45rz6GPqfFYNgLJjn2kAgFSHYAqSE0Neu8O0jcoMRlYHU9QNAAD7QDAF6VgBQQwwstOB/NhlRquY3SGYAgCAgGAKkhzh3sqo/Eo7j8pvrcwIH7Z3rAFsZqlC3QAAsB0EU5DaCgjRKFN1XcOyn1k2Gkh0rNY2ET6CNuoXC0ZiYFprJxdmqUTdAACwHQRTkIJthLzq2jBx4/zndmphympjRDczo8XUAay6lI85bgEA7AfBFKS2BhKJ0OB3a+Rx2afatBVqjtZHqD7ChseB/Yjpx1obwGYWnLQAANiPfRIGWK6t1ke7HsRFeaprwxRptqSlKLNLVSjg0RJeNmiftuqdmTBdFACA/SCYgqRvfWQ2hjw7jsgnMpanutYYbPRLqCoKlpy0K+tG5Ys+0/aq0wAAqQzBFCRxgA5HmWpCEcPf7Npi6tZU2RrafPCMXcsMRlYEU2bGqHwAABtCMAXJ79bIozVUieYhwY6rPgmtDdqyc5mhSZYclR9K2GvW1kcpFIkSEVEwYJ9ZJgAAUh2CKUiKojRNGeWg1sfWprmyc5mhiewnXBemaLN+wmYRXVM0VaE09D8GALANBFMwECOknRTyWrsUjEu1ziD2D3PDILZE0Ndn9D8GALAPBFMwcGLIa63Mdg7T0MTjUsnvbmi1TFQ/UzuuYgYAAAim0ExTyDP296uw8YG8tWBq5zKDUaIHQGGqKAAAe0IwBYNjtT7acflGtJg6n1XBFHUDAMBeEEzBQIxQbi3k2bGFSYRlJw3YAiMxc0LF0cSMzJcnWqgbAAC2gmAKBk4c4Y4WU+dDiykAABAhmEIzTQHBODrazgfy1sK0nQdsgRGCKQAAECGYQjOxAkIkynIaHzseyFsd/IQJ9h0DwRQAAIgQTKEZGRB0q/BU6cKCHQ/ksUINMyN8OIjYR1UIpgAAKQ3BFAxihTzx/2kejdya/apMrDLXhCIUaVxFKOjHkpN2JwawVRxJcDBFazoAgK3YL2WApeQI9xjB1K6tS2ImgcN1YQo3rn8uyuzRVPK5Uc3tLuGX8jHHLQCALeGIDQbykmptmJgbWhztPFUUEVGmzyX/v6qxL6wIHplYctIRWhvAZha7n2wBAKQqBFMwEAfqSJTpcF1jyLP5QdylqZTubQinoqxNZXa1+jywj0S2mKL/MQCAfSGYgoHPrZHH1VAtRH+/CgccxEXZKhoHbYklVe1cZmiSyGB6JBShcGP/Y9QPAAB7QTCFFpqHBCfMB9r8UjBaxJxF7Kfq2rActGYWUTdcqkIBj2bqawEAQMcgmEILwWZT98jlG208gjnYSjAVA6PA3vQnEGZPGaWvz+h/DABgLwim0ELzFlMnjGBuPg8mWkydxa2plNbYemn25fyKI/YezAcAkMoQTKGFFsHUASGvtTIjfDhHovqZOqE+AwCkKgRTaMGJIS8r0LzM9l1CFWJL1JRRTugzDQCQqhBMoQUREMRofGeNym8s8xGMyncatJgCAACCKbTQ2qh8Ow8kat7ahlYx50EwBQAABFNoofmypE44kLc+Kt++ZQajWMvhmqGicY7boI3rMwBAqkIwhRb0I9zDkahcAcrOwdSJA7bAKHEtpg312c59pgEAUhWCKbSgDwhi7Xki45r0dqMP09Eolpx0IlnvjuBSPgBAqkIwhRb0wVQMIkr3usil2be66Mt8OBQmsXgQwodzoI8pAADYN2mAZfQj3J1yEBflqwlF6N+HG8K0x6WSz40lJ50C00UBAACCKbQg5gStqq13xFRRRMb+gnu+P0JEGNziNGLWh0S1mNp5lgkAgFSFYAotiBDKTPTdoaOG++xKUxXKaOwD+21jMLV7mcEoEZfymdH/GADAzhBMoQWvSyOfu6Fq7HFQyBNldFKZoUkigunhujBFGjsgo34AANgPginEJA7a3/zbOSHPiWWGJmJ/Ha4LUzgSNeU1ROj1aKo8+QIAAPvALzPEJEOeaH10wET1LcqMYOoo+unI9NOUxZMIppl+NymKYsprAABA5yGYQkxOvCzevMyYQN1ZXJpK6d6GcGrW5fym/qX2nZMXACCVIZhCTFn+hhHLTlj1SRBLWooyYzlS52maqixkyvarMCIfAMDWEEwhpuZB1AnBtHkLqRPKDEZmD4CqOIIR+QAAdoZgCjE5MZg6scxgZHYwxVRRAAD2hmAKMTkx5DmxzGAk9lkVgikAQEpCMIWYmg8OccKBHMHU+RLVYoqBcQAA9oRgCjE1nx7KCQOJmgdRJ5QZjMQ+MzuYYrlaAAB7QjCFmIJ+46jlDJ/9D+TNy4xWMefJlKPycSkfACAVIZhCTPpQl+FzkabafzJyXMp3Pgx+AgBIbQimEJP+wO2Ug7i+nD63Sl6XZmFpoDMSFkzRzQMAwJYQTCEmJwbTDJ+LxCqTTikzGKHFFAAgtSGYQkxODKaqqlBG45KWTikzGJk5XVQ0ynK7qB8AAPaU0sF05cqV1LdvX/L5fDRhwgTaunVrm49/4YUXaMiQIeTz+Wj48OH0yiuvJKikiedxqRTwNFwKd9LodrHUZPOBUOAMZo7KPxwKU5Qb/h/BFADAnlI2mD733HO0YMECWrx4MX3wwQc0cuRImjx5Mu3fvz/m499991265JJLaM6cObR9+3aaPn06TZ8+nXbt2pXgkieOOHg76SAuyooR+c4k9l9NKEL1kWhct13ZONLf61LJ50b/YwAAO0rZYLp8+XK66qqraPbs2VRcXEyrV6+mQCBA69ati/n4hx9+mM466yy65ZZbaOjQoXTffffRCSecQI8++miCS544Tgx5TgzT0EQ/LVm8W03RvxQAwP5cx35I8gmFQrRt2zZauHChvE9VVSotLaUtW7bEfM6WLVtowYIFhvsmT55ML774YszH19XVUV1dnfx3VVVV1wueYJkODHkIps6mqQpl+FxUXRum+//yCWX44vcTVV5VS0SoGwAAdpaSwfTgwYMUiUQoNzfXcH9ubi598sknMZ9TVlYW8/FlZWUxH7906VK655574lNgi/TK8hn+6wR5DiwzGPXK8lF17WFav+1fpmw/D3UDAMC2UjKYJsLChQsNLaxVVVVUWFhoYYk67uYzB9PYPtk05fheVhel3a45dQAVdQvQeScUWF0U6KQHfzKKXv2ojJg47tvWVJXOGZkf9+0CAEB8pGQwzcnJIU3TqLy83HB/eXk55eXlxXxOXl5ehx7v9XrJ6/XGp8AWKewWoJklfa0uRof0yPDSrB/0tboY0AXDe2fR8N5ZVhcDAAAskJKDnzweD40ZM4Y2btwo74tGo7Rx40YqKSmJ+ZySkhLD44mIXn/99VYfDwAAAAAdk5ItpkRECxYsoFmzZtHYsWNp/PjxtGLFCqqpqaHZs2cTEdHll19OBQUFtHTpUiIiuv766+nUU0+lBx98kKZOnUrPPvssvf/++/Tb3/7WyrcBAAAAkDRSNphedNFFdODAAVq0aBGVlZXRqFGjaMOGDXKA07fffkuq2tSg/IMf/ICeeeYZuuuuu+iOO+6gQYMG0YsvvkjHH3+8VW8BAAAAIKkozBz/EQbQQlVVFWVlZVFlZSVlZmZaXRwAAABoBxy/Eysl+5gCAAAAgP0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtpOySpIkmFtiqqqqyuCQAAADQXuK4jYUyEwPBNEGqq6uJiKiwsNDikgAAAEBHVVdXU1ZWltXFSHoK4xQgIaLRKO3du5cyMjJIUZS4bruqqooKCwtpz549cV3H16ztmrltJ5bZzG2jzInZNsqcmG07scxmbhtlTsy2mZmqq6spPz+fVBU9IM2GFtMEUVWVevfubeprZGZmxv2LbuZ2zdy2E8ts5rZR5sRsG2VOzLadWGYzt40ym79ttJQmDqI/AAAAANgCgikAAAAA2AKCaRLwer20ePFi8nq9jtiumdt2YpnN3DbKnJhto8yJ2bYTy2zmtlHmxG0bEgeDnwAAAADAFtBiCgAAAAC2gGAKAAAAALaAYAoAAAAAtoBgCgAAAAD2wB2wZMkSHjt2LKenp3OPHj343HPP5U8++cTwmKNHj/LcuXO5W7dunJaWxueffz6XlZXJv+/YsYMvvvhi7t27N/t8Ph4yZAivWLHCsO3MzEzu0aMHB4NBzsjI4BNPPJE3bNhwzG0/+OCDnJuby6qqMhFxv379eOrUqYYyDxw4kNPS0piImIh40KBB/MADD7S53U2bNnFeXh4riiKfl5WVxfPnz5fbDgaD8m/NbxdccEGrf2t+0zSNu3XrxoqisKIo7Pf7uaioiN1ut3yMoiisaRq73W52uVzt3ra+/KqqssfjafdzO7Jtr9fLw4YNY5/PF9ftmnnTNC0hr+OUm6h/HalfHbmJ72iq3/A5JOamKAoXFBRYXg673LKysuR3vDPPb+13IS0tjQcOHMgej4f9fn+nfleDwSD7/f4W+8/j8bDX6+VBgwZxcXFxq89PT0/nSZMm8bhx47hbt27s8/l48ODBvHz5cl6/fr3h+C9uqqpy//79+cYbbzxm+W6++WZDhhGZRf9ZaprGBQUF8jEDBgzg0tJSHjhwIGuaxqqqssvl4sGDB3NRUZF8X6eeeqohG/3sZz/jM844Q34eLpeLu3fvztnZ2YZsdOqpp8b8HLxeL48fP57fe+89mWcOHjwo80p6ejoTER86dIiZmX//+9/ziBEj2O/3c15eHs+ePZsPHjwYMw/+4Q9/YCLic88913B/WVkZz5o1i3v16sV+v58nT57Mn332WUeiJncomE6ePJkff/xx3rVrF+/YsYPPPvtsLioq4sOHD8vHXHPNNVxYWMgbN27k999/n0888UT+wQ9+IP++du1avu6663jTpk385Zdf8lNPPcV+v5+HDh0qt33ppZfykCFDOC8vj3fs2MELFy5kt9vNF1xwQZvbnjNnDk+YMIFvvvlmJiL++c9/zqqq8owZM2SZ+/Xrx4FAgOfNm8dExKtXr2aXy8XZ2dmtbveRRx7h/v37s9/v51/84hd85ZVXyi/Lb3/7W961axe/+OKLrKoqp6WlcV5eHg8cOJCJiP1+PxcWFvILL7zAGzZs4DFjxnC/fv04MzOT9+3bx5MmTWJVVfncc8/lfv36yS/y5MmT+de//jUHg0EZ8EpKStjtdstK6PF4+JJLLmFN03jo0KE8btw4XrFiBWdmZvKUKVO4V69e7PP5+K677uKePXvKMnu9Xl66dKl8rfT0dF61ahVnZ2fLyi9COhHx0KFDOT8/n4cNG2Yo8/Tp0zk7O1uGZn14Frdrr72Wzz77bMN9kyZN4m7dunF2drahzEuWLGG3281FRUU8dOhQw4+g/gcuLS2N09LSeM6cOTF/YMTn0atXLx48eDB/+OGHPHXqVM7Pz+du3boxUUN4Fp+HKHtGRkbMHyLx2rm5uVxYWMi9evWSgeL000/n3NxcDgQCMZ+jv4kfMfFvsU/04SQnJ4eJiDds2MClpaWsqir369evxY908x/sn/3sZxwMBmO+biAQ4L59+8p/H3/88YbX1O+35kGp+YHL7XYb7svNzeXevXtzIBDg1157TdZVRVG4V69ebX6e4jPQn8CIOqiqKrvdbj7zzDPZ4/HwiBEj5PMGDBgQ86RH/Ni6XC7D3/UH4LFjx3KfPn3Y7/ezqqr85ptv8rRp01jTNFkn9OXUB3RN01rs5x49erCiKPJz6927t9yHd955J3s8HnkgivVZiJNM/X2xDsrFxcWy7ixatIgHDhxoOEGN9RmPHTtWvu6ECRNaPCYnJ4f79OnDI0aM4KKiIvZ4PLxkyRLOz8+P+X0Wn2F2djb36NGDPR5Pq9+ZwsJC9vl88vuWkZHBt956K2dmZsZ8vPhO3nvvvfIz/uEPf9hiH6qqyl6vlzMyMuT34oQTTuBx48YZ9kNbN1GGWN+VQYMGcU5OjvwdEccej8fD3bt3N3yXm79WWloajxs3Tv47Ly/PsH8GDRok///+++/nc845h9PT0w3lEJ+xuG/QoEEtvpeqqvLYsWPlYy+++GL+8MMP+Te/+Q0TEb/yyit8zjnncE5OjtyO2+3mvLw87tGjh3wdVVUNvwuiTojneL1evvjii+Vv8WmnncYbN27k6dOnG74ror6LuuD3+3nmzJnyu0FEfNZZZ/FJJ50kn7Ny5Ur+9a9/LQPu2rVrecuWLfK4PGDAAPn9E5+Hqqo8YsQIXr58ubx/2rRpfNZZZ8nyEhFv3ryZTz31VO7fvz//4x//4K+//pqfeuopDgQCPGbMGFYURf4+qKrKOTk5/N577/ELL7zAaWlpfMopp/BNN93EM2fO5PT0dL755pvlfuzVqxdffPHFhgxzySWXsKIo3KNHD77uuut46NCh8tipaRr/5S9/4WXLlrGmaXzCCSdwr169+Fe/+hVnZGSwoig8dOhQ/vLLL/myyy5jTdN4zZo1Mht5PB7OysqSQfy0007j8ePHt8hGY8aM4auuuor37dvHq1evZrfbzStXruSPPvqIr7rqKg4Gg1xeXs7MzOeee67cp4sWLWKihmC6efNmVlWVH374Yf7qq6/4b3/7Gw8bNozPO++8Flnw66+/5oKCAj755JMNwTQajfKJJ57IJ598Mm/dupU/+eQTvvrqq1vkxGPpUDBtbv/+/UxE/NZbbzEzc0VFBbvdbn7hhRfkYz7++GMmIt6yZUur25k7dy5PmjSpzW0PHjyYNU1r17a//vprJiLevn17i22L7a5YsYKJiHfv3s2KovDJJ5/c6naj0Sjn5eXxL3/5S/mYE088kYmI//CHPzAz86233sqDBw9mIuKZM2fyXXfdJb+EscqclpbWYrvDhw+XX5bi4mJmZsOX9/bbb+esrCyuqKiQP7DMzMXFxTx//nwmIr7rrrs4KysrZpl79+4tfziYmQcMGCCDwFtvvcWhUMhQ5ocffphdLpfc9sCBA1ts99RTT+WZM2cyUUPIUBSF8/Ly5A/pX//6Vy4oKODbb79dvreHHnqIH374Yc7NzTWUWYTjuro6+YMsws1LL73ERA1BaOLEiYZ9qL8FAgHD5zFw4EDDvhef5fbt2w0/lGK/ERH379/fcH9ubi6fd955rCgKf/jhh0zU1GIQiUSYmTkQCBhaEXw+nwwYsVqmjzvuOFZVla+66qqYZ/Bff/015+Xl8bJly+TnKj7TrKysFgeyBx54gFVV5f/4j/9gIpIHbXGyRETyoHT//fezoii8dOlSvuGGG5iIuKioyLA9/a15UBJlLyoqkge2tLQ0vvDCC9nr9bLL5eLjjz+eCwoKeMCAAa0GhEGDBvGdd97Je/bskWUVwVe85hlnnCHrs6Zp7HK5OBKJ8E9+8hPDttLT07l79+6y/H6/3/Be8vLy5L4V30FN03jp0qW8atUqwxWPk046iUePHi3Dibj/gQceMNQzUWZxIqwoiqznLpdL1uf9+/fLfTdkyBDD/tPfVFXl008/nbdu3Sq3IcLQzp075eOWLl3K48ePZyLim266iYmI8/Pz5XdFfHbTp0+X+/zGG29sEaTmzJnDiqLwP/7xD7kPmZkvu+wyWYfF78xPf/pTWUaXyyVDUGu35t/NwsJC+dshPtNgMCjrnbg99thj8u/NyztkyBD+y1/+wkRNYYiI+PXXX5e/Sc2/u2lpaXzNNde0uK9bt26GOiRC/xtvvCHrhqqqch+edNJJ8vMIBAKsKApv2bJF1i1RVv371teNHj16yBNpr9drOF7NmDFD7u+JEyey1+uVJwfiOfoT9SFDhvBpp50mfyP79+/PzMxvvvkmEzW1fpWUlMjnXH755axpGs+dO9fwXXv11VflY/r168e9evXilStXGsqzZMkSJiJ+5JFHmJn51VdfNXy3/vu//1v+vziZcLlcvHjxYnl8+dOf/sSrVq2S+/aee+5hZpb7Zvv27fLzGD16NOfn57OmafKYqq8LW7Zs4RNOOEFu9/TTTzfUiUOHDnFFRQUrisKvv/663O706dNlq6v4bE466ST2er3yOH7++efzjBkzmJn58ccfN4TC+fPnc58+ffihhx4y7L9PP/2UiYjHjx/PzCyPVX6/nwOBAD/22GPMzDxv3jxWFEXmAX1Dgsga+tdnZr700kuZiHjXrl3y/UYiEe7RowevWbNGHv/79u3L119/PTMzjx8/nufNmye3EYlEOD8/X/7WnXrqqbxx40YmIv7zn/8sPzPx/dF75JFHuKCgwHBfOBzmH/zgB/zYY4/xrFmzDMFUfBa7du0yvL6+vO3RpT6mlZWVRETUrVs3IiLatm0b1dfXU2lpqXzMkCFDqKioiLZs2dLmdsQ2Ym07Go3S999/T5FIpMvbFtsV6+j+6U9/ImamCy64oNXtfv3111RWViZfe+/evfTVV1+R1+uVj9myZQt1796diIgWLFhAn376qdxe8zJ3796dIpFIi+1WVVVRTk4O5eTkUF1dHRERTZ48mcLhMBERHTp0iIiI/uu//ouIiE466SSKRqNUXV1NgwcPpqKiIvriiy8oFAqRqqqGbRMR1dXVkdvtpkgkQkRE+/bto549e8rPecWKFfKxw4YNo//+7/8mj8dDgwcPpqysLKqqqoq53TfffJPS09Plv0OhELlcLiIi2rx5M3333Xf05ZdfEhFRNBqlRx99lJ566ikqLS2VZa6rq6O5c+dScXExeTweGjNmDBERlZWVERFReXk5ERH5fD75WrEmUWZm+XlkZWXRoUOHSFEUUhSFfve735Hf7yciov3799Nnn31GiqLI5+7atYuIiDIyMgzbLC8vp5deeomYmb799lvKycmRn6GmabRu3ToaMmSI3E/iM6itrZX/39xnn31G0WiUtm7dSjU1NaSqDV/FtLQ0IiLq168flZWV0dNPP0379+8nbjiJJEVRZB0W75eI6OWXX6ahQ4fSunXriIho+PDh8vPu27evLCsR0e23307MTGeddRb17t2biIgKCwvl9pqvCX306FHDv7/44guKRqNUVVVFu3fvJk3T6OjRo/T8889TXV0d5ebmUl1dHX333XeyHuiJ9/rvf/+bHnjgASouLpZ/i0QipKoqDRs2jDRNo4MHD1JdXR2pqkqRSITcbjcREf3tb39rUUav1yv3ZzQaNfxd1KOvvvqKPB4PZWVlkcvlooULF9LcuXMN+3zLli20fft2ikajpGkaeTweIiJ6+OGH5WOOHDkiX2fbtm1EROTxeCg3N5fS0tIoHA7T3LlzKT8/n95++21ZnkmTJsn9Jz4HIRqN0qZNm+ikk04iIqJwOEy1tbWkKAodf/zx1L17d1JVlRYuXEhbt24lIqIJEyYQEZGiKHTw4EEiIlnv3nvvPfkaa9eupWg0aqjvTz75JHm9Xrr//vspGAxSfX09KYoivwdiv9TU1NBTTz0lyzh8+HB65513iIgoJyeHYnn55ZfpjDPOoEAgQEQNv5nit0N8d4gafoP0fve738m62Hwffv755/Szn/1Mvkfx/T/jjDOorKyMiouL5esJ6enpht9iooa6kp2dTS+++KK8T/wuDBw4kIqKisjn81E0GqW5c+dSTU0Nffrpp/JzPXLkCDEzzZgxg1RVpcOHD8vPVb8+ezQapZUrVxIRkdvtpn//+99ERPL3SDxHfC+Zmf7v//6P6urq6MCBA7KsREQff/yx3O5nn31G7777Ln3xxRdERPTdd9/RjBkz5G9kdnY27d69W/5bfK75+fn01ltvyfuys7PlcYao4dhYU1Mjv2PhcJiGDBki69B1111HiqLQ7t27DZ/nFVdcIf//888/l+/lkUcekeWfMWMG3XDDDfI9i313yimnEBHR6NGj6c0336SNGzfSrl27KDs7myKRCAWDQcNn27t3b/rd735Hn332GRERXX311bRx40YiMtZFn89HiqLQGWecQYqi0Jo1a+jtt9+mUChE48ePp507dxJRw3c9MzOT/vrXv9KHH35ImzdvpilTpsjtRCIR+uc//0mKotBtt91meN+KotATTzwhP8Ps7Gz6/vvv6emnn6ZAIEDMTLW1tVRSUkJERBUVFcTMdOqppxJRw3HB7/cbsobf76fNmzfL16ioqJDvR1BVlbxeL23evFke/10uFz399NOUk5NDW7dupX379snfKFVVqbS0lF577TW699576Xe/+12L3x4iopKSEtqzZw+98sorxMxUXl5O69evp7PPPtvwuHvvvZd69uxJc+bMabEN8Vm0Vt52a3eEbSYSifDUqVN54sSJ8r6nn36aPR5Pi8eOGzeOb7311pjbeeedd9jlcvGrr77a6rYfeOABTktLa/e2RYvp448/bti2frvi7EpcDmtru++88w4TNfSlEK0RiqLwxIkT+cILL2Rm5qKiItlUz8w8cOBAednmyJEjhm3369ePPR6P3O7evXuZmblXr16cm5vLiqLwKaecwszM1dXVhhYfcVMURX422dnZXF5ezuPGjeMpU6ZwIBCQLRFi2/feey8TEffp04fdbrd87QEDBrDH45GtevpWv6FDh8pt5+fnc/fu3eXnJrbbr18/WebjjjtOlk1RFO7WrVurl9bcbjd/9913ssyihWv69OnMzPzJJ58YHi/KpSgKjx8/nidOnCgvT7rdbsMlK32Zs7OzOT8/nwcMGMBDhw7lPn36GD5Dsd3i4mIOBALcp08fw+U4cWt+KW3MmDGGy0HNH+/1ennEiBFy27E+A03TeMGCBbIsRCRbkcXlRtEaIN5brBZN/SXGWLdZs2axpmly2+K2d+9eQytg88+6+f83v4nPUpRVtDoNGTJE1r/mra2tfV7N68Y333zDHo+Hhw4dyn6/31COs846S7YE6i8lt9Z1oPltwoQJnJ+fz16vl71er2zZEH+fPHlyzDKOGzcu5mVz/X546KGHOD8/P2YrOBHx1VdfLfe9/v62+mP36NFDftf0rcpExN988w0XFRXJS/vN65fYP7G6m+Tn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crkM+0T0E23tsxD1oXkrrb48J5xwgpw9QdO0FlNFuVwu+ZsmbsFg0DAjh7j17t1bfpbFxcVcWlpqOBlVVZXPO++8FlcNxO9k37592ev1tphG7LTTTjPMbHH++efLFl2ihmPEM888w8cff7z8fJufBLvdbj7uuOMMn0X37t1lyFQUhWfPnm3ogqJpGj/77LPytQKBAJ944onysxX7bPDgwXzDDTewqqr8wx/+kFeuXMnnnHOO4fUffvhhDgQC8qS/W7dufMcdd3BGRoacclG0AouT6N69e/Nzzz3HOTk5fM011xgaEf74xz/y9u3bubq6mvv06cO33nora5rGfr+f77zzTv7FL37Bd911F5911ll85513cv/+/VlVVTn3+SOPPMLnn38+a5rGWVlZsm/3ihUreMCAATx69Gh+++23efz48ayqKmdkZPDatWt53759/MUXX/CiRYvkianIFcXFxTIXbdmyhe+44w5+//33+euvv5YnQIMHD+Z//vOffPXVV3MwGDTMzS5mUnj44YeZqKHL4j333CNnE/nyyy958+bNPHbsWDnbQCyxLuU///zz/Oabb/KXX37JL774Ivfp04fPP//8jkTNjgXT1n6kHn/8cfkYMQl+dnY2BwIBPu+883jfvn3y7yIQduZ22WWXtbntWH1/2nubNGlSq9u9/PLLO7y9YDDIhYWFMT+PFStWyGAq5hHr6q2oqIj37dvHjz/+eKt97Lqy7ZtuusnQby0et27duskyx3O7RA0/wDfddFOb0xV15uZ2u/mkk07iCy+8MO5lNus2efJk3rdvHz/00ENx37aqqobL9fG69ejRg3v37t1q396u3BRF4dzc3HZdirbLTZwEHGtgUGduBQUFcv5Iu91ae79paWm8cOHCuL+Ooig8cuTIFtNOxeNWVFTE1157bVwWHtHf8vPz+aKLLjKMY4j3MUB/O1a/czGAqa1FZ1RV5YKCAtmliaihlbqtifOJGsJ7YWFhzP7R4tarVy+ePn26oUvWwIEDedWqVS0Gp+nL079/f77zzjvluJPmtzfffJP79OnDkydPPuZn5PV6OT09nT0eD2dmZsquUrFubrebu3fv3mJ8S0duubm53K1bN/Z6vTxw4EDZ7cXj8fD48eP573//uyHLzZo1K+Z2ZsyYwcXFxez3+7lXr148Y8YM/te//tVqJowVTB9++GF54lRUVMR33XVXq62prVEaAycAAAAAgKW6NI8pAAAAAEC8IJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALfw/J8+MicwI/YAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "x = [r['date_added'] for r in recs]\n", - "y = [r['time_lost'] for r in recs]\n", + "y = [int(r['is_valid']) for r in recs]\n", + "display_markdown('### IsValid vs DateAdded', raw=True)\n", "plt.plot(x, y) \n", "plt.show()" ] @@ -258,46 +2178,169 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "20", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "Message text from log:\n", + "> investigating banding issue" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "One full record (the last one retrieved):\n", + "> {'id': 'f9a4b932-18e9-47db-9b7d-a2fbe3c15e70', 'site_id': 'tucson', 'obs_id': 'AT_O_20221115_000019', 'instrument': 'LATISS', 'day_obs': 20221115, 'seq_num': 19, 'message_text': 'investigating banding issue', 'level': 10, 'tags': ['background_issue'], 'urls': [], 'user_id': 'admin@love1.tu.lsst.org', 'user_agent': 'LOVE', 'is_human': True, 'is_valid': True, 'exposure_flag': 'questionable', 'date_added': '2022-11-16T04:57:30.954849', 'date_invalidated': None, 'parent_id': None}" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'id': 'f9a4b932-18e9-47db-9b7d-a2fbe3c15e70',\n", + " 'site_id': 'tucson',\n", + " 'obs_id': 'AT_O_20221115_000019',\n", + " 'instrument': 'LATISS',\n", + " 'day_obs': 20221115,\n", + " 'seq_num': 19,\n", + " 'message_text': 'investigating banding issue',\n", + " 'level': 10,\n", + " 'tags': ['background_issue'],\n", + " 'urls': [],\n", + " 'user_id': 'admin@love1.tu.lsst.org',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'exposure_flag': 'questionable',\n", + " 'date_added': '2022-11-16T04:57:30.954849',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None}" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "rec = recs[0]\n", - "rec" + "rec = recs[-1]\n", + "\n", + "msg = rec[\"message_text\"]\n", + "md = f'Message text from log:\\n> {msg}'\n", + "display_markdown(md, raw=True)\n", + "\n", + "md = f'One full record (the last one retrieved):\\n> {rec}'\n", + "display_markdown(md, raw=True)\n", + "\n", + "display(rec)" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "21", + "cell_type": "markdown", + "id": "23", "metadata": {}, - "outputs": [], "source": [ - "msg = rec[\"message_text\"]\n", - "print(msg)" + "\n", + "## Stakeholder Elicitation" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "22", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0\n", + "SHELL /bin/bash\n", + "SESSION_MANAGER local/chimp20:@/tmp/.ICE-unix/6143,unix/chimp2...\n", + "QT_ACCESSIBILITY 1\n", + "XDG_CONFIG_DIRS /etc/xdg/xdg-mate:/etc/xdg\n", + "XDG_SESSION_PATH /org/freedesktop/DisplayManager/Session0\n", + "GTK_IM_MODULE ibus\n", + "LANGUAGE en_US\n", + "TERMCAP \n", + "SSH_AUTH_SOCK /run/user/1000/keyring/ssh\n", + "INSIDE_EMACS 29.4,comint\n", + "XMODIFIERS @im=ibus\n", + "DESKTOP_SESSION mate\n", + "EDITOR /usr/bin/emacsclient\n", + "GTK_MODULES appmenu-gtk-module:gail:atk-bridge:canberra-gt...\n", + "XDG_SEAT seat0\n", + "MATE_DESKTOP_SESSION_ID this-is-deprecated\n", + "SNAP_EUID 1000\n", + "PWD /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "GSETTINGS_SCHEMA_DIR /home/pothiers/snap/emacs/common/.local/share/...\n", + "XDG_SESSION_DESKTOP mate\n", + "LOGNAME pothiers\n", + "QT_QPA_PLATFORMTHEME gtk2\n", + "XDG_SESSION_TYPE x11\n", + "GPG_AGENT_INFO /run/user/1000/gnupg/S.gpg-agent:0:1\n", + "XAUTHORITY /home/pothiers/.Xauthority\n", + "XDG_GREETER_DATA_DIR /var/lib/lightdm-data/pothiers\n", + "GDM_LANG en_US\n", + "HOME /home/pothiers\n", + "LANG en_US.UTF-8\n", + "LS_COLORS \n", + "XDG_CURRENT_DESKTOP MATE\n", + "COLUMNS 80\n", + "EMACS_SNAP_DIR /snap/emacs/2504\n", + "VIRTUAL_ENV /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "XDG_SEAT_PATH /org/freedesktop/DisplayManager/Seat0\n", + "SNAP_UID 1000\n", + "CLUTTER_IM_MODULE ibus\n", + "LESSCLOSE /usr/bin/lesspipe %s %s\n", + "XDG_SESSION_CLASS user\n", + "TERM xterm-color\n", + "GTK_OVERLAY_SCROLLING 0\n", + "LESSOPEN | /usr/bin/lesspipe %s\n", + "USER pothiers\n", + "GIT_PAGER cat\n", + "DISPLAY :0\n", + "SHLVL 1\n", + "QT_IM_MODULE ibus\n", + "XDG_VTNR 7\n", + "UBUNTU_MENUPROXY 1\n", + "XDG_SESSION_ID c2\n", + "VIRTUAL_ENV_PROMPT (venv) \n", + "XDG_RUNTIME_DIR /run/user/1000\n", + "COMPIZ_CONFIG_PROFILE mate\n", + "PS1 (venv) ${debian_chroot:+($debian_chroot)}\\u@\\h...\n", + "XDG_DATA_DIRS /snap/emacs/2504/usr/share:/usr/share/mate:/us...\n", + "PATH /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "GDMSESSION mate\n", + "DBUS_SESSION_BUS_ADDRESS unix:path=/run/user/1000/bus\n", + "QT_FONT_DPI 96\n", + "QT_SCALE_FACTOR 1\n", + "GIO_LAUNCHED_DESKTOP_FILE_PID 19241\n", + "OLDPWD /home/pothiers/sandbox/ts_logging_and_reporting\n", + "_ /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "JPY_SESSION_NAME /home/pothiers/sandbox/ts_logging_and_reportin...\n", + "JPY_PARENT_PID 431334\n", + "PYDEVD_USE_FRAME_EVAL NO\n", + "CLICOLOR 1\n", + "FORCE_COLOR 1\n", + "CLICOLOR_FORCE 1\n", + "PAGER cat\n", + "MPLBACKEND module://matplotlib_inline.backend_inline\n" + ] + } + ], "source": [ - "import os\n", "#EXTERNAL_INSTANCE_URL\n", + "ed = dict(os.environ.items())\n", "with pd.option_context('display.max_rows', None,):\n", - " print(pd.DataFrame(os.environ))" - ] - }, - { - "cell_type": "markdown", - "id": "23", - "metadata": {}, - "source": [ - "\n", - "## Stakeholder Elicitation" + " print(pd.DataFrame(ed.values(), index=ed.keys()))" ] }, { diff --git a/notebooks_tsqr/narrativelog.ipynb b/notebooks_tsqr/narrativelog.ipynb index b767518..58d7323 100644 --- a/notebooks_tsqr/narrativelog.ipynb +++ b/notebooks_tsqr/narrativelog.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "0", "metadata": {}, "outputs": [], @@ -23,13 +23,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "2", - "metadata": { - "jupyter": { - "source_hidden": true - } - }, + "metadata": {}, "outputs": [], "source": [ "# Only use packages available in the Rubin Science Platform\n", @@ -38,16 +34,28 @@ "import pandas as pd\n", "from pprint import pp\n", "from urllib.parse import urlencode\n", - "from IPython.display import FileLink\n", - "from matplotlib import pyplot as plt" + "from IPython.display import FileLink, display_markdown\n", + "from matplotlib import pyplot as plt\n", + "import os" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'https://tucson-teststand.lsst.codes/narrativelog'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", "log_name = 'narrativelog'\n", @@ -58,19 +66,8 @@ "\n", "timeout = (float(response_timeout), float(read_timeout))\n", "\n", - "# Env list comes from drop-down menu top of:\n", - "# https://rsp.lsst.io/v/usdfdev/guides/times-square/\n", - "envs = dict(\n", - " #rubin_usdf_dev = '',\n", - " #data_lsst_cloud = '',\n", - " #usdf = '',\n", - " #base_data_facility = '',\n", - " summit = 'https://summit-lsp.lsst.codes',\n", - " usdf_dev = 'https://usdf-rsp-dev.slac.stanford.edu',\n", - " #rubin_idf_int = '',\n", - " tucson = 'https://tucson-teststand.lsst.codes',\n", - ")\n", - "server = envs[env]\n", + "server = os.environ.get('EXTERNAL_INSTANCE_URL', \n", + " 'https://tucson-teststand.lsst.codes')\n", "service = f'{server}/{log}'\n", "service" ] @@ -86,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "5", "metadata": { "jupyter": { @@ -127,10 +124,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempt to get logs from url='https://tucson-teststand.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=999'\n", + "Retrieved 138 records, each with numf=24 fields.\n" + ] + } + ], "source": [ "# TODO Often fails on first request. Find out why!\n", "try:\n", @@ -176,10 +182,168 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "10", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Field Name
0time_lost_type
1subsystems
2cscs
3components
4primary_software_components
5site_id
6level
7date_added
8date_end
9date_invalidated
10is_valid
11id
12primary_hardware_components
13is_human
14message_text
15user_agent
16parent_id
17time_lost
18category
19user_id
20date_begin
21systems
22tags
23urls
\n", + "
" + ], + "text/plain": [ + " Field Name\n", + "0 time_lost_type\n", + "1 subsystems\n", + "2 cscs\n", + "3 components\n", + "4 primary_software_components\n", + "5 site_id\n", + "6 level\n", + "7 date_added\n", + "8 date_end\n", + "9 date_invalidated\n", + "10 is_valid\n", + "11 id\n", + "12 primary_hardware_components\n", + "13 is_human\n", + "14 message_text\n", + "15 user_agent\n", + "16 parent_id\n", + "17 time_lost\n", + "18 category\n", + "19 user_id\n", + "20 date_begin\n", + "21 systems\n", + "22 tags\n", + "23 urls" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "pd.DataFrame(flds, columns=['Field Name'])" ] @@ -195,10 +359,141 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "12", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
time_lost_typefaultNoneNone
is_humanTrueFalseNone
level1000None
subsystemsNoneNoneNone
cscsNoneNoneNone
categoryNoneNoneNone
systemsNoneNoneNone
componentsNoneNoneNone
user_agentstringLOVEmake_log_entry
primary_software_componentsNoneNoneNone
site_idtucsonNoneNone
is_validTrueFalseNone
primary_hardware_componentsNoneNoneNone
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "time_lost_type fault None None\n", + "is_human True False None\n", + "level 100 0 None\n", + "subsystems None None None\n", + "cscs None None None\n", + "category None None None\n", + "systems None None None\n", + "components None None None\n", + "user_agent string LOVE make_log_entry\n", + "primary_software_components None None None\n", + "site_id tucson None None\n", + "is_valid True False None\n", + "primary_hardware_components None None None" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "pd.DataFrame.from_dict(facets, orient='index')" ] @@ -214,12 +509,151 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "14", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Table available as CSV file: \n" + ] + }, + { + "data": { + "text/html": [ + "tl.csv
" + ], + "text/plain": [ + "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
date_addedtime_losttime_lost_type
02024-08-15T17:54:06.5674180.00None
12023-01-19T22:57:39.5612930.00None
22024-08-16T14:50:09.5070730.00None
32023-07-19T15:28:22.02790024.00None
42024-08-15T18:08:13.5480590.00None
............
1332022-11-30T02:19:07.3167850.00None
1342024-08-16T15:03:39.9964730.00None
1352023-05-09T17:26:25.05248724.01None
1362024-08-15T20:02:54.2999980.00None
1372024-08-23T18:16:32.7167420.00fault
\n", + "

138 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " date_added time_lost time_lost_type\n", + "0 2024-08-15T17:54:06.567418 0.00 None\n", + "1 2023-01-19T22:57:39.561293 0.00 None\n", + "2 2024-08-16T14:50:09.507073 0.00 None\n", + "3 2023-07-19T15:28:22.027900 24.00 None\n", + "4 2024-08-15T18:08:13.548059 0.00 None\n", + ".. ... ... ...\n", + "133 2022-11-30T02:19:07.316785 0.00 None\n", + "134 2024-08-16T15:03:39.996473 0.00 None\n", + "135 2023-05-09T17:26:25.052487 24.01 None\n", + "136 2024-08-15T20:02:54.299998 0.00 None\n", + "137 2024-08-23T18:16:32.716742 0.00 fault\n", + "\n", + "[138 rows x 3 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "cols = ['date_added', 'time_lost']\n", + "cols = ['date_added', 'time_lost', 'time_lost_type']\n", "df = pd.DataFrame(recs)[cols]\n", "\n", "# Allow download of CSV version of DataFrame\n", @@ -233,12 +667,183 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "15", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
message_texttagsuser_idcomponentsdate_end
0Wubba. Using do_makeLogEntry; vr=0.1[watcher, alarm]admin@love1.tu.lsst.orgNone2024-08-15T12:44:06.456000
1[]admin@love1.tu.lsst.orgNone2023-01-19T22:50:03.167000
2Wubba. Using do_makeLogEntry {vr=}[watcher, alarm, wubba]admin@love1.tu.lsst.orgNone2024-08-16T14:49:32.376667
3Narrative log test[observatorysoftwaretools, love]admin@love1.tu.lsst.orgNone2023-07-19T15:24:01.754000
4Wubba. Using do_makeLogEntry; vr=0.1[watcher, alarm]admin@love1.tu.lsst.orgNone2024-08-15T12:44:06.456000
..................
133ComCam is whack.[]admin@love1.tu.lsst.orgNone2022-11-30T02:17:35.179000
134Wubba. Using do_makeLogEntry {vr=}[watcher, alarm, wubba]admin@love1.tu.lsst.orgNone2024-08-16T15:03:02.869590
135Inria narrative log test 3[observatorysoftwaretools, love]admin@love1.tu.lsst.orgNone2023-05-09T17:25:33.463000
136Wubba. Using do_makeLogEntry; vr=0.2[watcher, alarm]admin@love1.tu.lsst.orgNone2024-08-15T12:54:06.456000
137Testing ampersan &Test&\\r\\n[]saranda@tucson-teststand.lsst.codesNone2024-08-23T18:15:55.678000
\n", + "

138 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " message_text tags \\\n", + "0 Wubba. Using do_makeLogEntry; vr=0.1 [watcher, alarm] \n", + "1 [] \n", + "2 Wubba. Using do_makeLogEntry {vr=} [watcher, alarm, wubba] \n", + "3 Narrative log test [observatorysoftwaretools, love] \n", + "4 Wubba. Using do_makeLogEntry; vr=0.1 [watcher, alarm] \n", + ".. ... ... \n", + "133 ComCam is whack. [] \n", + "134 Wubba. Using do_makeLogEntry {vr=} [watcher, alarm, wubba] \n", + "135 Inria narrative log test 3 [observatorysoftwaretools, love] \n", + "136 Wubba. Using do_makeLogEntry; vr=0.2 [watcher, alarm] \n", + "137 Testing ampersan &Test&\\r\\n [] \n", + "\n", + " user_id components \\\n", + "0 admin@love1.tu.lsst.org None \n", + "1 admin@love1.tu.lsst.org None \n", + "2 admin@love1.tu.lsst.org None \n", + "3 admin@love1.tu.lsst.org None \n", + "4 admin@love1.tu.lsst.org None \n", + ".. ... ... \n", + "133 admin@love1.tu.lsst.org None \n", + "134 admin@love1.tu.lsst.org None \n", + "135 admin@love1.tu.lsst.org None \n", + "136 admin@love1.tu.lsst.org None \n", + "137 saranda@tucson-teststand.lsst.codes None \n", + "\n", + " date_end \n", + "0 2024-08-15T12:44:06.456000 \n", + "1 2023-01-19T22:50:03.167000 \n", + "2 2024-08-16T14:49:32.376667 \n", + "3 2023-07-19T15:24:01.754000 \n", + "4 2024-08-15T12:44:06.456000 \n", + ".. ... \n", + "133 2022-11-30T02:17:35.179000 \n", + "134 2024-08-16T15:03:02.869590 \n", + "135 2023-05-09T17:25:33.463000 \n", + "136 2024-08-15T12:54:06.456000 \n", + "137 2024-08-23T18:15:55.678000 \n", + "\n", + "[138 rows x 5 columns]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "df = pd.DataFrame(recs)\n", + "cols = ['message_text','tags','user_id', 'components','date_end']\n", + "df = pd.DataFrame(recs, columns=cols)\n", "df" ] }, @@ -253,10 +858,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "17", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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6lOf0q5du2LW6evr06pVq1RVVaXS0lKtWLFCbW1tMes0NTVp+fLlKi4uVnV1te68804NDQ1l86VgDJhtTO0lpiGSKQAArsj5YLp582atWrVK27Zt08aNGzU4OKglS5aop6fHWueOO+7Q008/rSeeeEKbN29Wc3OzPv3pT1v3B4NBLV++XAMDA9qyZYseffRRPfLII7rnnnvG4iUhi8wxS/Po/AQAgOvyxnoH3Pbcc8/FXH/kkUdUXV2tHTt26IorrlBHR4d+9KMfaf369frYxz4mSXr44Yd17rnnatu2bbrsssv0m9/8Ru+++65eeOEF1dTU6MILL9TXv/513XXXXfra174mv98/Fi8NWWC2J/V6PfJ6wtX4QYIpAACuyPkS03gdHR2SpMrKSknSjh07NDg4qMWLF1vrzJkzRzNmzNDWrVslSVu3btW8efNUU1NjrbN06VJ1dnbqnXfeSfo8/f396uzsjFlw+jFDqNfjkdcTLjUllwIA4I4JFUxDoZC+9KUvadGiRTr//PMlSa2trfL7/aqoqIhZt6amRq2trdY69lBq3m/el8y6detUXl5uLfX19aP8apANZgj1eTzyRqrz6ZUPAIA7JlQwXbVqld5++209/vjjrj/X2rVr1dHRYS0HDx50/Tkx+swQ6vFIZjNT2pgCAOCOnG9jalq9erU2bNigl19+WdOnT7dur62t1cDAgNrb22NKTdva2lRbW2ut88orr8Rsz+y1b64Tr6CgQAUFBaP8KpBtZgj1eT3yRaryQ6Gx3CMAAHJXzpeYGoah1atX68knn9SLL76oWbNmxdy/YMEC5efna9OmTdZtu3btUlNTkxobGyVJjY2N2rlzpw4fPmyts3HjRgUCAc2dOzc7LwRjIpSkjSklpgAAuCPnS0xXrVql9evX65e//KXKysqsNqHl5eUqKipSeXm5brrpJq1Zs0aVlZUKBAK6/fbb1djYqMsuu0yStGTJEs2dO1ef//zndf/996u1tVV33323Vq1aRalojjNLR71eWxtTgikAAK7I+WD64IMPSpKuvPLKmNsffvhhfeELX5Akfec735HX69WKFSvU39+vpUuX6oc//KG1rs/n04YNG3TbbbepsbFRJSUlWrlype67775svQyMkWiv/GgbU4NgCgCAK3I+mGYSIgoLC/XAAw/ogQcecFynoaFBzzzzzGjuGk4D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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "x = [r['date_added'] for r in recs]\n", "y = [r['time_lost'] for r in recs]\n", @@ -283,24 +899,74 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "20", "metadata": {}, - "outputs": [], - "source": [ - "rec = recs[0]\n", - "rec" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21", - "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "Message text from log:\n", + "> Testing ampersan &Test&\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "One full record (the last one retrieved):\n", + "> {'id': 'ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5', 'site_id': 'tucson', 'message_text': 'Testing ampersan &Test&\\r\\n', 'level': 0, 'tags': [], 'urls': [], 'time_lost': 0.0, 'date_begin': '2024-08-23T18:15:55.678000', 'user_id': 'saranda@tucson-teststand.lsst.codes', 'user_agent': 'LOVE', 'is_human': True, 'is_valid': True, 'date_added': '2024-08-23T18:16:32.716742', 'date_invalidated': None, 'parent_id': None, 'systems': None, 'subsystems': None, 'cscs': None, 'date_end': '2024-08-23T18:15:55.678000', 'components': None, 'primary_software_components': ['None'], 'primary_hardware_components': ['None'], 'category': 'None', 'time_lost_type': 'fault'}" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'id': 'ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5',\n", + " 'site_id': 'tucson',\n", + " 'message_text': 'Testing ampersan &Test&\\r\\n',\n", + " 'level': 0,\n", + " 'tags': [],\n", + " 'urls': [],\n", + " 'time_lost': 0.0,\n", + " 'date_begin': '2024-08-23T18:15:55.678000',\n", + " 'user_id': 'saranda@tucson-teststand.lsst.codes',\n", + " 'user_agent': 'LOVE',\n", + " 'is_human': True,\n", + " 'is_valid': True,\n", + " 'date_added': '2024-08-23T18:16:32.716742',\n", + " 'date_invalidated': None,\n", + " 'parent_id': None,\n", + " 'systems': None,\n", + " 'subsystems': None,\n", + " 'cscs': None,\n", + " 'date_end': '2024-08-23T18:15:55.678000',\n", + " 'components': None,\n", + " 'primary_software_components': ['None'],\n", + " 'primary_hardware_components': ['None'],\n", + " 'category': 'None',\n", + " 'time_lost_type': 'fault'}" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ + "rec = recs[-1]\n", + "\n", "msg = rec[\"message_text\"]\n", - "print(msg)" + "md = f'Message text from log:\\n> {msg}'\n", + "display_markdown(md, raw=True)\n", + "\n", + "md = f'One full record (the last one retrieved):\\n> {rec}'\n", + "display_markdown(md, raw=True)\n", + "\n", + "display(rec)" ] }, { From 9be02fcf63e5e3d2f38624a5c5197411ec8bb7fe Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Wed, 28 Aug 2024 07:22:14 -0700 Subject: [PATCH 14/17] WIP --- notebooks_tsqr/TEMPLATE_logrep.ipynb | 1081 +------------ notebooks_tsqr/exposurelog.ipynb | 2096 +------------------------- notebooks_tsqr/narrativelog.ipynb | 724 +-------- 3 files changed, 81 insertions(+), 3820 deletions(-) diff --git a/notebooks_tsqr/TEMPLATE_logrep.ipynb b/notebooks_tsqr/TEMPLATE_logrep.ipynb index 488dd6f..d0fd168 100644 --- a/notebooks_tsqr/TEMPLATE_logrep.ipynb +++ b/notebooks_tsqr/TEMPLATE_logrep.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0", "metadata": {}, "outputs": [], @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "2", "metadata": {}, "outputs": [], @@ -41,21 +41,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://tucson-teststand.lsst.codes/narrativelog'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", "log_name = 'narrativelog'\n", @@ -83,20 +72,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "5", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### Will retrieve from https://tucson-teststand.lsst.codes/narrativelog" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "md = f'### Will retrieve from {service}'\n", "display_markdown(md, raw=True)" @@ -104,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "6", "metadata": {}, "outputs": [], @@ -132,39 +111,20 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "7", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "## Get (up to 999) Records" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "display_markdown(f'## Get (up to {limit}) Records', raw=True)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attempt to get logs from url='https://tucson-teststand.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=999'\n", - "Retrieved 138 records, each with 24 fields.\n" - ] - } - ], + "outputs": [], "source": [ "# TODO Often fails on first request. Find out why!\n", "try:\n", @@ -210,168 +170,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "11", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Field Name
0is_human
1category
2date_invalidated
3parent_id
4time_lost
5systems
6components
7id
8primary_hardware_components
9cscs
10subsystems
11time_lost_type
12date_added
13tags
14date_end
15date_begin
16urls
17primary_software_components
18user_agent
19is_valid
20level
21site_id
22message_text
23user_id
\n", - "
" - ], - "text/plain": [ - " Field Name\n", - "0 is_human\n", - "1 category\n", - "2 date_invalidated\n", - "3 parent_id\n", - "4 time_lost\n", - "5 systems\n", - "6 components\n", - "7 id\n", - "8 primary_hardware_components\n", - "9 cscs\n", - "10 subsystems\n", - "11 time_lost_type\n", - "12 date_added\n", - "13 tags\n", - "14 date_end\n", - "15 date_begin\n", - "16 urls\n", - "17 primary_software_components\n", - "18 user_agent\n", - "19 is_valid\n", - "20 level\n", - "21 site_id\n", - "22 message_text\n", - "23 user_id" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.DataFrame(flds, columns=['Field Name'])" ] @@ -387,165 +189,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "13", "metadata": { "jupyter": { "source_hidden": true } }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
012
time_lost_typefaultNoneNone
systemsNoneNoneNone
componentsNoneNoneNone
is_humanTrueFalseNone
categoryNoneNoneNone
primary_software_componentsNoneNoneNone
user_agentmake_log_entrystringLOVE
is_validTrueFalseNone
level1000None
primary_hardware_componentsNoneNoneNone
site_idtucsonNoneNone
cscsNoneNoneNone
subsystemsNoneNoneNone
\n", - "
" - ], - "text/plain": [ - " 0 1 2\n", - "time_lost_type fault None None\n", - "systems None None None\n", - "components None None None\n", - "is_human True False None\n", - "category None None None\n", - "primary_software_components None None None\n", - "user_agent make_log_entry string LOVE\n", - "is_valid True False None\n", - "level 100 0 None\n", - "primary_hardware_components None None None\n", - "site_id tucson None None\n", - "cscs None None None\n", - "subsystems None None None" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "{'time_lost_type': {'None', 'fault'},\n", - " 'systems': {'None'},\n", - " 'components': {'None'},\n", - " 'is_human': {'False', 'True'},\n", - " 'category': {'None'},\n", - " 'primary_software_components': {'None'},\n", - " 'user_agent': {'LOVE', 'make_log_entry', 'string'},\n", - " 'is_valid': {'False', 'True'},\n", - " 'level': {'0', '100'},\n", - " 'primary_hardware_components': {'None'},\n", - " 'site_id': {'tucson'},\n", - " 'cscs': {'None'},\n", - " 'subsystems': {'None'}}" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "display(pd.DataFrame.from_dict(facets, orient='index'))\n", "display(facets)" @@ -562,141 +213,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "15", "metadata": { "jupyter": { "source_hidden": true } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table available as CSV file: \n" - ] - }, - { - "data": { - "text/html": [ - "tl.csv
" - ], - "text/plain": [ - "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
date_addedtime_lost
02024-08-15T17:54:06.5674180.00
12023-01-19T22:57:39.5612930.00
22024-08-16T14:50:09.5070730.00
32023-07-19T15:28:22.02790024.00
42024-08-15T18:08:13.5480590.00
.........
1332022-11-30T02:19:07.3167850.00
1342024-08-16T15:03:39.9964730.00
1352023-05-09T17:26:25.05248724.01
1362024-08-15T20:02:54.2999980.00
1372024-08-23T18:16:32.7167420.00
\n", - "

138 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " date_added time_lost\n", - "0 2024-08-15T17:54:06.567418 0.00\n", - "1 2023-01-19T22:57:39.561293 0.00\n", - "2 2024-08-16T14:50:09.507073 0.00\n", - "3 2023-07-19T15:28:22.027900 24.00\n", - "4 2024-08-15T18:08:13.548059 0.00\n", - ".. ... ...\n", - "133 2022-11-30T02:19:07.316785 0.00\n", - "134 2024-08-16T15:03:39.996473 0.00\n", - "135 2023-05-09T17:26:25.052487 24.01\n", - "136 2024-08-15T20:02:54.299998 0.00\n", - "137 2024-08-23T18:16:32.716742 0.00\n", - "\n", - "[138 rows x 2 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cols = ['date_added', 'time_lost']\n", "df = pd.DataFrame(recs)[cols]\n", @@ -712,424 +236,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "16", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idsite_idmessage_textleveltagsurlstime_lostdate_beginuser_iduser_agent...parent_idsystemssubsystemscscsdate_endcomponentsprimary_software_componentsprimary_hardware_componentscategorytime_lost_type
001806d0e-c21a-4e2e-8a53-1db4e8f88c0btucsonWubba. Using do_makeLogEntry; vr=0.10[watcher, alarm][]0.002024-08-15T12:44:06.456000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-15T12:44:06.456000NoneNoneNoneNoneNone
105b046b7-1266-47a9-b1de-93b6d44af242tucson0[][]0.002023-01-19T22:50:03.167000admin@love1.tu.lsst.orgLOVE...None[][][]2023-01-19T22:50:03.167000NoneNoneNoneNoneNone
20656b9b5-ccf5-48d2-a712-7e78dd26a64dtucsonWubba. Using do_makeLogEntry {vr=}0[watcher, alarm, wubba][]0.002024-08-16T14:49:32.376667admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-16T14:49:32.376667NoneNoneNoneNoneNone
30829537a-9cef-4f93-8566-7d66532e2184tucsonNarrative log test0[observatorysoftwaretools, love][]24.002023-07-18T15:24:01.754000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2023-07-19T15:24:01.754000NoneNoneNoneNoneNone
408d53806-964c-45cc-981b-d4920b5a1763tucsonWubba. Using do_makeLogEntry; vr=0.10[watcher, alarm][]0.002024-08-15T12:44:06.456000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-15T12:44:06.456000NoneNoneNoneNoneNone
..................................................................
133f73cd42f-543f-4ac7-bfad-a572808e1305tucsonComCam is whack.0[][]0.002022-11-29T02:17:35.179000admin@love1.tu.lsst.orgLOVE...None[ComCam][Hardware][]2022-11-30T02:17:35.179000NoneNoneNoneNoneNone
134f7594406-2ff7-4d9e-9063-3b768e971b1btucsonWubba. Using do_makeLogEntry {vr=}0[watcher, alarm, wubba][]0.002024-08-16T15:03:02.869590admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-16T15:03:02.869590NoneNoneNoneNoneNone
135f9e93e6a-9d13-471e-aa61-215769f56653tucsonInria narrative log test 30[observatorysoftwaretools, love][]24.012023-05-08T17:24:56.463000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2023-05-09T17:25:33.463000NoneNoneNoneNoneNone
136fe5c59d7-6e34-4144-abe6-48f398a1d45dtucsonWubba. Using do_makeLogEntry; vr=0.20[watcher, alarm][]0.002024-08-15T12:54:06.456000admin@love1.tu.lsst.orgLOVE...None[ObservatorySoftwareTools][LOVE][]2024-08-15T12:54:06.456000NoneNoneNoneNoneNone
137ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5tucsonTesting ampersan &Test&\\r\\n0[][]0.002024-08-23T18:15:55.678000saranda@tucson-teststand.lsst.codesLOVE...NoneNoneNoneNone2024-08-23T18:15:55.678000None[None][None]Nonefault
\n", - "

138 rows × 24 columns

\n", - "
" - ], - "text/plain": [ - " id site_id \\\n", - "0 01806d0e-c21a-4e2e-8a53-1db4e8f88c0b tucson \n", - "1 05b046b7-1266-47a9-b1de-93b6d44af242 tucson \n", - "2 0656b9b5-ccf5-48d2-a712-7e78dd26a64d tucson \n", - "3 0829537a-9cef-4f93-8566-7d66532e2184 tucson \n", - "4 08d53806-964c-45cc-981b-d4920b5a1763 tucson \n", - ".. ... ... \n", - "133 f73cd42f-543f-4ac7-bfad-a572808e1305 tucson \n", - "134 f7594406-2ff7-4d9e-9063-3b768e971b1b tucson \n", - "135 f9e93e6a-9d13-471e-aa61-215769f56653 tucson \n", - "136 fe5c59d7-6e34-4144-abe6-48f398a1d45d tucson \n", - "137 ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5 tucson \n", - "\n", - " message_text level \\\n", - "0 Wubba. Using do_makeLogEntry; vr=0.1 0 \n", - "1 0 \n", - "2 Wubba. Using do_makeLogEntry {vr=} 0 \n", - "3 Narrative log test 0 \n", - "4 Wubba. Using do_makeLogEntry; vr=0.1 0 \n", - ".. ... ... \n", - "133 ComCam is whack. 0 \n", - "134 Wubba. Using do_makeLogEntry {vr=} 0 \n", - "135 Inria narrative log test 3 0 \n", - "136 Wubba. Using do_makeLogEntry; vr=0.2 0 \n", - "137 Testing ampersan &Test&\\r\\n 0 \n", - "\n", - " tags urls time_lost \\\n", - "0 [watcher, alarm] [] 0.00 \n", - "1 [] [] 0.00 \n", - "2 [watcher, alarm, wubba] [] 0.00 \n", - "3 [observatorysoftwaretools, love] [] 24.00 \n", - "4 [watcher, alarm] [] 0.00 \n", - ".. ... ... ... \n", - "133 [] [] 0.00 \n", - "134 [watcher, alarm, wubba] [] 0.00 \n", - "135 [observatorysoftwaretools, love] [] 24.01 \n", - "136 [watcher, alarm] [] 0.00 \n", - "137 [] [] 0.00 \n", - "\n", - " date_begin user_id \\\n", - "0 2024-08-15T12:44:06.456000 admin@love1.tu.lsst.org \n", - "1 2023-01-19T22:50:03.167000 admin@love1.tu.lsst.org \n", - "2 2024-08-16T14:49:32.376667 admin@love1.tu.lsst.org \n", - "3 2023-07-18T15:24:01.754000 admin@love1.tu.lsst.org \n", - "4 2024-08-15T12:44:06.456000 admin@love1.tu.lsst.org \n", - ".. ... ... \n", - "133 2022-11-29T02:17:35.179000 admin@love1.tu.lsst.org \n", - "134 2024-08-16T15:03:02.869590 admin@love1.tu.lsst.org \n", - "135 2023-05-08T17:24:56.463000 admin@love1.tu.lsst.org \n", - "136 2024-08-15T12:54:06.456000 admin@love1.tu.lsst.org \n", - "137 2024-08-23T18:15:55.678000 saranda@tucson-teststand.lsst.codes \n", - "\n", - " user_agent ... parent_id systems subsystems cscs \\\n", - "0 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", - "1 LOVE ... None [] [] [] \n", - "2 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", - "3 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", - "4 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", - ".. ... ... ... ... ... ... \n", - "133 LOVE ... None [ComCam] [Hardware] [] \n", - "134 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", - "135 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", - "136 LOVE ... None [ObservatorySoftwareTools] [LOVE] [] \n", - "137 LOVE ... None None None None \n", - "\n", - " date_end components primary_software_components \\\n", - "0 2024-08-15T12:44:06.456000 None None \n", - "1 2023-01-19T22:50:03.167000 None None \n", - "2 2024-08-16T14:49:32.376667 None None \n", - "3 2023-07-19T15:24:01.754000 None None \n", - "4 2024-08-15T12:44:06.456000 None None \n", - ".. ... ... ... \n", - "133 2022-11-30T02:17:35.179000 None None \n", - "134 2024-08-16T15:03:02.869590 None None \n", - "135 2023-05-09T17:25:33.463000 None None \n", - "136 2024-08-15T12:54:06.456000 None None \n", - "137 2024-08-23T18:15:55.678000 None [None] \n", - "\n", - " primary_hardware_components category time_lost_type \n", - "0 None None None \n", - "1 None None None \n", - "2 None None None \n", - "3 None None None \n", - "4 None None None \n", - ".. ... ... ... \n", - "133 None None None \n", - "134 None None None \n", - "135 None None None \n", - "136 None None None \n", - "137 [None] None fault \n", - "\n", - "[138 rows x 24 columns]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.DataFrame(recs)\n", "df" @@ -1146,21 +256,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "18", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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6lOf0q5du2LW6evr06pVq1RVVaXS0lKtWLFCbW1tMes0NTVp+fLlKi4uVnV1te68804NDQ1l86VgDJhtTO0lpiGSKQAArsj5YLp582atWrVK27Zt08aNGzU4OKglS5aop6fHWueOO+7Q008/rSeeeEKbN29Wc3OzPv3pT1v3B4NBLV++XAMDA9qyZYseffRRPfLII7rnnnvG4iUhi8wxS/Po/AQAgOvyxnoH3Pbcc8/FXH/kkUdUXV2tHTt26IorrlBHR4d+9KMfaf369frYxz4mSXr44Yd17rnnatu2bbrsssv0m9/8Ru+++65eeOEF1dTU6MILL9TXv/513XXXXfra174mv98/Fi8NWWC2J/V6PfJ6wtX4QYIpAACuyPkS03gdHR2SpMrKSknSjh07NDg4qMWLF1vrzJkzRzNmzNDWrVslSVu3btW8efNUU1NjrbN06VJ1dnbqnXfeSfo8/f396uzsjFlw+jFDqNfjkdcTLjUllwIA4I4JFUxDoZC+9KUvadGiRTr//PMlSa2trfL7/aqoqIhZt6amRq2trdY69lBq3m/el8y6detUXl5uLfX19aP8apANZgj1eTzyRqrz6ZUPAIA7JlQwXbVqld5++209/vjjrj/X2rVr1dHRYS0HDx50/Tkx+swQ6vFIZjNT2pgCAOCOnG9jalq9erU2bNigl19+WdOnT7dur62t1cDAgNrb22NKTdva2lRbW2ut88orr8Rsz+y1b64Tr6CgQAUFBaP8KpBtZgj1eT3yRaryQ6Gx3CMAAHJXzpeYGoah1atX68knn9SLL76oWbNmxdy/YMEC5efna9OmTdZtu3btUlNTkxobGyVJjY2N2rlzpw4fPmyts3HjRgUCAc2dOzc7LwRjIpSkjSklpgAAuCPnS0xXrVql9evX65e//KXKysqsNqHl5eUqKipSeXm5brrpJq1Zs0aVlZUKBAK6/fbb1djYqMsuu0yStGTJEs2dO1ef//zndf/996u1tVV33323Vq1aRalojjNLR71eWxtTgikAAK7I+WD64IMPSpKuvPLKmNsffvhhfeELX5Akfec735HX69WKFSvU39+vpUuX6oc//KG1rs/n04YNG3TbbbepsbFRJSUlWrlype67775svQyMkWiv/GgbU4NgCgCAK3I+mGYSIgoLC/XAAw/ogQcecFynoaFBzzzzzGjuGk4D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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "x = [r['date_added'] for r in recs]\n", "y = [r['time_lost'] for r in recs]\n", @@ -1187,53 +286,10 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "cb254bc8-b764-417f-ae51-bd816c6b7ddf", + "execution_count": null, + "id": "21", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "Message text from log:\n", - "> Testing ampersan &Test&\r\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "{'id': 'ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5',\n", - " 'site_id': 'tucson',\n", - " 'message_text': 'Testing ampersan &Test&\\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-08-23T18:15:55.678000',\n", - " 'user_id': 'saranda@tucson-teststand.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-08-23T18:16:32.716742',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-08-23T18:15:55.678000',\n", - " 'components': None,\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'}" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rec = recs[-1]\n", "\n", @@ -1246,7 +302,7 @@ }, { "cell_type": "markdown", - "id": "23", + "id": "22", "metadata": {}, "source": [ "\n", @@ -1255,89 +311,10 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "111abb6b-5e2b-4c44-b780-7844bd7f63fb", + "execution_count": null, + "id": "23", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 0\n", - "SHELL /bin/bash\n", - "SESSION_MANAGER local/chimp20:@/tmp/.ICE-unix/6143,unix/chimp2...\n", - "QT_ACCESSIBILITY 1\n", - "XDG_CONFIG_DIRS /etc/xdg/xdg-mate:/etc/xdg\n", - "XDG_SESSION_PATH /org/freedesktop/DisplayManager/Session0\n", - "GTK_IM_MODULE ibus\n", - "LANGUAGE en_US\n", - "TERMCAP \n", - "SSH_AUTH_SOCK /run/user/1000/keyring/ssh\n", - "INSIDE_EMACS 29.4,comint\n", - "XMODIFIERS @im=ibus\n", - "DESKTOP_SESSION mate\n", - "EDITOR /usr/bin/emacsclient\n", - "GTK_MODULES appmenu-gtk-module:gail:atk-bridge:canberra-gt...\n", - "XDG_SEAT seat0\n", - "MATE_DESKTOP_SESSION_ID this-is-deprecated\n", - "SNAP_EUID 1000\n", - "PWD /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "GSETTINGS_SCHEMA_DIR /home/pothiers/snap/emacs/common/.local/share/...\n", - "XDG_SESSION_DESKTOP mate\n", - "LOGNAME pothiers\n", - "QT_QPA_PLATFORMTHEME gtk2\n", - "XDG_SESSION_TYPE x11\n", - "GPG_AGENT_INFO /run/user/1000/gnupg/S.gpg-agent:0:1\n", - "XAUTHORITY /home/pothiers/.Xauthority\n", - "XDG_GREETER_DATA_DIR /var/lib/lightdm-data/pothiers\n", - "GDM_LANG en_US\n", - "HOME /home/pothiers\n", - "LANG en_US.UTF-8\n", - "LS_COLORS \n", - "XDG_CURRENT_DESKTOP MATE\n", - "COLUMNS 80\n", - "EMACS_SNAP_DIR /snap/emacs/2504\n", - "VIRTUAL_ENV /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "XDG_SEAT_PATH /org/freedesktop/DisplayManager/Seat0\n", - "SNAP_UID 1000\n", - "CLUTTER_IM_MODULE ibus\n", - "LESSCLOSE /usr/bin/lesspipe %s %s\n", - "XDG_SESSION_CLASS user\n", - "TERM xterm-color\n", - "GTK_OVERLAY_SCROLLING 0\n", - "LESSOPEN | /usr/bin/lesspipe %s\n", - "USER pothiers\n", - "GIT_PAGER cat\n", - "DISPLAY :0\n", - "SHLVL 1\n", - "QT_IM_MODULE ibus\n", - "XDG_VTNR 7\n", - "UBUNTU_MENUPROXY 1\n", - "XDG_SESSION_ID c2\n", - "VIRTUAL_ENV_PROMPT (venv) \n", - "XDG_RUNTIME_DIR /run/user/1000\n", - "COMPIZ_CONFIG_PROFILE mate\n", - "PS1 (venv) ${debian_chroot:+($debian_chroot)}\\u@\\h...\n", - "XDG_DATA_DIRS /snap/emacs/2504/usr/share:/usr/share/mate:/us...\n", - "PATH /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "GDMSESSION mate\n", - "DBUS_SESSION_BUS_ADDRESS unix:path=/run/user/1000/bus\n", - "QT_FONT_DPI 96\n", - "QT_SCALE_FACTOR 1\n", - "GIO_LAUNCHED_DESKTOP_FILE_PID 19241\n", - "OLDPWD /home/pothiers/sandbox/ts_logging_and_reporting\n", - "_ /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "JPY_SESSION_NAME /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "JPY_PARENT_PID 431334\n", - "PYDEVD_USE_FRAME_EVAL NO\n", - "CLICOLOR 1\n", - "FORCE_COLOR 1\n", - "CLICOLOR_FORCE 1\n", - "PAGER cat\n", - "MPLBACKEND module://matplotlib_inline.backend_inline\n" - ] - } - ], + "outputs": [], "source": [ "#EXTERNAL_INSTANCE_URL\n", "ed = dict(os.environ.items())\n", @@ -1348,7 +325,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e5ef7955-76f8-4c7f-9b3a-9f436ef1f7f7", + "id": "24", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks_tsqr/exposurelog.ipynb b/notebooks_tsqr/exposurelog.ipynb index 5a237c9..b8ff30b 100644 --- a/notebooks_tsqr/exposurelog.ipynb +++ b/notebooks_tsqr/exposurelog.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0", "metadata": {}, "outputs": [], @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "2", "metadata": {}, "outputs": [], @@ -41,21 +41,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://tucson-teststand.lsst.codes/exposurelog'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "limit = int(record_limit)\n", "\n", @@ -81,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "5", "metadata": {}, "outputs": [], @@ -118,19 +107,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attempt to get logs from url='https://tucson-teststand.lsst.codes/exposurelog/messages?is_human=either&is_valid=either&limit=999'\n", - "Retrieved 21 records, each with numf=18 fields.\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", " print(f'Attempt to get logs from {url=}')\n", @@ -170,138 +150,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "10", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Field Name
0seq_num
1urls
2site_id
3exposure_flag
4date_invalidated
5user_id
6is_human
7message_text
8day_obs
9instrument
10date_added
11is_valid
12parent_id
13obs_id
14level
15user_agent
16id
17tags
\n", - "
" - ], - "text/plain": [ - " Field Name\n", - "0 seq_num\n", - "1 urls\n", - "2 site_id\n", - "3 exposure_flag\n", - "4 date_invalidated\n", - "5 user_id\n", - "6 is_human\n", - "7 message_text\n", - "8 day_obs\n", - "9 instrument\n", - "10 date_added\n", - "11 is_valid\n", - "12 parent_id\n", - "13 obs_id\n", - "14 level\n", - "15 user_agent\n", - "16 id\n", - "17 tags" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.DataFrame(flds, columns=['Field Name'])" ] @@ -317,99 +169,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "12", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
012
exposure_flagnonequestionablejunk
site_idtucsonNoneNone
is_humanTrueNoneNone
instrumentLATISSLSSTComCamNone
level10NoneNone
user_agentLOVENoneNone
is_validFalseTrueNone
\n", - "
" - ], - "text/plain": [ - " 0 1 2\n", - "exposure_flag none questionable junk\n", - "site_id tucson None None\n", - "is_human True None None\n", - "instrument LATISS LSSTComCam None\n", - "level 10 None None\n", - "user_agent LOVE None None\n", - "is_valid False True None" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.DataFrame.from_dict(facets, orient='index')" ] @@ -425,305 +188,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "14", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table available as CSV file: \n" - ] - }, - { - "data": { - "text/html": [ - "tl.csv
" - ], - "text/plain": [ - "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
obs_iduser_iduser_agentis_humanis_validexposure_flag
0AT_O_20221129_000001admin@love1.tu.lsst.orgLOVETrueTruejunk
1AT_C_20230613_000001admin@love1.tu.lsst.orgLOVETrueFalsenone
2AT_O_20230906_000003tribeiro@tucson-teststand.lsst.codesLOVETrueTruequestionable
3AT_C_20230613_000001admin@love1.tu.lsst.orgLOVETrueFalsenone
4AT_O_20230906_000003admin@localhostLOVETrueTruenone
5AT_O_20221129_000001admin@love1.tu.lsst.orgLOVETrueTruequestionable
6AT_O_20221115_000020admin@love1.tu.lsst.orgLOVETrueTruequestionable
7AT_O_20221115_000023admin@love1.tu.lsst.orgLOVETrueTruenone
8AT_O_20230830_000003admin@localhostLOVETrueFalsenone
9AT_O_20230830_000003admin@localhostLOVETrueFalsenone
10AT_O_20240822_000010saranda@tucson-teststand.lsst.codesLOVETrueTruenone
11AT_O_20230830_000003admin@localhostLOVETrueTruenone
12AT_O_20220929_000031admin@localhostLOVETrueTruejunk
13AT_O_20220929_000031admin@localhostLOVETrueTruenone
14AT_O_20230207_000003admin@love1.tu.lsst.orgLOVETrueTruenone
15AT_O_20221115_000020admin@love1.tu.lsst.orgLOVETrueTruequestionable
16AT_C_20230613_000001admin@love1.tu.lsst.orgLOVETrueTruenone
17AT_O_20230830_000003admin@localhostLOVETrueTruenone
18AT_O_20221115_000022admin@love1.tu.lsst.orgLOVETrueTruequestionable
19AT_O_20221129_000001admin@love1.tu.lsst.orgLOVETrueTruequestionable
20AT_O_20221115_000019admin@love1.tu.lsst.orgLOVETrueTruequestionable
\n", - "
" - ], - "text/plain": [ - " obs_id user_id user_agent \\\n", - "0 AT_O_20221129_000001 admin@love1.tu.lsst.org LOVE \n", - "1 AT_C_20230613_000001 admin@love1.tu.lsst.org LOVE \n", - "2 AT_O_20230906_000003 tribeiro@tucson-teststand.lsst.codes LOVE \n", - "3 AT_C_20230613_000001 admin@love1.tu.lsst.org LOVE \n", - "4 AT_O_20230906_000003 admin@localhost LOVE \n", - "5 AT_O_20221129_000001 admin@love1.tu.lsst.org LOVE \n", - "6 AT_O_20221115_000020 admin@love1.tu.lsst.org LOVE \n", - "7 AT_O_20221115_000023 admin@love1.tu.lsst.org LOVE \n", - "8 AT_O_20230830_000003 admin@localhost LOVE \n", - "9 AT_O_20230830_000003 admin@localhost LOVE \n", - "10 AT_O_20240822_000010 saranda@tucson-teststand.lsst.codes LOVE \n", - "11 AT_O_20230830_000003 admin@localhost LOVE \n", - "12 AT_O_20220929_000031 admin@localhost LOVE \n", - "13 AT_O_20220929_000031 admin@localhost LOVE \n", - "14 AT_O_20230207_000003 admin@love1.tu.lsst.org LOVE \n", - "15 AT_O_20221115_000020 admin@love1.tu.lsst.org LOVE \n", - "16 AT_C_20230613_000001 admin@love1.tu.lsst.org LOVE \n", - "17 AT_O_20230830_000003 admin@localhost LOVE \n", - "18 AT_O_20221115_000022 admin@love1.tu.lsst.org LOVE \n", - "19 AT_O_20221129_000001 admin@love1.tu.lsst.org LOVE \n", - "20 AT_O_20221115_000019 admin@love1.tu.lsst.org LOVE \n", - "\n", - " is_human is_valid exposure_flag \n", - "0 True True junk \n", - "1 True False none \n", - "2 True True questionable \n", - "3 True False none \n", - "4 True True none \n", - "5 True True questionable \n", - "6 True True questionable \n", - "7 True True none \n", - "8 True False none \n", - "9 True False none \n", - "10 True True none \n", - "11 True True none \n", - "12 True True junk \n", - "13 True True none \n", - "14 True True none \n", - "15 True True questionable \n", - "16 True True none \n", - "17 True True none \n", - "18 True True questionable \n", - "19 True True questionable \n", - "20 True True questionable " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cols = ['obs_id', 'user_id', 'user_agent','is_human','is_valid','exposure_flag']\n", "df = pd.DataFrame(recs)[cols]\n", @@ -739,688 +207,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "15", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idsite_idobs_idinstrumentday_obsseq_nummessage_textleveltagsurlsuser_iduser_agentis_humanis_validexposure_flagdate_addeddate_invalidatedparent_id
00076ce05-752f-46df-b8a5-90ffd51d612etucsonAT_O_20221129_000001LSSTComCam202211291this was a test image for LOVE LVV November te...10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruejunk2022-11-30T02:13:46.847038NoneNone
11e61fbbe-cb87-45f2-88be-cb6647b0cd43tucsonAT_C_20230613_000001LATISS202306131Exposure log creation test10[undefined][]admin@love1.tu.lsst.orgLOVETrueFalsenone2023-07-18T22:13:41.2285102023-07-18T22:15:14.006037None
221fc4a19-37af-42c1-b475-c6cd26df21b5tucsonAT_O_20230906_000003LATISS202309063Testing exposure log in OLE!\\r\\n10[undefined][]tribeiro@tucson-teststand.lsst.codesLOVETrueTruequestionable2024-01-20T21:44:20.605672NoneNone
324ce7289-36ae-49f8-ac17-044296a6e7d7tucsonAT_C_20230613_000001LATISS202306131Exposure log test10[undefined][]admin@love1.tu.lsst.orgLOVETrueFalsenone2023-07-18T22:16:40.4409622023-07-18T22:53:40.503894None
428783f56-b5cb-4f1f-a66e-993c6d8d384etucsonAT_O_20230906_000003LATISS202309063Add 1 log from upper panel with 1 tag and 1 file10[ticketed_issue][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T15:25:00.394949NoneNone
537b1ecb2-5f15-4bdb-8fa9-d7fdae7a1658tucsonAT_O_20221129_000001LATISS202211291This is another test message10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-30T02:53:02.671106NoneNone
6490b3fc8-3775-41c1-b7a6-19b881e6d333tucsonAT_O_20221115_000020LATISS2022111520weird detector issue10[camera_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-15T23:35:31.497612NoneNone
7575d30c4-0b75-4ead-bf3f-6ed58f554468tucsonAT_O_20221115_000023LATISS2022111723LOVE test10[bright_artifact, background_issue][]admin@love1.tu.lsst.orgLOVETrueTruenone2022-11-17T20:53:55.058907NoneNone
858e6cdb9-5945-4175-aa84-f64622ddb5f4tucsonAT_O_20230830_000003LATISS202308303test log\\r\\n\\r\\nUpdate 1: add 4th file10[undefined][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueFalsenone2023-09-06T22:20:59.0617592023-09-07T14:51:04.96040558f06d12-da95-4505-9729-5f388cc60703
958f06d12-da95-4505-9729-5f388cc60703tucsonAT_O_20230830_000003LATISS202308303test log10[undefined][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueFalsenone2023-09-06T16:27:02.9417202023-09-06T22:20:59.061759None
107a550d27-16d4-48a0-bcab-8328b1a7adabtucsonAT_O_20240822_000010LATISS2024082210Testing ampersan &amp;Test&amp;\\r\\n10[undefined][]saranda@tucson-teststand.lsst.codesLOVETrueTruenone2024-08-23T18:23:24.840967NoneNone
117e53f5b9-2173-453f-ba77-552c0c907fc7tucsonAT_O_20230830_000003LATISS202308303test log\\r\\n\\r\\nUpdate 1: add 4th file\\r\\nUpda...10[background_issue, bad_psf_movement, bright_ar...[https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T14:51:04.960405None58e6cdb9-5945-4175-aa84-f64622ddb5f4
128f196dbd-4200-469d-9498-e6adf3cff21dtucsonAT_O_20220929_000031LSSTComCam2022100631LOVE testing #210[undefined][]admin@localhostLOVETrueTruejunk2022-10-06T18:51:16.905173NoneNone
13a578755a-662b-45b6-b391-a9661e084800tucsonAT_O_20220929_000031LSSTComCam2022100631LOVE testing #110[undefined][]admin@localhostLOVETrueTruenone2022-10-06T18:50:25.039355NoneNone
14ac5ccfe2-a0d7-433e-b8f2-4db5ae182a4etucsonAT_O_20230207_000003LATISS202302133LOVE OLE test10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruenone2023-02-13T18:04:45.987029NoneNone
15ae4210d1-9f5a-48fb-945b-2df229eeca33tucsonAT_O_20221115_000020LATISS2022111520investigating banding issue10[background_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-16T04:57:30.898604NoneNone
16b48dbd8a-87f8-4a57-84a8-20990b068e29tucsonAT_C_20230613_000001LATISS202306131Exposure log test - edit 110[undefined][]admin@love1.tu.lsst.orgLOVETrueTruenone2023-07-18T22:53:40.503894None24ce7289-36ae-49f8-ac17-044296a6e7d7
17b7de0ab1-a289-4091-a7b5-8fcde3d2b448tucsonAT_O_20230830_000003LATISS202308303Adding 1 log with 1 tag and 1 file10[clouds][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T15:24:12.233843NoneNone
18bbdd0553-f917-43a9-a952-a95df472a44dtucsonAT_O_20221115_000022LATISS2022111522weird detector issue10[camera_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-15T23:35:31.172991NoneNone
19d37d0f1e-b989-4c5e-a795-16c44c6c00e2tucsonAT_O_20221129_000001LATISS202211291adding new message10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-30T02:15:01.922201NoneNone
20f9a4b932-18e9-47db-9b7d-a2fbe3c15e70tucsonAT_O_20221115_000019LATISS2022111519investigating banding issue10[background_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-16T04:57:30.954849NoneNone
\n", - "
" - ], - "text/plain": [ - " id site_id obs_id \\\n", - "0 0076ce05-752f-46df-b8a5-90ffd51d612e tucson AT_O_20221129_000001 \n", - "1 1e61fbbe-cb87-45f2-88be-cb6647b0cd43 tucson AT_C_20230613_000001 \n", - "2 21fc4a19-37af-42c1-b475-c6cd26df21b5 tucson AT_O_20230906_000003 \n", - "3 24ce7289-36ae-49f8-ac17-044296a6e7d7 tucson AT_C_20230613_000001 \n", - "4 28783f56-b5cb-4f1f-a66e-993c6d8d384e tucson AT_O_20230906_000003 \n", - "5 37b1ecb2-5f15-4bdb-8fa9-d7fdae7a1658 tucson AT_O_20221129_000001 \n", - "6 490b3fc8-3775-41c1-b7a6-19b881e6d333 tucson AT_O_20221115_000020 \n", - "7 575d30c4-0b75-4ead-bf3f-6ed58f554468 tucson AT_O_20221115_000023 \n", - "8 58e6cdb9-5945-4175-aa84-f64622ddb5f4 tucson AT_O_20230830_000003 \n", - "9 58f06d12-da95-4505-9729-5f388cc60703 tucson AT_O_20230830_000003 \n", - "10 7a550d27-16d4-48a0-bcab-8328b1a7adab tucson AT_O_20240822_000010 \n", - "11 7e53f5b9-2173-453f-ba77-552c0c907fc7 tucson AT_O_20230830_000003 \n", - "12 8f196dbd-4200-469d-9498-e6adf3cff21d tucson AT_O_20220929_000031 \n", - "13 a578755a-662b-45b6-b391-a9661e084800 tucson AT_O_20220929_000031 \n", - "14 ac5ccfe2-a0d7-433e-b8f2-4db5ae182a4e tucson AT_O_20230207_000003 \n", - "15 ae4210d1-9f5a-48fb-945b-2df229eeca33 tucson AT_O_20221115_000020 \n", - "16 b48dbd8a-87f8-4a57-84a8-20990b068e29 tucson AT_C_20230613_000001 \n", - "17 b7de0ab1-a289-4091-a7b5-8fcde3d2b448 tucson AT_O_20230830_000003 \n", - "18 bbdd0553-f917-43a9-a952-a95df472a44d tucson AT_O_20221115_000022 \n", - "19 d37d0f1e-b989-4c5e-a795-16c44c6c00e2 tucson AT_O_20221129_000001 \n", - "20 f9a4b932-18e9-47db-9b7d-a2fbe3c15e70 tucson AT_O_20221115_000019 \n", - "\n", - " instrument day_obs seq_num \\\n", - "0 LSSTComCam 20221129 1 \n", - "1 LATISS 20230613 1 \n", - "2 LATISS 20230906 3 \n", - "3 LATISS 20230613 1 \n", - "4 LATISS 20230906 3 \n", - "5 LATISS 20221129 1 \n", - "6 LATISS 20221115 20 \n", - "7 LATISS 20221117 23 \n", - "8 LATISS 20230830 3 \n", - "9 LATISS 20230830 3 \n", - "10 LATISS 20240822 10 \n", - "11 LATISS 20230830 3 \n", - "12 LSSTComCam 20221006 31 \n", - "13 LSSTComCam 20221006 31 \n", - "14 LATISS 20230213 3 \n", - "15 LATISS 20221115 20 \n", - "16 LATISS 20230613 1 \n", - "17 LATISS 20230830 3 \n", - "18 LATISS 20221115 22 \n", - "19 LATISS 20221129 1 \n", - "20 LATISS 20221115 19 \n", - "\n", - " message_text level \\\n", - "0 this was a test image for LOVE LVV November te... 10 \n", - "1 Exposure log creation test 10 \n", - "2 Testing exposure log in OLE!\\r\\n 10 \n", - "3 Exposure log test 10 \n", - "4 Add 1 log from upper panel with 1 tag and 1 file 10 \n", - "5 This is another test message 10 \n", - "6 weird detector issue 10 \n", - "7 LOVE test 10 \n", - "8 test log\\r\\n\\r\\nUpdate 1: add 4th file 10 \n", - "9 test log 10 \n", - "10 Testing ampersan &Test&\\r\\n 10 \n", - "11 test log\\r\\n\\r\\nUpdate 1: add 4th file\\r\\nUpda... 10 \n", - "12 LOVE testing #2 10 \n", - "13 LOVE testing #1 10 \n", - "14 LOVE OLE test 10 \n", - "15 investigating banding issue 10 \n", - "16 Exposure log test - edit 1 10 \n", - "17 Adding 1 log with 1 tag and 1 file 10 \n", - "18 weird detector issue 10 \n", - "19 adding new message 10 \n", - "20 investigating banding issue 10 \n", - "\n", - " tags \\\n", - "0 [undefined] \n", - "1 [undefined] \n", - "2 [undefined] \n", - "3 [undefined] \n", - "4 [ticketed_issue] \n", - "5 [undefined] \n", - "6 [camera_issue] \n", - "7 [bright_artifact, background_issue] \n", - "8 [undefined] \n", - "9 [undefined] \n", - "10 [undefined] \n", - "11 [background_issue, bad_psf_movement, bright_ar... \n", - "12 [undefined] \n", - "13 [undefined] \n", - "14 [undefined] \n", - "15 [background_issue] \n", - "16 [undefined] \n", - "17 [clouds] \n", - "18 [camera_issue] \n", - "19 [undefined] \n", - "20 [background_issue] \n", - "\n", - " urls \\\n", - "0 [] \n", - "1 [] \n", - "2 [] \n", - "3 [] \n", - "4 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "5 [] \n", - "6 [] \n", - "7 [] \n", - "8 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "9 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "10 [] \n", - "11 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "12 [] \n", - "13 [] \n", - "14 [] \n", - "15 [] \n", - "16 [] \n", - "17 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "18 [] \n", - "19 [] \n", - "20 [] \n", - "\n", - " user_id user_agent is_human is_valid \\\n", - "0 admin@love1.tu.lsst.org LOVE True True \n", - "1 admin@love1.tu.lsst.org LOVE True False \n", - "2 tribeiro@tucson-teststand.lsst.codes LOVE True True \n", - "3 admin@love1.tu.lsst.org LOVE True False \n", - "4 admin@localhost LOVE True True \n", - "5 admin@love1.tu.lsst.org LOVE True True \n", - "6 admin@love1.tu.lsst.org LOVE True True \n", - "7 admin@love1.tu.lsst.org LOVE True True \n", - "8 admin@localhost LOVE True False \n", - "9 admin@localhost LOVE True False \n", - "10 saranda@tucson-teststand.lsst.codes LOVE True True \n", - "11 admin@localhost LOVE True True \n", - "12 admin@localhost LOVE True True \n", - "13 admin@localhost LOVE True True \n", - "14 admin@love1.tu.lsst.org LOVE True True \n", - "15 admin@love1.tu.lsst.org LOVE True True \n", - "16 admin@love1.tu.lsst.org LOVE True True \n", - "17 admin@localhost LOVE True True \n", - "18 admin@love1.tu.lsst.org LOVE True True \n", - "19 admin@love1.tu.lsst.org LOVE True True \n", - "20 admin@love1.tu.lsst.org LOVE True True \n", - "\n", - " exposure_flag date_added date_invalidated \\\n", - "0 junk 2022-11-30T02:13:46.847038 None \n", - "1 none 2023-07-18T22:13:41.228510 2023-07-18T22:15:14.006037 \n", - "2 questionable 2024-01-20T21:44:20.605672 None \n", - "3 none 2023-07-18T22:16:40.440962 2023-07-18T22:53:40.503894 \n", - "4 none 2023-09-07T15:25:00.394949 None \n", - "5 questionable 2022-11-30T02:53:02.671106 None \n", - "6 questionable 2022-11-15T23:35:31.497612 None \n", - "7 none 2022-11-17T20:53:55.058907 None \n", - "8 none 2023-09-06T22:20:59.061759 2023-09-07T14:51:04.960405 \n", - "9 none 2023-09-06T16:27:02.941720 2023-09-06T22:20:59.061759 \n", - "10 none 2024-08-23T18:23:24.840967 None \n", - "11 none 2023-09-07T14:51:04.960405 None \n", - "12 junk 2022-10-06T18:51:16.905173 None \n", - "13 none 2022-10-06T18:50:25.039355 None \n", - "14 none 2023-02-13T18:04:45.987029 None \n", - "15 questionable 2022-11-16T04:57:30.898604 None \n", - "16 none 2023-07-18T22:53:40.503894 None \n", - "17 none 2023-09-07T15:24:12.233843 None \n", - "18 questionable 2022-11-15T23:35:31.172991 None \n", - "19 questionable 2022-11-30T02:15:01.922201 None \n", - "20 questionable 2022-11-16T04:57:30.954849 None \n", - "\n", - " parent_id \n", - "0 None \n", - "1 None \n", - "2 None \n", - "3 None \n", - "4 None \n", - "5 None \n", - "6 None \n", - "7 None \n", - "8 58f06d12-da95-4505-9729-5f388cc60703 \n", - "9 None \n", - "10 None \n", - "11 58e6cdb9-5945-4175-aa84-f64622ddb5f4 \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 24ce7289-36ae-49f8-ac17-044296a6e7d7 \n", - "17 None \n", - "18 None \n", - "19 None \n", - "20 None " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.DataFrame(recs)\n", "df" @@ -1428,688 +218,10 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "0bfce99d-bde7-4dae-b099-f5666908fa32", + "execution_count": null, + "id": "16", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idsite_idobs_idinstrumentday_obsseq_nummessage_textleveltagsurlsuser_iduser_agentis_humanis_validexposure_flagdate_addeddate_invalidatedparent_id
00076ce05-752f-46df-b8a5-90ffd51d612etucsonAT_O_20221129_000001LSSTComCam202211291this was a test image for LOVE LVV November te...10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruejunk2022-11-30T02:13:46.847038NoneNone
11e61fbbe-cb87-45f2-88be-cb6647b0cd43tucsonAT_C_20230613_000001LATISS202306131Exposure log creation test10[undefined][]admin@love1.tu.lsst.orgLOVETrueFalsenone2023-07-18T22:13:41.2285102023-07-18T22:15:14.006037None
221fc4a19-37af-42c1-b475-c6cd26df21b5tucsonAT_O_20230906_000003LATISS202309063Testing exposure log in OLE!\\r\\n10[undefined][]tribeiro@tucson-teststand.lsst.codesLOVETrueTruequestionable2024-01-20T21:44:20.605672NoneNone
324ce7289-36ae-49f8-ac17-044296a6e7d7tucsonAT_C_20230613_000001LATISS202306131Exposure log test10[undefined][]admin@love1.tu.lsst.orgLOVETrueFalsenone2023-07-18T22:16:40.4409622023-07-18T22:53:40.503894None
428783f56-b5cb-4f1f-a66e-993c6d8d384etucsonAT_O_20230906_000003LATISS202309063Add 1 log from upper panel with 1 tag and 1 file10[ticketed_issue][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T15:25:00.394949NoneNone
537b1ecb2-5f15-4bdb-8fa9-d7fdae7a1658tucsonAT_O_20221129_000001LATISS202211291This is another test message10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-30T02:53:02.671106NoneNone
6490b3fc8-3775-41c1-b7a6-19b881e6d333tucsonAT_O_20221115_000020LATISS2022111520weird detector issue10[camera_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-15T23:35:31.497612NoneNone
7575d30c4-0b75-4ead-bf3f-6ed58f554468tucsonAT_O_20221115_000023LATISS2022111723LOVE test10[bright_artifact, background_issue][]admin@love1.tu.lsst.orgLOVETrueTruenone2022-11-17T20:53:55.058907NoneNone
858e6cdb9-5945-4175-aa84-f64622ddb5f4tucsonAT_O_20230830_000003LATISS202308303test log\\r\\n\\r\\nUpdate 1: add 4th file10[undefined][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueFalsenone2023-09-06T22:20:59.0617592023-09-07T14:51:04.96040558f06d12-da95-4505-9729-5f388cc60703
958f06d12-da95-4505-9729-5f388cc60703tucsonAT_O_20230830_000003LATISS202308303test log10[undefined][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueFalsenone2023-09-06T16:27:02.9417202023-09-06T22:20:59.061759None
107a550d27-16d4-48a0-bcab-8328b1a7adabtucsonAT_O_20240822_000010LATISS2024082210Testing ampersan &amp;Test&amp;\\r\\n10[undefined][]saranda@tucson-teststand.lsst.codesLOVETrueTruenone2024-08-23T18:23:24.840967NoneNone
117e53f5b9-2173-453f-ba77-552c0c907fc7tucsonAT_O_20230830_000003LATISS202308303test log\\r\\n\\r\\nUpdate 1: add 4th file\\r\\nUpda...10[background_issue, bad_psf_movement, bright_ar...[https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T14:51:04.960405None58e6cdb9-5945-4175-aa84-f64622ddb5f4
128f196dbd-4200-469d-9498-e6adf3cff21dtucsonAT_O_20220929_000031LSSTComCam2022100631LOVE testing #210[undefined][]admin@localhostLOVETrueTruejunk2022-10-06T18:51:16.905173NoneNone
13a578755a-662b-45b6-b391-a9661e084800tucsonAT_O_20220929_000031LSSTComCam2022100631LOVE testing #110[undefined][]admin@localhostLOVETrueTruenone2022-10-06T18:50:25.039355NoneNone
14ac5ccfe2-a0d7-433e-b8f2-4db5ae182a4etucsonAT_O_20230207_000003LATISS202302133LOVE OLE test10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruenone2023-02-13T18:04:45.987029NoneNone
15ae4210d1-9f5a-48fb-945b-2df229eeca33tucsonAT_O_20221115_000020LATISS2022111520investigating banding issue10[background_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-16T04:57:30.898604NoneNone
16b48dbd8a-87f8-4a57-84a8-20990b068e29tucsonAT_C_20230613_000001LATISS202306131Exposure log test - edit 110[undefined][]admin@love1.tu.lsst.orgLOVETrueTruenone2023-07-18T22:53:40.503894None24ce7289-36ae-49f8-ac17-044296a6e7d7
17b7de0ab1-a289-4091-a7b5-8fcde3d2b448tucsonAT_O_20230830_000003LATISS202308303Adding 1 log with 1 tag and 1 file10[clouds][https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV...admin@localhostLOVETrueTruenone2023-09-07T15:24:12.233843NoneNone
18bbdd0553-f917-43a9-a952-a95df472a44dtucsonAT_O_20221115_000022LATISS2022111522weird detector issue10[camera_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-15T23:35:31.172991NoneNone
19d37d0f1e-b989-4c5e-a795-16c44c6c00e2tucsonAT_O_20221129_000001LATISS202211291adding new message10[undefined][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-30T02:15:01.922201NoneNone
20f9a4b932-18e9-47db-9b7d-a2fbe3c15e70tucsonAT_O_20221115_000019LATISS2022111519investigating banding issue10[background_issue][]admin@love1.tu.lsst.orgLOVETrueTruequestionable2022-11-16T04:57:30.954849NoneNone
\n", - "
" - ], - "text/plain": [ - " id site_id obs_id \\\n", - "0 0076ce05-752f-46df-b8a5-90ffd51d612e tucson AT_O_20221129_000001 \n", - "1 1e61fbbe-cb87-45f2-88be-cb6647b0cd43 tucson AT_C_20230613_000001 \n", - "2 21fc4a19-37af-42c1-b475-c6cd26df21b5 tucson AT_O_20230906_000003 \n", - "3 24ce7289-36ae-49f8-ac17-044296a6e7d7 tucson AT_C_20230613_000001 \n", - "4 28783f56-b5cb-4f1f-a66e-993c6d8d384e tucson AT_O_20230906_000003 \n", - "5 37b1ecb2-5f15-4bdb-8fa9-d7fdae7a1658 tucson AT_O_20221129_000001 \n", - "6 490b3fc8-3775-41c1-b7a6-19b881e6d333 tucson AT_O_20221115_000020 \n", - "7 575d30c4-0b75-4ead-bf3f-6ed58f554468 tucson AT_O_20221115_000023 \n", - "8 58e6cdb9-5945-4175-aa84-f64622ddb5f4 tucson AT_O_20230830_000003 \n", - "9 58f06d12-da95-4505-9729-5f388cc60703 tucson AT_O_20230830_000003 \n", - "10 7a550d27-16d4-48a0-bcab-8328b1a7adab tucson AT_O_20240822_000010 \n", - "11 7e53f5b9-2173-453f-ba77-552c0c907fc7 tucson AT_O_20230830_000003 \n", - "12 8f196dbd-4200-469d-9498-e6adf3cff21d tucson AT_O_20220929_000031 \n", - "13 a578755a-662b-45b6-b391-a9661e084800 tucson AT_O_20220929_000031 \n", - "14 ac5ccfe2-a0d7-433e-b8f2-4db5ae182a4e tucson AT_O_20230207_000003 \n", - "15 ae4210d1-9f5a-48fb-945b-2df229eeca33 tucson AT_O_20221115_000020 \n", - "16 b48dbd8a-87f8-4a57-84a8-20990b068e29 tucson AT_C_20230613_000001 \n", - "17 b7de0ab1-a289-4091-a7b5-8fcde3d2b448 tucson AT_O_20230830_000003 \n", - "18 bbdd0553-f917-43a9-a952-a95df472a44d tucson AT_O_20221115_000022 \n", - "19 d37d0f1e-b989-4c5e-a795-16c44c6c00e2 tucson AT_O_20221129_000001 \n", - "20 f9a4b932-18e9-47db-9b7d-a2fbe3c15e70 tucson AT_O_20221115_000019 \n", - "\n", - " instrument day_obs seq_num \\\n", - "0 LSSTComCam 20221129 1 \n", - "1 LATISS 20230613 1 \n", - "2 LATISS 20230906 3 \n", - "3 LATISS 20230613 1 \n", - "4 LATISS 20230906 3 \n", - "5 LATISS 20221129 1 \n", - "6 LATISS 20221115 20 \n", - "7 LATISS 20221117 23 \n", - "8 LATISS 20230830 3 \n", - "9 LATISS 20230830 3 \n", - "10 LATISS 20240822 10 \n", - "11 LATISS 20230830 3 \n", - "12 LSSTComCam 20221006 31 \n", - "13 LSSTComCam 20221006 31 \n", - "14 LATISS 20230213 3 \n", - "15 LATISS 20221115 20 \n", - "16 LATISS 20230613 1 \n", - "17 LATISS 20230830 3 \n", - "18 LATISS 20221115 22 \n", - "19 LATISS 20221129 1 \n", - "20 LATISS 20221115 19 \n", - "\n", - " message_text level \\\n", - "0 this was a test image for LOVE LVV November te... 10 \n", - "1 Exposure log creation test 10 \n", - "2 Testing exposure log in OLE!\\r\\n 10 \n", - "3 Exposure log test 10 \n", - "4 Add 1 log from upper panel with 1 tag and 1 file 10 \n", - "5 This is another test message 10 \n", - "6 weird detector issue 10 \n", - "7 LOVE test 10 \n", - "8 test log\\r\\n\\r\\nUpdate 1: add 4th file 10 \n", - "9 test log 10 \n", - "10 Testing ampersan &Test&\\r\\n 10 \n", - "11 test log\\r\\n\\r\\nUpdate 1: add 4th file\\r\\nUpda... 10 \n", - "12 LOVE testing #2 10 \n", - "13 LOVE testing #1 10 \n", - "14 LOVE OLE test 10 \n", - "15 investigating banding issue 10 \n", - "16 Exposure log test - edit 1 10 \n", - "17 Adding 1 log with 1 tag and 1 file 10 \n", - "18 weird detector issue 10 \n", - "19 adding new message 10 \n", - "20 investigating banding issue 10 \n", - "\n", - " tags \\\n", - "0 [undefined] \n", - "1 [undefined] \n", - "2 [undefined] \n", - "3 [undefined] \n", - "4 [ticketed_issue] \n", - "5 [undefined] \n", - "6 [camera_issue] \n", - "7 [bright_artifact, background_issue] \n", - "8 [undefined] \n", - "9 [undefined] \n", - "10 [undefined] \n", - "11 [background_issue, bad_psf_movement, bright_ar... \n", - "12 [undefined] \n", - "13 [undefined] \n", - "14 [undefined] \n", - "15 [background_issue] \n", - "16 [undefined] \n", - "17 [clouds] \n", - "18 [camera_issue] \n", - "19 [undefined] \n", - "20 [background_issue] \n", - "\n", - " urls \\\n", - "0 [] \n", - "1 [] \n", - "2 [] \n", - "3 [] \n", - "4 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "5 [] \n", - "6 [] \n", - "7 [] \n", - "8 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "9 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "10 [] \n", - "11 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "12 [] \n", - "13 [] \n", - "14 [] \n", - "15 [] \n", - "16 [] \n", - "17 [https://s3.amazonaws.com/rubinobs-lfa-tuc/LOV... \n", - "18 [] \n", - "19 [] \n", - "20 [] \n", - "\n", - " user_id user_agent is_human is_valid \\\n", - "0 admin@love1.tu.lsst.org LOVE True True \n", - "1 admin@love1.tu.lsst.org LOVE True False \n", - "2 tribeiro@tucson-teststand.lsst.codes LOVE True True \n", - "3 admin@love1.tu.lsst.org LOVE True False \n", - "4 admin@localhost LOVE True True \n", - "5 admin@love1.tu.lsst.org LOVE True True \n", - "6 admin@love1.tu.lsst.org LOVE True True \n", - "7 admin@love1.tu.lsst.org LOVE True True \n", - "8 admin@localhost LOVE True False \n", - "9 admin@localhost LOVE True False \n", - "10 saranda@tucson-teststand.lsst.codes LOVE True True \n", - "11 admin@localhost LOVE True True \n", - "12 admin@localhost LOVE True True \n", - "13 admin@localhost LOVE True True \n", - "14 admin@love1.tu.lsst.org LOVE True True \n", - "15 admin@love1.tu.lsst.org LOVE True True \n", - "16 admin@love1.tu.lsst.org LOVE True True \n", - "17 admin@localhost LOVE True True \n", - "18 admin@love1.tu.lsst.org LOVE True True \n", - "19 admin@love1.tu.lsst.org LOVE True True \n", - "20 admin@love1.tu.lsst.org LOVE True True \n", - "\n", - " exposure_flag date_added date_invalidated \\\n", - "0 junk 2022-11-30T02:13:46.847038 None \n", - "1 none 2023-07-18T22:13:41.228510 2023-07-18T22:15:14.006037 \n", - "2 questionable 2024-01-20T21:44:20.605672 None \n", - "3 none 2023-07-18T22:16:40.440962 2023-07-18T22:53:40.503894 \n", - "4 none 2023-09-07T15:25:00.394949 None \n", - "5 questionable 2022-11-30T02:53:02.671106 None \n", - "6 questionable 2022-11-15T23:35:31.497612 None \n", - "7 none 2022-11-17T20:53:55.058907 None \n", - "8 none 2023-09-06T22:20:59.061759 2023-09-07T14:51:04.960405 \n", - "9 none 2023-09-06T16:27:02.941720 2023-09-06T22:20:59.061759 \n", - "10 none 2024-08-23T18:23:24.840967 None \n", - "11 none 2023-09-07T14:51:04.960405 None \n", - "12 junk 2022-10-06T18:51:16.905173 None \n", - "13 none 2022-10-06T18:50:25.039355 None \n", - "14 none 2023-02-13T18:04:45.987029 None \n", - "15 questionable 2022-11-16T04:57:30.898604 None \n", - "16 none 2023-07-18T22:53:40.503894 None \n", - "17 none 2023-09-07T15:24:12.233843 None \n", - "18 questionable 2022-11-15T23:35:31.172991 None \n", - "19 questionable 2022-11-30T02:15:01.922201 None \n", - "20 questionable 2022-11-16T04:57:30.954849 None \n", - "\n", - " parent_id \n", - "0 None \n", - "1 None \n", - "2 None \n", - "3 None \n", - "4 None \n", - "5 None \n", - "6 None \n", - "7 None \n", - "8 58f06d12-da95-4505-9729-5f388cc60703 \n", - "9 None \n", - "10 None \n", - "11 58e6cdb9-5945-4175-aa84-f64622ddb5f4 \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 24ce7289-36ae-49f8-ac17-044296a6e7d7 \n", - "17 None \n", - "18 None \n", - "19 None \n", - "20 None " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cols = ['obs_id', 'site_id', 'instrument', 'message_text', 'tags','user_id', 'user_agent','is_human','is_valid','exposure_flag']\n", "df = pd.DataFrame(recs, columns=None)\n", @@ -2118,7 +230,7 @@ }, { "cell_type": "markdown", - "id": "16", + "id": "17", "metadata": {}, "source": [ "\n", @@ -2127,30 +239,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "17", + "execution_count": null, + "id": "18", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### IsValid vs DateAdded" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqYAAAGdCAYAAADALrFsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABpdElEQVR4nO3deXhU5b0H8N85Z/ZsEwgkJCTsAkE22Uxxo0YRKYrWuiEiUr0K1AVXXOCqLSitiF6htAhqrdaF2+rt1eJCRYtSuSJYsO6KUiEBKlkIJJOZ+d0/kvfNOckkZJkz55yZ7+d55lEmM2femfPOnO95z7sozMwEAAAAAGAx1eoCAAAAAAAQIZgCAAAAgE0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC24rC5AqohGo7R3717KyMggRVGsLg4AAAC0AzNTdXU15efnk6qiPc9sCKYJsnfvXiosLLS6GAAAANAJe/bsod69e1tdjKSHYJogGRkZRNRQsTMzMy0uDQAAALRHVVUVFRYWyuM4mAvBNEHE5fvMzEwEUwAAAIdBN7zEQGcJAAAAALAFBFMAAAAAsAUEUwAAAACwBQRTAAAAALAFBFMAAAAAsAUEUwAAAACwBQRTAAAAALAFBFMAAAAAsAUEUwAAAACwhZQMpm+//TZNmzaN8vPzSVEUevHFF4/5nE2bNtEJJ5xAXq+XBg4cSE888YTp5QQAAABIJSkZTGtqamjkyJG0cuXKdj3+66+/pqlTp9KkSZNox44ddMMNN9BPf/pTevXVV00uKQAAAEDqcFldACtMmTKFpkyZ0u7Hr169mvr160cPPvggERENHTqUNm/eTA899BBNnjzZrGICAAAApJSUDKYdtWXLFiotLTXcN3nyZLrhhhtafU5dXR3V1dXJf1dVVZlStq8P1tDTf/+GMv1uuu70Qaa8hhleeH8P5WX56ORBPawuSrv9Zec+2rr7e6uLYRseTaVLxhdR35w0q4tiuY/2VtKfPviOIsxWFwUgpRV1C9Dsif2sLgZ0AYJpO5SVlVFubq7hvtzcXKqqqqKjR4+S3+9v8ZylS5fSPffcY3rZDh6uo8c2f019uwccE0y/qzhKt6z/B3VP89C2u8+wujjtciQUpp/9YTuFowgeemVVtfTwxaOtLobl7v3zP+m9r3HSAmC1cX2zEUwdDsHUJAsXLqQFCxbIf1dVVVFhYWHcXyfL7yYiooqj9XHftln2V9USEdG/a0JUH4mSW7N/V+d/Hw5ROMrk1hS6+pT+VhfHcl/sP0yvflRO5Y37MtXtr264OnL+CQXUK8tncWkAUldBMGB1EaCLEEzbIS8vj8rLyw33lZeXU2ZmZszWUiIir9dLXq/X9LKJYFp1tJ6iUSZVVUx/za6q1IXoqqP11D3d/M+pq0SZgwEP3TJ5iMWlsd6mT/fTqx+VU+XRsNVFsQVRP64+pT8Nycu0uDQAAM5l/6YqGygpKaGNGzca7nv99deppKTEohI1EcE0ykSHQ84ICfpgWumQlt6qxnKKzzvV6U+IUh0zy3qM+gEA0DUpGUwPHz5MO3bsoB07dhBRw3RQO3bsoG+//ZaIGi7DX3755fLx11xzDX311Vd066230ieffEKrVq2i559/nm688UYrim/gc2vkdTXsxsojzggJVQ4MpggeRuJzcMr+M1NNKEKRxr7HqB8AAF2TksH0/fffp9GjR9Po0Q2DNhYsWECjR4+mRYsWERHRvn37ZEglIurXrx+9/PLL9Prrr9PIkSPpwQcfpMcee8w2U0U5LSQ4scUUwdRIfA6H68JUH4laXBpribrh1hTyuzWLSwMA4Gwp2cf0tNNOI25jWpdYqzqddtpptH37dhNL1XlZfjftr65zzGXViiPOC6ZicFkQwZSIjAHdKf2EzVJxJERERFl+DymK/ft4AwDYWUq2mCYbp43Md3KLaSaCKRERuTSV0r0N57VO2YdmaWpNT8nzfACAuEIwTQLBgIMv5TukXywu5bfktC4kZsHAOACA+EEwTQKZDgsITm4xRfho4rR6ZxbUDQCA+EEwTQJOa7lyYjBFq1hL4tK1U/ahWRBMAQDiB8E0CTgtmDp5uijRbQKIgn4PEWEuU/3iCwAA0DUIpklABlOH9NfUD9JyyoAtMZMAWsWayEF3Dql3ZhHvHwPjAAC6DsE0CTipxbQ+EqUjoYj8t1Na23C5tqUshw26MwvqBgBA/CCYJgEnjcpvXkYnlDkaZaqqRfhozkknRGZCMAUAiB8E0yTgpIDgxGBaXRcmsR4DLtc2waj8BhgYBwAQPwimScCJwTSjcXL2I6EIhcL2XtJSBA+vSyUflpyUnFTvzIQWUwCA+EEwTQKi5aqqtp6i0daXWrUDMUCrd7dA0302DzZicAtG5BsFEUyJSLdcLeoHAECXIZgmAdFSw0xUXRu2uDRtEyEmO+CmDJ8z5sFEi1hsaDFt7H+M+gEAEDcIpknA69LI33iJ2e4hQT8fqFMGbSGYxoZgSnQ4FCZxkQL1AwCg6xBMk4RTQoI+5Iky233KKATT2MTncSQUofqIvfsJm0V0TfGg/zEAQFwgmCYJpwXTTF0wdVKZoYn+87D7PjQLTloAAOILwTRJOC3kZTkwmCJ8GGmqImdXsPs+NAv6lwIAxBeCaZJwypyS+qU9nbKkZeXREBE1rQ0PTcTqT3bfh2aRI/IRTAEA4gLBNEnIkNcYouyqytBi2hD07B6mm1pMXRaXxH6c0k/YLGhNBwCILwTTJOG0Ee5Bv8d5l/IxT2ULTtmHZkEwBQCILwTTJOGUliv0MU0uTtmHZsHAOACA+EIwTRJOCQiYLiq5OKXemQV1AwAgvhBMk4QTAkJdOEJH6yNE1Gzwk837xVbKAVsY/NRclkO6kJhFv2AEAAB0HYJpknDCCHdxEFcUogyfyxFhOhJlqmpc5hWtYi05od6ZqfIIWkwBAOIJwTRJOKHlSlyyz/S5SVUVRwzYqq5tKhvCR0tOOLkwEy7lAwDEF4JpknBCQGh+EBcDRmrro1QXjlhWrraIMvvdGnlc+Lo055R+wmZBMAUAiC8caZOEODBW14YpEmWLSxNb84N4htdFimL8m90geLTNCSdEZkL9AACILwTTJKE/MOovP9tJ84O4qiqU6bN3ixuCR9tSOZhGo0xVtagfAADxhGCaJNyaSgGPRkT2DQmxBorYffAMJtdvW9Ahq3eZobo2TNx4cQLzmAIAxAeCaRKxe8gT64pnxgimdg02FRh13SbxuRytj9i2n7BZRJ31uVXyuTWLSwMAkBwQTJOI3UNerDkf7T4yH5fy25bhs38/YbOgbgAAxB+CaRJxSjDVH8gzbV7mKoSPNqmqQhleFxHZt5+wWRBMAQDiD8E0idg9mMYKeXYvM8LHsTlhDl0zoG4AAMQfgmkScWLIc0qZseRk61J1AFRTfcZStQAA8YJgmkTsHvJiDSSSZbbrgC0Mfjomuw+6M0vF0RARoW4AAMQTgmkSsXvIi9ViGrR5mK6MMZMAGNn9hMgsuJQPABB/CKZJxIkj3O0eahA+js3uA9jMgoFxAADxh2CaROwcEGrrI1QXjhKRcbJ6uwdThI9js/s+NEvTSYvL4pIAACQPBNMkYueAIAKeqhCle5oO5HYO05EoU3VdmIgQTNti53pnJqwKBgAQfwimScTOAUHfV1NVFXm/HDhjwzLr5+VEMG2d6EKSavOYisFeQYzKBwCIGwTTJGLnYFrRyiVx0doUCkeptt5eS1qKMqd5NHJr+Kq0JlVH5WNgHABA/OFom0SCgYaWm8N1YQpHohaXxqhSti4ZD+IZXhdpjS2odgvUGPjUPnY+ITIT6gcAQPwhmCaRTF9T382q2rCFJWmptdYlRVFkue0WbNAi1j6pGEwjUabqWvQ/BgCINwTTJOLSVEr32jvkxTqI2zXYoEWsfey6/8xUXYv+xwAAZkAwTTJ2DQntCqY266OIYNo+okW5zob9hM0i6obfrZHHhZ9RAIB4wS9qksmUA1FCFpfEqK2Ql2nTkflilHkQ0wG1KcPrIjHRQqqMzJcj8lE3AADiCsE0yYjJvp3UYioGbdmtzCLco8W0baqq2PbkwixoTQcAMAeCaZIRcyrareWqso3WRyeGaTCyaxcSs2BgHACAORBMk4xdA0J7+pjaNUwjmB6bXfsJmwV1AwDAHAimSUZMWG/XYBqrhcnuYRqtYsdm131oFgRTAABzIJgmGbsGhPa0mNpvwFbDPJWiDyy0zq71zixyYByCKQBAXCGYJpmmUfn2CQjMLC/xOmoeUwx+aje77kOzVLRRnwEAoPMQTJNM0IYBobY+SqHGJVJjB1N7jsrH5dr2S7VgKusGposCAIgrBNMkY8eAIMqiqYpcmUqvqcz2WUa1PhKlmlDDZPEIpsdmx3pnJpy0AACYA8E0ydhxhLv+IK4oSou/i1anqqP1xMwJLVtr9J9fpq9lmAajVA2mGBgHABBfCKZJxo4B4VitS+L+UCRKtfXRhJWrLaLM6V4XuTR8TY7FjvXOTGgxBQAwB464SUYcKGtCEaqP2Cvktda6lObRSGtc07LiqD1G5iN4dIxdpykzSyVG5QMAmALBNMnow59dQsKxlvZUFMV2LW4VCKYdkmXD2SDMEo5E6XBdQ39o1A8AgPhK2WC6cuVK6tu3L/l8PpowYQJt3bq1zcevWLGCBg8eTH6/nwoLC+nGG2+k2traBJW2/TRVoQyfvZb4bE/rkpxNwCbBpgrBtEP0fZvt0k/YLFW1TYP00McUACC+UjKYPvfcc7RgwQJavHgxffDBBzRy5EiaPHky7d+/P+bjn3nmGbr99ttp8eLF9PHHH9PatWvpueeeozvuuCPBJW8fu7U+tifkZdqszLiU3zF27CdsFlE30jwaudH/GAAgrlLyV3X58uV01VVX0ezZs6m4uJhWr15NgUCA1q1bF/Px7777Lk2cOJEuvfRS6tu3L5155pl0ySWXHLOV1Sp2C6btCXm2KzMmUO+QdK9L9hO2yz40C05aAADMk3LBNBQK0bZt26i0tFTep6oqlZaW0pYtW2I+5wc/+AFt27ZNBtGvvvqKXnnlFTr77LNbfZ26ujqqqqoy3BLFblNGOTKYYgL1DlEURU6rZZd9aBZMFQUAYJ6Um6Dx4MGDFIlEKDc313B/bm4uffLJJzGfc+mll9LBgwfppJNOImamcDhM11xzTZuX8pcuXUr33HNPXMveXnYbiOLoYIrw0W7BgIcOHam3zT40ixjMF8RJCwBA3KVci2lnbNq0iZYsWUKrVq2iDz74gP74xz/Syy+/TPfdd1+rz1m4cCFVVlbK2549exJWXruFvIp2tDAFbTbdEEbld1ymPCGyx5RfZsHAOAAA86Rci2lOTg5pmkbl5eWG+8vLyykvLy/mc+6++26aOXMm/fSnPyUiouHDh1NNTQ1dffXVdOedd5Kqtsz3Xq+XvF5v/N9AO9htTkk5Kr+NFia7hWm0mHac3fahWVA3AADMk3Itph6Ph8aMGUMbN26U90WjUdq4cSOVlJTEfM6RI0dahE9N04iIbDk1jt0CghNH5aNVrOPsVu/MgmAKAGCelGsxJSJasGABzZo1i8aOHUvjx4+nFStWUE1NDc2ePZuIiC6//HIqKCigpUuXEhHRtGnTaPny5TR69GiaMGECffHFF3T33XfTtGnTZEC1EzsFBGZGH9MUkeVv+Dmxy6A7s6BuAACYJyWD6UUXXUQHDhygRYsWUVlZGY0aNYo2bNggB0R9++23hhbSu+66ixRFobvuuou+++476tGjB02bNo1+8YtfWPUW2mSnkHe0PkL1kYZW5XYFU5sN2MIAl/YL+j1EZI96Z6amGRs8FpcEACD5pGQwJSKaP38+zZ8/P+bfNm3aZPi3y+WixYsX0+LFixNQsq6zU8gTMwO4VIUCntZbl+0UpkPhKB0JRYgIrWIdYad9aKYKzHELAGCalOtjmgrs1HKlv+ypKEqrj9OPyre6367+c8vwIXy0l5ymzAb1zky4lA8AYB4E0yRkp5ar9k5UL8ocjrJsrbSKKHOGr2k1Izg2uw1gMwsGxgEAmAfBNAmJA+bR+giFwtauW97e1iW/WyO3Zo8lLdEi1jl2OiEyE+oHAIB5EEyTUIbPReKqudUhob0HcUVRbBNs0CLWOXZbCtcM9ZEo1aD/MQCAaRBMk5CqKpThFeuWW7sKT0dCXtPKQfYI0xiR3zF26idsFv1JU6YvZceOAgCYBsE0Sdll9aeOjGAO2qTFVCypiRaxjhGfV32E6Wi9tf2EzSL7H3td5NLw8wkAEG/4ZU1SdhmZ35H+eHa5FFx5NExECKYdFfBo5GocLGZ1q7dZRH3ORN0AADAFgmmSskt/zc4EU7uUGeGjY+zUT9gsGPgEAGAuBNMkZZdJ9p0cTBE+Os4u+9AsGBgHAGAuBNMk1TSnZNjScnQmmFZYPGBLDn7yY8nJjrJL32azYGAcAIC5EEyTlF1CXmdG5VsdptEq1nnJ3mKK5UgBAMyFYJqkgjZpuRLLUx5r5SciomDAHgO2RJhH+Og4u3QhMQu6eQAAmAvBNEnZYYQ7M3fosrhdWtsQPjrPLvvQLBgYBwBgLgTTJGWHgFATilAkyobytMUOYZoIwbQr7FDvzIS6AQBgLgTTJGWHgCBe26Op5HMfu6rZocx14QjV1kcN5YH2s8M+NBOCKQCAuRBMk5Qc/GRhXz/RzzDT7yZFUY75eH2osWpJSxE8FIUoA0tOdliyB9MqjMoHADAVgmmSskNAaBpE1L6AJ8ociTIdrrNmZL4M0z43qeqxwzQY2aHemQmj8gEAzIVgmqTEKPi6cJRqLVq3vKPTLvncKnlcDVXSqmCDS7Vdk+zBFPUDAMBcCKZJKt3jItHgZ9VgoqbJyNs3Ub0dlrRE8OiaZJ5gPxSO0tHGkzzUDwAAcyCYJilVVXQT1jsn5CGYOpsd+gmbRV8nM3yoHwAAZkAwTWJODHlWT9COYNo1+n7CNSFrupCYRdSNDJ+LNPQ/BgAwBYJpErN6ZH5nJiO3TZjGqOtO8bs18mjW9hM2S2XjYD6MyAcAMA+CaRKzOuR1ZgRz0IFlhiaKoutCkmTLkqI1HQDAfAimSczqYNqZA7nV/WI7OpMAtCSmBxPThSULBFMAAPMhmCYxq4OpnIzciZfyET46zS5Ly8ZbJVrTAQBMh2CaxGwT8jrQJ882ZUb46DSr96FZKo82LPqAugEAYB4E0yRmdcuVk6eL6kgrLxiJeWuTL5iK+ty+eXkBAKDjEEyTmByVb0FAiEbZ0cG0IzMJgJHV+9AsTUvsom4AAJgFwTSJBS1chedwKEzRxvnVOzQq3+KVgypwKb/LrB7AZhYMjAMAMB+CaRKzMiCIgSJel0o+t9bu51nZ2lZbH6FQONpQDsxV2WlWz59rFvQ/BgAwH4JpErMy5HX2IK7vFxuNJnZJS1FmVSFK97gS+trJJFkv5SOYAgCYD8E0iVm5bnlnL3uKVt4oN3QHSCR9/1IVS052mtWD7syCYAoAYD4E0yQmDqChcJRq66MJfe3OHsR9bo28rsYlLRN8KRgj8uPD6n7CZhFdE7AkKQCAeRBMk1i610VaY8tfokNCV1qXrAo2mEA9PpLxUn5tfYTqGvsfY8YGAADzIJgmMUVRLAsJXRndbnWZETy6Rr//Et1P2CyiW4KiEGV40f8YAMAsCKZJzqqQ15lVnwTLy4xg2iVZFvYTNovsf+xD/2MAADMhmCY5q6aM6krIQzB1Np9bI49F/YTNgroBAJAYCKZJzokhT4TpRM+DiQnU4yfZ+pkimAIAJAaCaZJrmuw8lNDX7UrIszpMY9R11wWTbMoojMgHAEgMBNMkZ1VAqOjCCPeg30NEFgx+OoK10OMlWVtMMTAOAMBcCKZJzurWx861mDaMek50mMbl2viRLfVJFkxRNwAAzIVgmuSsDqadufSZZdU8pmgVi5tkbTFFMAUAMBeCaZKzIiBEo0xVtZ0PedaF6bDh9aHzrJoNwiwYGAcAkBgIpkku04JLqtV1YeLGedW7Mvip4mjiBmwxswwfwYAnYa+brJJtWVIsVwsAkBgIpknOitZHEfB8bpW8Lq3Dz5dlTuB0UbX1UQpFoobXh85Ltkv5XVnJDAAA2g/BNMmJlqtEDiTqyoj8huc1tFhW14UTtqSlaJ3VVIXSPB0P02CUlWTTRaGPKQBAYiCYJjl9yxVzYkJe02XPzl0SF2VmJqquTcySlvrgoShYcrKrmubPTa5gioFxAADmQjBNciIg1EeYjtZHEvKaXW1d8rhU8rs1w7bMVtnFVl4wSrZL+WgxBQBIDATTJBfwaORSG1oAExby4tC6lOgBUGgRi69kCqa19REKhRv7H2PlJwAAUyGYJjlFURJ+WTUerUuJDjYYdR1fIsBV1dYnrJ+wWcT3RlMVyvC6LC4NAEByQzBNAYmesD4uwdSBZYYmhn7CdYnpJ2wW2Zruc6H/MQCAyRBMU0DiWx+7vua8VS2mCKbx4XVp5HM3/LwkctovM6BuAAAkDoJpCrDssngX+uMhmDpfsvQzRd0AAEgcBNMUkOg5JZ3cxxThI36SLZhiYBwAgPkQTFOAE0Neold/QjCNv2QLpqgbAADmQzBNAVaNyo/HdFEJD9OYDihuxApejg+mRxr6THelawoAALRPygbTlStXUt++fcnn89GECRNo69atbT6+oqKC5s2bR7169SKv10vHHXccvfLKKwkqbdckOuR1dUlSoqYQgAn2nQstpgAA0FEpOSnfc889RwsWLKDVq1fThAkTaMWKFTR58mT69NNPqWfPni0eHwqF6IwzzqCePXvS+vXrqaCggL755hsKBoOJL3wnJDIgRKIslxHtyoE804HdD8Ao0YskmAV1AwAgcVIymC5fvpyuuuoqmj17NhERrV69ml5++WVat24d3X777S0ev27dOvr+++/p3XffJbe74eDUt2/fRBa5SxIZTKtrm17DKYOfmBnhwwSJHnRnFtQNAIDESblL+aFQiLZt20alpaXyPlVVqbS0lLZs2RLzOf/zP/9DJSUlNG/ePMrNzaXjjz+elixZQpFI62vP19XVUVVVleFmlUQGBHEQD3g08rg6X70SGUyPhCIUblydCOEjfrL8Dee9uJQPAADtlXLB9ODBgxSJRCg3N9dwf25uLpWVlcV8zldffUXr16+nSCRCr7zyCt1999304IMP0s9//vNWX2fp0qWUlZUlb4WFhXF9Hx0hBvRUJDCYdvUgLp5fXRumiMlLWooyuzWFAh7N1NdKJcFAkgx+knXaY3FJAACSX8oF086IRqPUs2dP+u1vf0tjxoyhiy66iO68805avXp1q89ZuHAhVVZWytuePXsSWGIjfesjc2JCXryCKZH5Lb36MmPJyfjB4CcAAOiolOtjmpOTQ5qmUXl5ueH+8vJyysvLi/mcXr16kdvtJk1rak0bOnQolZWVUSgUIo+nZUuK1+slr9cb38J3UrCxpScSZaoJRSjda95uFyPyuzoZuVtTKc2jUU0oQpVH6yk7zbzWqniVGYwSPYDNDIb+x5guCgDAdCnXYurxeGjMmDG0ceNGeV80GqWNGzdSSUlJzOdMnDiRvvjiC4pGo/K+zz77jHr16hUzlNqNz62SR2tctzxBrY/BOIS8RLW4oUXMHImeP9cMR+sjVB9B/2MAgERJuWBKRLRgwQJas2YNPfnkk/Txxx/TtddeSzU1NXKU/uWXX04LFy6Uj7/22mvp+++/p+uvv54+++wzevnll2nJkiU0b948q95ChyiK0tR6ZXJIiGfIS1SLWxWCqSkS2U/YLKLuaapCaeh/DABgupS7lE9EdNFFF9GBAwdo0aJFVFZWRqNGjaINGzbIAVHffvstqWpTZi8sLKRXX32VbrzxRhoxYgQVFBTQ9ddfT7fddptVb6HDsvwuOni4zlEhr2keTOeEaWii/zyra+vlYCgnQf9jAIDESslgSkQ0f/58mj9/fsy/bdq0qcV9JSUl9Pe//93kUpmn6bK4uZOdxzPkJfpSfjy6H0ATj0ulgEejI439hJ0YTEU3BNQNAIDESMlL+akoUVP3xHOgiFiWNJGj8iG+nD4yX5QbA+MAABIDwTRFJCogVMRxzfmElRnhwzTJEkxx0gIAkBgIpinCiSPcsxw4YAuMMh0+Mh8D4wAAEgvBNEUkaoS7k/uYInzEH1pMAQCgIxBMU0Si5pSMZwuTbG0zecCWKLMTB+fYXTBJgmkQk+sDACQEgmmKSETLVTgSpeq6sOH1uqKpzOEub6staBUzj/hMzR7AZpZ49pkGAIBjQzBNEcEEBISq2qYAGY+BRKIF08wyG5acRPiIu2S5lI+BcQAAiYFgmiLE9E1mBgSx7TSPRm6t61UrEaHmcF3TqkQIpvEn6p1TBz/hpAUAILEQTFNEIkJeZZz7aooyH64LU30kGpdtNifK7NFU8rnxdYg3p7eYYlQ+AEBi4UicIvQBIWrSuuXxvuyZ6WtamMysy/n6MmPJyfhL1GwQZkGLKQBAYiGYpghxYI0y0eGQOYOJmg7i8Vnp1qWplO51GbYdbxh1bS4nj8pnZrn4AuoHAEBiIJimCJ9bI6+rYXebNWG9Ga1LZl8KxqVaczl5VH5NKIL+xwAACYZgmkLMDnmVR0KG14kHs8uM6YDMJT7X6rowhU3qJ2wWUefcmkJ+t2ZxaQAAUgOCaQoxu/XKiS2m6ENoLn1/Y/10Yk5QqTtpQf9jAIDEQDBNIYkKefFcQcmJYRqauDWV0jwNrY1O62eKOUwBABIPwTSFyGVJEzDCPV7MXkoV4cN8Tp0yCictAACJh2CaQpx4WdzshQFkKy/Ch2myGlvQnRdMG/pMo24AACQOgmkKMT/kNfQhRB9T0BPThzkvmKJuAAAkGoJpCsGo/JYQPsyHS/kAANBeCKYpJGGDn5wYTDGBumnkPmw8cXEKBFMAgMRDME0hZo5wr49EqSYUMbxOPKDF1Pmc22La0DUFA+MAABIHwTSFmDnCXR92zRiVb0aoiUZZlhsDXMwTdOzgp/hPfwYAAG1DME0hZoY8sc0Mr4s0NX6TkQdNHLB1OBSmxhUn0Spmokyntpia0GcaAADahmCaQswMeWJu1HgHPBEKjoQiVB/nJS3Fyj5el0o+LDlpGudeykc3DwCAREMwTSEiNFbV1lNUNBXGiVkH8Qxf0/biHWwQPBKjKZg6bElS1A8AgIRDME0h4gDLTFRdF9+QIPtqxnl0u6YqlOEzZx5MBI/EcOKofGamqtr4z8sLAABtQzBNIV6XRj53wy6P98h8M0OeWYO2EEwTw4mX8g/XhSnSeFUB9QMAIHEQTFOMaSHviPnB1KwwHe9WXjASMx7UmNBP2Czi++FxqfJkDgAAzIdf3BQT9JszdY+ZrY9mDdqqNGnAFhjpP18z5tA1g74+K0r8ZpkAAIC2IZimGLMuq5o1Kp/IxDKb2MoLTTRVoQyvOf2EzVKFbh4AAJZAME0xZs0pmYg+pk4qMxiJelfhkGCKugEAYA0E0xRjdsgzo7+mWWEarWKJ47QBUAimAADWQDBNMXLw09H4Tt1jZsjDqHznM2sAm1lQNwAArIFgmmLMHuFuyuAnkwdsYVS++cxcdcwMFQimAACWQDBNMWaPcHfidFEIH+ZrmmTfGcEUdQMAwBoIpinGjL5+oXCUjoQihu3Hk3mj8kOG7YN50McUAADaA8E0xZgREMS2FMW4tn28mFHmaJTlsqyYx9R8ThuVj4FxAADWQDBNMWaMcBfbyvC6SFPjPxm5GQO2qmvDxGzcPpgHLaYAANAeCKYpxowR7vIgbtIgIlHm2voo1YUjcdmmKLPfrZHXpcVlm9A6pw1+wsA4AABrIJimGHGgra4NUyTKcdmm2Zc9M3wuEqtCxivYoEUssZw2XRRWBQMAsAaCaYrRH2ira50R8lRVoUxffIMNgmliOelSfjTKVFWL+gEAYAUE0xTj1lQKeBouXccrJCRidHu8g43or4rgkRhOCqbVdU39jzEwDgAgsRBMU1C8Q0Ll0XDjdj1x2V4s8S9zw3YQPBJD7L8joQiFwlGLS9M20Srvdankc6P/MQBAIiGYpqB4D4BKxGVxJ5YZmuinEbN7qynqBgCAdRBMU1C8p4xKZDCNd5kx6joxNFWhTJ+LiOwfTMXJD+oGAEDiIZimoKATg2mcpxvCBOqJF+99aBa0mAIAWAfBNAXFv/XRgYOfMB1QwjllyigEUwAA6yCYpqB4BwQnX8pH+EgcM1bwMgMGxgEAWAfBNAU5sb+mE8M0GMl6F8dVx8yAugEAYB0E0xQk+vo5aYS7aaPyMcAlYcR0YmJ6MbuSJ1omTn8GAACxIZimoHi2mNaFI1Rb3zAvpZmXPp04YAuMnDLJflOfaZfFJQEASD0IpikongFBbENRiDK85h3I4znFVSTKVF0rFgVAME0U5wRTtKYDAFgFwTQFxTWYNl5az/S5SVWVLm+vNfEss76fKoJp4jgumKJuAAAkHIJpCornQKJETVQvWq/qwlGqrY90aVuizAGPRm4NX4FEaQqmzhiVj2AKAJB4OCqnIHHAra4LUzjStXXLE3UQT/e4SDTIdrXFDcHDGo5pMcUctwAAlkEwTUH6QUpVtV0bIZ2okKeqStz6mSKYWiPogJWfIlGm6jrR/xij8gEAEi2lg+nKlSupb9++5PP5aMKECbR169Z2Pe/ZZ58lRVFo+vTp5hbQJG5NpXRvfNYtT+Rk5PEamY9gag0ntJhW19YTc8P/o34AACReygbT5557jhYsWECLFy+mDz74gEaOHEmTJ0+m/fv3t/m83bt3080330wnn3xygkpqjniFhESGvHhN0I5gag1x8lJbH6W6cNf6CZtF1A2/WyOPK2V/HgEALJOyv7zLly+nq666imbPnk3FxcW0evVqCgQCtG7dulafE4lEaMaMGXTPPfdQ//79E1ja+IvXZfFErjmPS/nOluF1kRKnfsJmQd0AALBWSgbTUChE27Zto9LSUnmfqqpUWlpKW7ZsafV59957L/Xs2ZPmzJlzzNeoq6ujqqoqw81OxOThXQ0IYmR/MJEtpgimjqSqCmX67L0sKeoGAIC1UjKYHjx4kCKRCOXm5hruz83NpbKyspjP2bx5M61du5bWrFnTrtdYunQpZWVlyVthYWGXyx1PTZfFuzZ1jxWX8iu6Gkwx6toydu9nimAKAGCtlAymHVVdXU0zZ86kNWvWUE5OTrues3DhQqqsrJS3PXv2mFzKjnFi66MY1d3V+VcTNfcqtGT3kfmyawrqBgCAJVJyMeicnBzSNI3Ky8sN95eXl1NeXl6Lx3/55Ze0e/dumjZtmrwvGm2Y/9PlctGnn35KAwYMMDzH6/WS1+s1ofTxEQw0TIXjpGAa7zCdiJkEwAgtpgAA0JaUbDH1eDw0ZswY2rhxo7wvGo3Sxo0bqaSkpMXjhwwZQjt37qQdO3bI2znnnEOTJk2iHTt22O4yfXvEKyBUJDDkxbvMCB+JF68BbGapQt0AALBUSraYEhEtWLCAZs2aRWPHjqXx48fTihUrqKamhmbPnk1ERJdffjkVFBTQ0qVLyefz0fHHH294fjAYJCJqcb9TOHGEe7yCKcKHddBiCgAAbUnZYHrRRRfRgQMHaNGiRVRWVkajRo2iDRs2yAFR3377Lalq8jYoxyMg1NZHKBRu6NKQiP6aIkxXOGjAFhjJAWwYlQ8AADGkbDAlIpo/fz7Nnz8/5t82bdrU5nOfeOKJ+BcogeIREMRBXFMVuZKUmZrCdOeXUQ1HonS4cclJ0c8WEkdMK9bVAWxmwcA4AABrJW+TILQpHgFBDiLyuUgRM6ebSATJqqP1xGLdyA6qqm0KtZm+lD4vs4TdL+WLEzUMjAMAsAaCaYqKR0BI9GVP8TqhSJRq66Od2oYoc7rXRS4N1T/R7B5McSkfAMBaODKnKHHgrQlFqD7SuZCXyOVIiYjSPBppakPLbGeDjeifiuBhDbsHUwyMAwCwFoJpitJfquzs5XzZupSgvpqKonQ52GAOU2vJAWw2DKaRKFN1Y/9jBFMAAGsgmKYoTVUoo3HAUmdDghWXPbO6ODK/qczoX2oFO7eY6k/QEEwBAKyBYJrCujqXqRUhr6tlFuEj6MeIfCuI0e6hcJRq6yMWl8ZInKCleTRyo/8xAIAl8Oubwrq6brkV/fGCcQvTaBGzQrrX1eV+wmZB3QAAsB6CaQrL6uKUUVZeyu9yMMU8lZZQFEVO02XXYIr+xwAA1kEwTWFdDXlWjHDvaphO9EwC0JJd+5mixRQAwHoIpilMBoROrv7UdCBPXH9NjMp3PrsuS4pgCgBgPQTTFJbVxal7LB2V76Ayg1FXB7CZBXOYAgBYD8E0hWV1cfCTWLM+ocG0y2UWo/IRPqwilpa1WzAVXVOC6H8MAGAZBNMU1pXL4szc1MKUwAN5Vy/lo1XMemJ6MbsFU7SmAwBYD8E0hXUl5B2tj1CocSlTJ43Kr0D4sFxXB7CZBcEUAMB6CKYprCsBQRzENVWhNI8W13K1pStlro9E6UgoYtgOJJ7dR+VjYBwAgHUQTFNYV0ZH6/tqKooS13K1RV9mZu7Qc/VBCOHDOl1dVtYsVvSZBgAAIwTTFNaVlqtKi+YDFa8XjrJs/Wwv8T4zfE2rD0HiienF7NZiKperDWC5WgAAqyCYpjCxXvzR+giFwtEOPdeqy54Bj0ZurXNLWqIPoT3Y9VK+FQtGAACAEYJpCsvwuUhchXdKyFMUpdPBBsHUHpr2X9jikjSpj0SpBv2PAQAsh2CawlRVoQxv56busTLkdXaCdqu6H4CRmF6s6mjH+wmbRT+YLtPnsrAkAACpDcE0xXV2wnorgylaTJ1NfP6hSJRq6zvWhcQsom6ke13k0vCzCABgFfwCp7imkNexEdJyVL4Fq+TIMndwNgEEU3tI82hy8FlFB+udWVA3AADsAcE0xTmx9THY1TJjyUlLKYrS6X1oFiy8AABgDwimKU6MzO9s66MV84E6MUyDUWdbvc2CpWoBAOwBwTTFZXZyhDT6mEJXdHYAm1lQNwAA7AHBNMV1OuRZOMIdo/Kdz25zmaJuAADYA4Jpiutq66OVg58q0GLqWLYLpuh/DABgCwimKa4zo/KZ2dGX8kW/WrBOsJPTlJkFJy0AAPaAYJriOhMQjoQiFI42TIxuyaj8xrXMq9Bi6lh2azHFqHwAAHtAME1xnQkI4rFuTSG/WzOlXG3pTJnrwhE6Wo8lJ+3CbsEUJy0AAPaAYJriOhMQKnQDRRRFMaVcbdGXub1LWor3pyhEGVhy0nJ2G5WP6aIAAOwBwTTFdaXF1Io5TImayhyJMtWEIu16jggeGV4XqWriwzQYocUUAABiQTBNcSJc1tZHqba+fSGvaRCRNQdxn1slT+N65hVH2jdoC6Ou7cVuE+wjmAIA2AOCaYrL8LpIXI1v72Aiqy97KorS4UvBGJFvL3YalR8KR+lIY8u7FdOfAQBAEwTTFKeqSocvq9qhdamjwcYOZYYmneknbBZ9HcrwoX4AAFgJwRQcGUzFa7e3lRcr+9iL2A/hKMvWSquI+pzhc5GG/scAAJZCMIUOB9OKxsn47RBM219mawdsgZHfrZFbawiBVl/Ot8OJFgAANEAwhU60mIaJyNqQJ5clbefgGYQPe1GUjnchMYvVfaYBAKAJginIgNnRkCdWYLKCE7sfgFFH651ZUDcAAOwDwRTktE9OCnkdDaZVMkwjfNhFR+udWcSUY6gbAADWQzCFToc8JwVTO4RpMOroADaziK4pqBsAANZDMIWOj3C3QchDMHU+u/QxtXolMwAAaIJgCh0KCMxsi5DX0TBdgemibMduwRR1AwDAegim0DTCvR0B4XBdmCLRhgnRreyTJ5YWbU+ZiRA+7Kip3rVvWVmzoG4AANgHgil0qOVKPMbjUsnn1kwtV1s6Uuba+gjVhaMNz8MAF9vIapzVQfTxtIocGIflagEALIdgCjKsdSSYWt26FNRdyo9G217SUgQPVSFK97hMLxu0j10u5dthwQgAAGiAYAqdajG1+iAuBqpEmehwqO0WN/3gFhVLTtqGXYKpXeo0AAAgmAI1HZBD4SjV1re9brkdpooiIvK5NfK6Gqpv5TEmaEfwsCf7TBeF+gEAYBcIpkDpXhdpavvWLbfT6Pb2trjZqczQxA4tpnXhCNXWRw3lAQAA6yCYAimKQpm+hr6Xx1oeUi5HaoODeHuDDVrE7Em//5jb7idsFlE3FIUow4f+xwAAVkMwBSLqeMizw2TkwXYO2kIwtSex/yJRpsN11ozMF90IMn3ofwwAYAcIpkBE+ql7nBPy0GLqbD63Rh7RT9iiy/no5gEAYC8IpkBEzgx5mQ4sMxhZ3c8UdQMAwF4QTIGInBlMnVhmMEIwBQAAPQRTICKiLH/DwI/KI20vD2mnA7lc0hLTRTmW1VNGoW4AANgLgikQUcdbH4M2WNqzvaEG4cO+2ntyYRY7DeYDAIAUD6YrV66kvn37ks/nowkTJtDWrVtbfeyaNWvo5JNPpuzsbMrOzqbS0tI2H+80Yp1wJ10W7/CofBuEaTAKWnwpXwRiO5xoAQBACgfT5557jhYsWECLFy+mDz74gEaOHEmTJ0+m/fv3x3z8pk2b6JJLLqE333yTtmzZQoWFhXTmmWfSd999l+CSm6M9LabRKNtm5Sd9GZwUpsGovQPYzGKn+gwAACkcTJcvX05XXXUVzZ49m4qLi2n16tUUCARo3bp1MR//9NNP09y5c2nUqFE0ZMgQeuyxxygajdLGjRsTXHJztCcgHA6FKcrGx1upPcGUmRFMbQyDnwAAQC8lg2koFKJt27ZRaWmpvE9VVSotLaUtW7a0axtHjhyh+vp66tatW8y/19XVUVVVleFmZ+0JCGJNeq9LJZ9bS0i52tKeMtfWRykUxpKTdoVgCgAAeikZTA8ePEiRSIRyc3MN9+fm5lJZWVm7tnHbbbdRfn6+IdzqLV26lLKysuStsLCwy+U2U7uCqY0GPhE1tdpW1dZTNBp7SUtRZk1VKN2LJSftBsEUAAD0UjKYdtX9999Pzz77LP3pT38in88X8zELFy6kyspKeduzZ0+CS9kxWbqBRK2tW263g7goBzNRdW3sJS31ZVYULDlpN+0dwGYWu9VpAIBUl5JNSDk5OaRpGpWXlxvuLy8vp7y8vDaf+6tf/Yruv/9+euONN2jEiBGtPs7r9ZLX641LeRNBjI6ujzAdrY9QwNOyatjtIO51aeR3a3S0PkKVR+tjjrq3W5nByOoW0wrUDwAAW0nJFlOPx0NjxowxDFwSA5lKSkpafd6yZcvovvvuow0bNtDYsWMTUdSECXg0cqkNLYqthQQ7hrxjBRvMU2lvVgbT2vpIU/9jm3RPAQBIdSkZTImIFixYQGvWrKEnn3ySPv74Y7r22muppqaGZs+eTUREl19+OS1cuFA+/oEHHqC7776b1q1bR3379qWysjIqKyujw4cPW/UW4kpRFEeGvPaW2U5hGproF0lorZ+wWUTdUBWi9BhXCAAAIPFS9tf4oosuogMHDtCiRYuorKyMRo0aRRs2bJADor799ltS1abc/utf/5pCoRBdcMEFhu0sXryY/vM//zORRTdNlt9N/64JydH3zYnJyO0U8uTKQUdjL6Va0bjEqp3KDE3ESU6UG6Yjy/Qlbj/pT7RUFf2PAQDsIGWDKRHR/Pnzaf78+TH/tmnTJsO/d+/ebX6BLJYpQ17brY9ilSg7ONb8q00TqKd0Vbctn1sjr0ulunCUKo/UWxJMcdICAGAfKXspH1o61ghpO4a8Y5XZjmEajKwamS+XI0UwBQCwDQRTkPT9/WKx45rz6GPqfFYNgLJjn2kAgFSHYAqSE0Neu8O0jcoMRlYHU9QNAAD7QDAF6VgBQQwwstOB/NhlRquY3SGYAgCAgGAKkhzh3sqo/Eo7j8pvrcwIH7Z3rAFsZqlC3QAAsB0EU5DaCgjRKFN1XcOyn1k2Gkh0rNY2ET6CNuoXC0ZiYFprJxdmqUTdAACwHQRTkIJthLzq2jBx4/zndmphympjRDczo8XUAay6lI85bgEA7AfBFKS2BhKJ0OB3a+Rx2afatBVqjtZHqD7ChseB/Yjpx1obwGYWnLQAANiPfRIGWK6t1ke7HsRFeaprwxRptqSlKLNLVSjg0RJeNmiftuqdmTBdFACA/SCYgqRvfWQ2hjw7jsgnMpanutYYbPRLqCoKlpy0K+tG5Ys+0/aq0wAAqQzBFCRxgA5HmWpCEcPf7Npi6tZU2RrafPCMXcsMRlYEU2bGqHwAABtCMAXJ79bIozVUieYhwY6rPgmtDdqyc5mhSZYclR9K2GvW1kcpFIkSEVEwYJ9ZJgAAUh2CKUiKojRNGeWg1sfWprmyc5mhiewnXBemaLN+wmYRXVM0VaE09D8GALANBFMwECOknRTyWrsUjEu1ziD2D3PDILZE0Ndn9D8GALAPBFMwcGLIa63Mdg7T0MTjUsnvbmi1TFQ/UzuuYgYAAAim0ExTyDP296uw8YG8tWBq5zKDUaIHQGGqKAAAe0IwBYNjtT7acflGtJg6n1XBFHUDAMBeEEzBQIxQbi3k2bGFSYRlJw3YAiMxc0LF0cSMzJcnWqgbAAC2gmAKBk4c4Y4WU+dDiykAABAhmEIzTQHBODrazgfy1sK0nQdsgRGCKQAAECGYQjOxAkIkynIaHzseyFsd/IQJ9h0DwRQAAIgQTKEZGRB0q/BU6cKCHQ/ksUINMyN8OIjYR1UIpgAAKQ3BFAxihTzx/2kejdya/apMrDLXhCIUaVxFKOjHkpN2JwawVRxJcDBFazoAgK3YL2WApeQI9xjB1K6tS2ImgcN1YQo3rn8uyuzRVPK5Uc3tLuGX8jHHLQCALeGIDQbykmptmJgbWhztPFUUEVGmzyX/v6qxL6wIHplYctIRWhvAZha7n2wBAKQqBFMwEAfqSJTpcF1jyLP5QdylqZTubQinoqxNZXa1+jywj0S2mKL/MQCAfSGYgoHPrZHH1VAtRH+/CgccxEXZKhoHbYklVe1cZmiSyGB6JBShcGP/Y9QPAAB7QTCFFpqHBCfMB9r8UjBaxJxF7Kfq2rActGYWUTdcqkIBj2bqawEAQMcgmEILwWZT98jlG208gjnYSjAVA6PA3vQnEGZPGaWvz+h/DABgLwim0ELzFlMnjGBuPg8mWkydxa2plNbYemn25fyKI/YezAcAkMoQTKGFFsHUASGvtTIjfDhHovqZOqE+AwCkKgRTaMGJIS8r0LzM9l1CFWJL1JRRTugzDQCQqhBMoQUREMRofGeNym8s8xGMyncatJgCAACCKbTQ2qh8Ow8kat7ahlYx50EwBQAABFNoofmypE44kLc+Kt++ZQajWMvhmqGicY7boI3rMwBAqkIwhRb0I9zDkahcAcrOwdSJA7bAKHEtpg312c59pgEAUhWCKbSgDwhi7Xki45r0dqMP09Eolpx0IlnvjuBSPgBAqkIwhRb0wVQMIkr3usil2be66Mt8OBQmsXgQwodzoI8pAADYN2mAZfQj3J1yEBflqwlF6N+HG8K0x6WSz40lJ50C00UBAACCKbQg5gStqq13xFRRRMb+gnu+P0JEGNziNGLWh0S1mNp5lgkAgFSFYAotiBDKTPTdoaOG++xKUxXKaOwD+21jMLV7mcEoEZfymdH/GADAzhBMoQWvSyOfu6Fq7HFQyBNldFKZoUkigunhujBFGjsgo34AANgPginEJA7a3/zbOSHPiWWGJmJ/Ha4LUzgSNeU1ROj1aKo8+QIAAPvALzPEJEOeaH10wET1LcqMYOoo+unI9NOUxZMIppl+NymKYsprAABA5yGYQkxOvCzevMyYQN1ZXJpK6d6GcGrW5fym/qX2nZMXACCVIZhCTFn+hhHLTlj1SRBLWooyYzlS52maqixkyvarMCIfAMDWEEwhpuZB1AnBtHkLqRPKDEZmD4CqOIIR+QAAdoZgCjE5MZg6scxgZHYwxVRRAAD2hmAKMTkx5DmxzGAk9lkVgikAQEpCMIWYmg8OccKBHMHU+RLVYoqBcQAA9oRgCjE1nx7KCQOJmgdRJ5QZjMQ+MzuYYrlaAAB7QjCFmIJ+46jlDJ/9D+TNy4xWMefJlKPycSkfACAVIZhCTPpQl+FzkabafzJyXMp3Pgx+AgBIbQimEJP+wO2Ug7i+nD63Sl6XZmFpoDMSFkzRzQMAwJYQTCEmJwbTDJ+LxCqTTikzGKHFFAAgtSGYQkxODKaqqlBG45KWTikzGJk5XVQ0ynK7qB8AAPaU0sF05cqV1LdvX/L5fDRhwgTaunVrm49/4YUXaMiQIeTz+Wj48OH0yiuvJKikiedxqRTwNFwKd9LodrHUZPOBUOAMZo7KPxwKU5Qb/h/BFADAnlI2mD733HO0YMECWrx4MX3wwQc0cuRImjx5Mu3fvz/m499991265JJLaM6cObR9+3aaPn06TZ8+nXbt2pXgkieOOHg76SAuyooR+c4k9l9NKEL1kWhct13ZONLf61LJ50b/YwAAO0rZYLp8+XK66qqraPbs2VRcXEyrV6+mQCBA69ati/n4hx9+mM466yy65ZZbaOjQoXTffffRCSecQI8++miCS544Tgx5TgzT0EQ/LVm8W03RvxQAwP5cx35I8gmFQrRt2zZauHChvE9VVSotLaUtW7bEfM6WLVtowYIFhvsmT55ML774YszH19XVUV1dnfx3VVVV1wueYJkODHkIps6mqQpl+FxUXRum+//yCWX44vcTVV5VS0SoGwAAdpaSwfTgwYMUiUQoNzfXcH9ubi598sknMZ9TVlYW8/FlZWUxH7906VK655574lNgi/TK8hn+6wR5DiwzGPXK8lF17WFav+1fpmw/D3UDAMC2UjKYJsLChQsNLaxVVVVUWFhoYYk67uYzB9PYPtk05fheVhel3a45dQAVdQvQeScUWF0U6KQHfzKKXv2ojJg47tvWVJXOGZkf9+0CAEB8pGQwzcnJIU3TqLy83HB/eXk55eXlxXxOXl5ehx7v9XrJ6/XGp8AWKewWoJklfa0uRof0yPDSrB/0tboY0AXDe2fR8N5ZVhcDAAAskJKDnzweD40ZM4Y2btwo74tGo7Rx40YqKSmJ+ZySkhLD44mIXn/99VYfDwAAAAAdk5ItpkRECxYsoFmzZtHYsWNp/PjxtGLFCqqpqaHZs2cTEdHll19OBQUFtHTpUiIiuv766+nUU0+lBx98kKZOnUrPPvssvf/++/Tb3/7WyrcBAAAAkDRSNphedNFFdODAAVq0aBGVlZXRqFGjaMOGDXKA07fffkuq2tSg/IMf/ICeeeYZuuuuu+iOO+6gQYMG0YsvvkjHH3+8VW8BAAAAIKkozBz/EQbQQlVVFWVlZVFlZSVlZmZaXRwAAABoBxy/Eysl+5gCAAAAgP0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtpOySpIkmFtiqqqqyuCQAAADQXuK4jYUyEwPBNEGqq6uJiKiwsNDikgAAAEBHVVdXU1ZWltXFSHoK4xQgIaLRKO3du5cyMjJIUZS4bruqqooKCwtpz549cV3H16ztmrltJ5bZzG2jzInZNsqcmG07scxmbhtlTsy2mZmqq6spPz+fVBU9IM2GFtMEUVWVevfubeprZGZmxv2LbuZ2zdy2E8ts5rZR5sRsG2VOzLadWGYzt40ym79ttJQmDqI/AAAAANgCgikAAAAA2AKCaRLwer20ePFi8nq9jtiumdt2YpnN3DbKnJhto8yJ2bYTy2zmtlHmxG0bEgeDnwAAAADAFtBiCgAAAAC2gGAKAAAAALaAYAoAAAAAtoBgCgAAAAD2wB2wZMkSHjt2LKenp3OPHj343HPP5U8++cTwmKNHj/LcuXO5W7dunJaWxueffz6XlZXJv+/YsYMvvvhi7t27N/t8Ph4yZAivWLHCsO3MzEzu0aMHB4NBzsjI4BNPPJE3bNhwzG0/+OCDnJuby6qqMhFxv379eOrUqYYyDxw4kNPS0piImIh40KBB/MADD7S53U2bNnFeXh4riiKfl5WVxfPnz5fbDgaD8m/NbxdccEGrf2t+0zSNu3XrxoqisKIo7Pf7uaioiN1ut3yMoiisaRq73W52uVzt3ra+/KqqssfjafdzO7Jtr9fLw4YNY5/PF9ftmnnTNC0hr+OUm6h/HalfHbmJ72iq3/A5JOamKAoXFBRYXg673LKysuR3vDPPb+13IS0tjQcOHMgej4f9fn+nfleDwSD7/f4W+8/j8bDX6+VBgwZxcXFxq89PT0/nSZMm8bhx47hbt27s8/l48ODBvHz5cl6/fr3h+C9uqqpy//79+cYbbzxm+W6++WZDhhGZRf9ZaprGBQUF8jEDBgzg0tJSHjhwIGuaxqqqssvl4sGDB3NRUZF8X6eeeqohG/3sZz/jM844Q34eLpeLu3fvztnZ2YZsdOqpp8b8HLxeL48fP57fe+89mWcOHjwo80p6ejoTER86dIiZmX//+9/ziBEj2O/3c15eHs+ePZsPHjwYMw/+4Q9/YCLic88913B/WVkZz5o1i3v16sV+v58nT57Mn332WUeiJncomE6ePJkff/xx3rVrF+/YsYPPPvtsLioq4sOHD8vHXHPNNVxYWMgbN27k999/n0888UT+wQ9+IP++du1avu6663jTpk385Zdf8lNPPcV+v5+HDh0qt33ppZfykCFDOC8vj3fs2MELFy5kt9vNF1xwQZvbnjNnDk+YMIFvvvlmJiL++c9/zqqq8owZM2SZ+/Xrx4FAgOfNm8dExKtXr2aXy8XZ2dmtbveRRx7h/v37s9/v51/84hd85ZVXyi/Lb3/7W961axe/+OKLrKoqp6WlcV5eHg8cOJCJiP1+PxcWFvILL7zAGzZs4DFjxnC/fv04MzOT9+3bx5MmTWJVVfncc8/lfv36yS/y5MmT+de//jUHg0EZ8EpKStjtdstK6PF4+JJLLmFN03jo0KE8btw4XrFiBWdmZvKUKVO4V69e7PP5+K677uKePXvKMnu9Xl66dKl8rfT0dF61ahVnZ2fLyi9COhHx0KFDOT8/n4cNG2Yo8/Tp0zk7O1uGZn14Frdrr72Wzz77bMN9kyZN4m7dunF2drahzEuWLGG3281FRUU8dOhQw4+g/gcuLS2N09LSeM6cOTF/YMTn0atXLx48eDB/+OGHPHXqVM7Pz+du3boxUUN4Fp+HKHtGRkbMHyLx2rm5uVxYWMi9evWSgeL000/n3NxcDgQCMZ+jv4kfMfFvsU/04SQnJ4eJiDds2MClpaWsqir369evxY908x/sn/3sZxwMBmO+biAQ4L59+8p/H3/88YbX1O+35kGp+YHL7XYb7svNzeXevXtzIBDg1157TdZVRVG4V69ebX6e4jPQn8CIOqiqKrvdbj7zzDPZ4/HwiBEj5PMGDBgQ86RH/Ni6XC7D3/UH4LFjx3KfPn3Y7/ezqqr85ptv8rRp01jTNFkn9OXUB3RN01rs5x49erCiKPJz6927t9yHd955J3s8HnkgivVZiJNM/X2xDsrFxcWy7ixatIgHDhxoOEGN9RmPHTtWvu6ECRNaPCYnJ4f79OnDI0aM4KKiIvZ4PLxkyRLOz8+P+X0Wn2F2djb36NGDPR5Pq9+ZwsJC9vl88vuWkZHBt956K2dmZsZ8vPhO3nvvvfIz/uEPf9hiH6qqyl6vlzMyMuT34oQTTuBx48YZ9kNbN1GGWN+VQYMGcU5OjvwdEccej8fD3bt3N3yXm79WWloajxs3Tv47Ly/PsH8GDRok///+++/nc845h9PT0w3lEJ+xuG/QoEEtvpeqqvLYsWPlYy+++GL+8MMP+Te/+Q0TEb/yyit8zjnncE5OjtyO2+3mvLw87tGjh3wdVVUNvwuiTojneL1evvjii+Vv8WmnncYbN27k6dOnG74ror6LuuD3+3nmzJnyu0FEfNZZZ/FJJ50kn7Ny5Ur+9a9/LQPu2rVrecuWLfK4PGDAAPn9E5+Hqqo8YsQIXr58ubx/2rRpfNZZZ8nyEhFv3ryZTz31VO7fvz//4x//4K+//pqfeuopDgQCPGbMGFYURf4+qKrKOTk5/N577/ELL7zAaWlpfMopp/BNN93EM2fO5PT0dL755pvlfuzVqxdffPHFhgxzySWXsKIo3KNHD77uuut46NCh8tipaRr/5S9/4WXLlrGmaXzCCSdwr169+Fe/+hVnZGSwoig8dOhQ/vLLL/myyy5jTdN4zZo1Mht5PB7OysqSQfy0007j8ePHt8hGY8aM4auuuor37dvHq1evZrfbzStXruSPPvqIr7rqKg4Gg1xeXs7MzOeee67cp4sWLWKihmC6efNmVlWVH374Yf7qq6/4b3/7Gw8bNozPO++8Flnw66+/5oKCAj755JMNwTQajfKJJ57IJ598Mm/dupU/+eQTvvrqq1vkxGPpUDBtbv/+/UxE/NZbbzEzc0VFBbvdbn7hhRfkYz7++GMmIt6yZUur25k7dy5PmjSpzW0PHjyYNU1r17a//vprJiLevn17i22L7a5YsYKJiHfv3s2KovDJJ5/c6naj0Sjn5eXxL3/5S/mYE088kYmI//CHPzAz86233sqDBw9mIuKZM2fyXXfdJb+EscqclpbWYrvDhw+XX5bi4mJmZsOX9/bbb+esrCyuqKiQP7DMzMXFxTx//nwmIr7rrrs4KysrZpl79+4tfziYmQcMGCCDwFtvvcWhUMhQ5ocffphdLpfc9sCBA1ts99RTT+WZM2cyUUPIUBSF8/Ly5A/pX//6Vy4oKODbb79dvreHHnqIH374Yc7NzTWUWYTjuro6+YMsws1LL73ERA1BaOLEiYZ9qL8FAgHD5zFw4EDDvhef5fbt2w0/lGK/ERH379/fcH9ubi6fd955rCgKf/jhh0zU1GIQiUSYmTkQCBhaEXw+nwwYsVqmjzvuOFZVla+66qqYZ/Bff/015+Xl8bJly+TnKj7TrKysFgeyBx54gFVV5f/4j/9gIpIHbXGyRETyoHT//fezoii8dOlSvuGGG5iIuKioyLA9/a15UBJlLyoqkge2tLQ0vvDCC9nr9bLL5eLjjz+eCwoKeMCAAa0GhEGDBvGdd97Je/bskWUVwVe85hlnnCHrs6Zp7HK5OBKJ8E9+8hPDttLT07l79+6y/H6/3/Be8vLy5L4V30FN03jp0qW8atUqwxWPk046iUePHi3Dibj/gQceMNQzUWZxIqwoiqznLpdL1uf9+/fLfTdkyBDD/tPfVFXl008/nbdu3Sq3IcLQzp075eOWLl3K48ePZyLim266iYmI8/Pz5XdFfHbTp0+X+/zGG29sEaTmzJnDiqLwP/7xD7kPmZkvu+wyWYfF78xPf/pTWUaXyyVDUGu35t/NwsJC+dshPtNgMCjrnbg99thj8u/NyztkyBD+y1/+wkRNYYiI+PXXX5e/Sc2/u2lpaXzNNde0uK9bt26GOiRC/xtvvCHrhqqqch+edNJJ8vMIBAKsKApv2bJF1i1RVv371teNHj16yBNpr9drOF7NmDFD7u+JEyey1+uVJwfiOfoT9SFDhvBpp50mfyP79+/PzMxvvvkmEzW1fpWUlMjnXH755axpGs+dO9fwXXv11VflY/r168e9evXilStXGsqzZMkSJiJ+5JFHmJn51VdfNXy3/vu//1v+vziZcLlcvHjxYnl8+dOf/sSrVq2S+/aee+5hZpb7Zvv27fLzGD16NOfn57OmafKYqq8LW7Zs4RNOOEFu9/TTTzfUiUOHDnFFRQUrisKvv/663O706dNlq6v4bE466ST2er3yOH7++efzjBkzmJn58ccfN4TC+fPnc58+ffihhx4y7L9PP/2UiYjHjx/PzCyPVX6/nwOBAD/22GPMzDxv3jxWFEXmAX1Dgsga+tdnZr700kuZiHjXrl3y/UYiEe7RowevWbNGHv/79u3L119/PTMzjx8/nufNmye3EYlEOD8/X/7WnXrqqbxx40YmIv7zn/8sPzPx/dF75JFHuKCgwHBfOBzmH/zgB/zYY4/xrFmzDMFUfBa7du0yvL6+vO3RpT6mlZWVRETUrVs3IiLatm0b1dfXU2lpqXzMkCFDqKioiLZs2dLmdsQ2Ym07Go3S999/T5FIpMvbFtsV6+j+6U9/ImamCy64oNXtfv3111RWViZfe+/evfTVV1+R1+uVj9myZQt1796diIgWLFhAn376qdxe8zJ3796dIpFIi+1WVVVRTk4O5eTkUF1dHRERTZ48mcLhMBERHTp0iIiI/uu//ouIiE466SSKRqNUXV1NgwcPpqKiIvriiy8oFAqRqqqGbRMR1dXVkdvtpkgkQkRE+/bto549e8rPecWKFfKxw4YNo//+7/8mj8dDgwcPpqysLKqqqoq53TfffJPS09Plv0OhELlcLiIi2rx5M3333Xf05ZdfEhFRNBqlRx99lJ566ikqLS2VZa6rq6O5c+dScXExeTweGjNmDBERlZWVERFReXk5ERH5fD75WrEmUWZm+XlkZWXRoUOHSFEUUhSFfve735Hf7yciov3799Nnn31GiqLI5+7atYuIiDIyMgzbLC8vp5deeomYmb799lvKycmRn6GmabRu3ToaMmSI3E/iM6itrZX/39xnn31G0WiUtm7dSjU1NaSqDV/FtLQ0IiLq168flZWV0dNPP0379+8nbjiJJEVRZB0W75eI6OWXX6ahQ4fSunXriIho+PDh8vPu27evLCsR0e23307MTGeddRb17t2biIgKCwvl9pqvCX306FHDv7/44guKRqNUVVVFu3fvJk3T6OjRo/T8889TXV0d5ebmUl1dHX333XeyHuiJ9/rvf/+bHnjgASouLpZ/i0QipKoqDRs2jDRNo4MHD1JdXR2pqkqRSITcbjcREf3tb39rUUav1yv3ZzQaNfxd1KOvvvqKPB4PZWVlkcvlooULF9LcuXMN+3zLli20fft2ikajpGkaeTweIiJ6+OGH5WOOHDkiX2fbtm1EROTxeCg3N5fS0tIoHA7T3LlzKT8/n95++21ZnkmTJsn9Jz4HIRqN0qZNm+ikk04iIqJwOEy1tbWkKAodf/zx1L17d1JVlRYuXEhbt24lIqIJEyYQEZGiKHTw4EEiIlnv3nvvPfkaa9eupWg0aqjvTz75JHm9Xrr//vspGAxSfX09KYoivwdiv9TU1NBTTz0lyzh8+HB65513iIgoJyeHYnn55ZfpjDPOoEAgQEQNv5nit0N8d4gafoP0fve738m62Hwffv755/Szn/1Mvkfx/T/jjDOorKyMiouL5esJ6enpht9iooa6kp2dTS+++KK8T/wuDBw4kIqKisjn81E0GqW5c+dSTU0Nffrpp/JzPXLkCDEzzZgxg1RVpcOHD8vPVb8+ezQapZUrVxIRkdvtpn//+99ERPL3SDxHfC+Zmf7v//6P6urq6MCBA7KsREQff/yx3O5nn31G7777Ln3xxRdERPTdd9/RjBkz5G9kdnY27d69W/5bfK75+fn01ltvyfuys7PlcYao4dhYU1Mjv2PhcJiGDBki69B1111HiqLQ7t27DZ/nFVdcIf//888/l+/lkUcekeWfMWMG3XDDDfI9i313yimnEBHR6NGj6c0336SNGzfSrl27KDs7myKRCAWDQcNn27t3b/rd735Hn332GRERXX311bRx40YiMtZFn89HiqLQGWecQYqi0Jo1a+jtt9+mUChE48ePp507dxJRw3c9MzOT/vrXv9KHH35ImzdvpilTpsjtRCIR+uc//0mKotBtt91meN+KotATTzwhP8Ps7Gz6/vvv6emnn6ZAIEDMTLW1tVRSUkJERBUVFcTMdOqppxJRw3HB7/cbsobf76fNmzfL16ioqJDvR1BVlbxeL23evFke/10uFz399NOUk5NDW7dupX379snfKFVVqbS0lF577TW699576Xe/+12L3x4iopKSEtqzZw+98sorxMxUXl5O69evp7PPPtvwuHvvvZd69uxJc+bMabEN8Vm0Vt52a3eEbSYSifDUqVN54sSJ8r6nn36aPR5Pi8eOGzeOb7311pjbeeedd9jlcvGrr77a6rYfeOABTktLa/e2RYvp448/bti2frvi7EpcDmtru++88w4TNfSlEK0RiqLwxIkT+cILL2Rm5qKiItlUz8w8cOBAednmyJEjhm3369ePPR6P3O7evXuZmblXr16cm5vLiqLwKaecwszM1dXVhhYfcVMURX422dnZXF5ezuPGjeMpU6ZwIBCQLRFi2/feey8TEffp04fdbrd87QEDBrDH45GtevpWv6FDh8pt5+fnc/fu3eXnJrbbr18/WebjjjtOlk1RFO7WrVurl9bcbjd/9913ssyihWv69OnMzPzJJ58YHi/KpSgKjx8/nidOnCgvT7rdbsMlK32Zs7OzOT8/nwcMGMBDhw7lPn36GD5Dsd3i4mIOBALcp08fw+U4cWt+KW3MmDGGy0HNH+/1ennEiBFy27E+A03TeMGCBbIsRCRbkcXlRtEaIN5brBZN/SXGWLdZs2axpmly2+K2d+9eQytg88+6+f83v4nPUpRVtDoNGTJE1r/mra2tfV7N68Y333zDHo+Hhw4dyn6/31COs846S7YE6i8lt9Z1oPltwoQJnJ+fz16vl71er2zZEH+fPHlyzDKOGzcu5mVz/X546KGHOD8/P2YrOBHx1VdfLfe9/v62+mP36NFDftf0rcpExN988w0XFRXJS/vN65fYP7G6m+Tn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crkM+0T0E23tsxD1oXkrrb48J5xwgpw9QdO0FlNFuVwu+ZsmbsFg0DAjh7j17t1bfpbFxcVcWlpqOBlVVZXPO++8FlcNxO9k37592ev1tphG7LTTTjPMbHH++efLFl2ihmPEM888w8cff7z8fJufBLvdbj7uuOMMn0X37t1lyFQUhWfPnm3ogqJpGj/77LPytQKBAJ944onysxX7bPDgwXzDDTewqqr8wx/+kFeuXMnnnHOO4fUffvhhDgQC8qS/W7dufMcdd3BGRoacclG0AouT6N69e/Nzzz3HOTk5fM011xgaEf74xz/y9u3bubq6mvv06cO33nora5rGfr+f77zzTv7FL37Bd911F5911ll85513cv/+/VlVVTn3+SOPPMLnn38+a5rGWVlZsm/3ihUreMCAATx69Gh+++23efz48ayqKmdkZPDatWt53759/MUXX/CiRYvkianIFcXFxTIXbdmyhe+44w5+//33+euvv5YnQIMHD+Z//vOffPXVV3MwGDTMzS5mUnj44YeZqKHL4j333CNnE/nyyy958+bNPHbsWDnbQCyxLuU///zz/Oabb/KXX37JL774Ivfp04fPP//8jkTNjgXT1n6kHn/8cfkYMQl+dnY2BwIBPu+883jfvn3y7yIQduZ22WWXtbntWH1/2nubNGlSq9u9/PLLO7y9YDDIhYWFMT+PFStWyGAq5hHr6q2oqIj37dvHjz/+eKt97Lqy7ZtuusnQby0et27duskyx3O7RA0/wDfddFOb0xV15uZ2u/mkk07iCy+8MO5lNus2efJk3rdvHz/00ENx37aqqobL9fG69ejRg3v37t1q396u3BRF4dzc3HZdirbLTZwEHGtgUGduBQUFcv5Iu91ae79paWm8cOHCuL+Ooig8cuTIFtNOxeNWVFTE1157bVwWHtHf8vPz+aKLLjKMY4j3MUB/O1a/czGAqa1FZ1RV5YKCAtmliaihlbqtifOJGsJ7YWFhzP7R4tarVy+ePn26oUvWwIEDedWqVS0Gp+nL079/f77zzjvluJPmtzfffJP79OnDkydPPuZn5PV6OT09nT0eD2dmZsquUrFubrebu3fv3mJ8S0duubm53K1bN/Z6vTxw4EDZ7cXj8fD48eP573//uyHLzZo1K+Z2ZsyYwcXFxez3+7lXr148Y8YM/te//tVqJowVTB9++GF54lRUVMR33XVXq62prVEaAycAAAAAgKW6NI8pAAAAAEC8IJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALSCYAgAAAIAtIJgCAAAAgC0gmAIAAACALfw/J8+MicwI/YAAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "x = [r['date_added'] for r in recs]\n", "y = [int(r['is_valid']) for r in recs]\n", @@ -2161,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "18", + "id": "19", "metadata": {}, "source": [ "\n", @@ -2170,7 +262,7 @@ }, { "cell_type": "markdown", - "id": "19", + "id": "20", "metadata": {}, "source": [ "### Example of one record" @@ -2178,57 +270,10 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "20", + "execution_count": null, + "id": "21", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "Message text from log:\n", - "> investigating banding issue" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "One full record (the last one retrieved):\n", - "> {'id': 'f9a4b932-18e9-47db-9b7d-a2fbe3c15e70', 'site_id': 'tucson', 'obs_id': 'AT_O_20221115_000019', 'instrument': 'LATISS', 'day_obs': 20221115, 'seq_num': 19, 'message_text': 'investigating banding issue', 'level': 10, 'tags': ['background_issue'], 'urls': [], 'user_id': 'admin@love1.tu.lsst.org', 'user_agent': 'LOVE', 'is_human': True, 'is_valid': True, 'exposure_flag': 'questionable', 'date_added': '2022-11-16T04:57:30.954849', 'date_invalidated': None, 'parent_id': None}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "{'id': 'f9a4b932-18e9-47db-9b7d-a2fbe3c15e70',\n", - " 'site_id': 'tucson',\n", - " 'obs_id': 'AT_O_20221115_000019',\n", - " 'instrument': 'LATISS',\n", - " 'day_obs': 20221115,\n", - " 'seq_num': 19,\n", - " 'message_text': 'investigating banding issue',\n", - " 'level': 10,\n", - " 'tags': ['background_issue'],\n", - " 'urls': [],\n", - " 'user_id': 'admin@love1.tu.lsst.org',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'exposure_flag': 'questionable',\n", - " 'date_added': '2022-11-16T04:57:30.954849',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None}" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rec = recs[-1]\n", "\n", @@ -2244,7 +289,7 @@ }, { "cell_type": "markdown", - "id": "23", + "id": "22", "metadata": {}, "source": [ "\n", @@ -2253,89 +298,10 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "22", + "execution_count": null, + "id": "23", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 0\n", - "SHELL /bin/bash\n", - "SESSION_MANAGER local/chimp20:@/tmp/.ICE-unix/6143,unix/chimp2...\n", - "QT_ACCESSIBILITY 1\n", - "XDG_CONFIG_DIRS /etc/xdg/xdg-mate:/etc/xdg\n", - "XDG_SESSION_PATH /org/freedesktop/DisplayManager/Session0\n", - "GTK_IM_MODULE ibus\n", - "LANGUAGE en_US\n", - "TERMCAP \n", - "SSH_AUTH_SOCK /run/user/1000/keyring/ssh\n", - "INSIDE_EMACS 29.4,comint\n", - "XMODIFIERS @im=ibus\n", - "DESKTOP_SESSION mate\n", - "EDITOR /usr/bin/emacsclient\n", - "GTK_MODULES appmenu-gtk-module:gail:atk-bridge:canberra-gt...\n", - "XDG_SEAT seat0\n", - "MATE_DESKTOP_SESSION_ID this-is-deprecated\n", - "SNAP_EUID 1000\n", - "PWD /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "GSETTINGS_SCHEMA_DIR /home/pothiers/snap/emacs/common/.local/share/...\n", - "XDG_SESSION_DESKTOP mate\n", - "LOGNAME pothiers\n", - "QT_QPA_PLATFORMTHEME gtk2\n", - "XDG_SESSION_TYPE x11\n", - "GPG_AGENT_INFO /run/user/1000/gnupg/S.gpg-agent:0:1\n", - "XAUTHORITY /home/pothiers/.Xauthority\n", - "XDG_GREETER_DATA_DIR /var/lib/lightdm-data/pothiers\n", - "GDM_LANG en_US\n", - "HOME /home/pothiers\n", - "LANG en_US.UTF-8\n", - "LS_COLORS \n", - "XDG_CURRENT_DESKTOP MATE\n", - "COLUMNS 80\n", - "EMACS_SNAP_DIR /snap/emacs/2504\n", - "VIRTUAL_ENV /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "XDG_SEAT_PATH /org/freedesktop/DisplayManager/Seat0\n", - "SNAP_UID 1000\n", - "CLUTTER_IM_MODULE ibus\n", - "LESSCLOSE /usr/bin/lesspipe %s %s\n", - "XDG_SESSION_CLASS user\n", - "TERM xterm-color\n", - "GTK_OVERLAY_SCROLLING 0\n", - "LESSOPEN | /usr/bin/lesspipe %s\n", - "USER pothiers\n", - "GIT_PAGER cat\n", - "DISPLAY :0\n", - "SHLVL 1\n", - "QT_IM_MODULE ibus\n", - "XDG_VTNR 7\n", - "UBUNTU_MENUPROXY 1\n", - "XDG_SESSION_ID c2\n", - "VIRTUAL_ENV_PROMPT (venv) \n", - "XDG_RUNTIME_DIR /run/user/1000\n", - "COMPIZ_CONFIG_PROFILE mate\n", - "PS1 (venv) ${debian_chroot:+($debian_chroot)}\\u@\\h...\n", - "XDG_DATA_DIRS /snap/emacs/2504/usr/share:/usr/share/mate:/us...\n", - "PATH /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "GDMSESSION mate\n", - "DBUS_SESSION_BUS_ADDRESS unix:path=/run/user/1000/bus\n", - "QT_FONT_DPI 96\n", - "QT_SCALE_FACTOR 1\n", - "GIO_LAUNCHED_DESKTOP_FILE_PID 19241\n", - "OLDPWD /home/pothiers/sandbox/ts_logging_and_reporting\n", - "_ /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "JPY_SESSION_NAME /home/pothiers/sandbox/ts_logging_and_reportin...\n", - "JPY_PARENT_PID 431334\n", - "PYDEVD_USE_FRAME_EVAL NO\n", - "CLICOLOR 1\n", - "FORCE_COLOR 1\n", - "CLICOLOR_FORCE 1\n", - "PAGER cat\n", - "MPLBACKEND module://matplotlib_inline.backend_inline\n" - ] - } - ], + "outputs": [], "source": [ "#EXTERNAL_INSTANCE_URL\n", "ed = dict(os.environ.items())\n", diff --git a/notebooks_tsqr/narrativelog.ipynb b/notebooks_tsqr/narrativelog.ipynb index 58d7323..62c0bdc 100644 --- a/notebooks_tsqr/narrativelog.ipynb +++ b/notebooks_tsqr/narrativelog.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0", "metadata": {}, "outputs": [], @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "2", "metadata": {}, "outputs": [], @@ -41,21 +41,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://tucson-teststand.lsst.codes/narrativelog'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", "log_name = 'narrativelog'\n", @@ -83,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "5", "metadata": { "jupyter": { @@ -124,19 +113,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attempt to get logs from url='https://tucson-teststand.lsst.codes/narrativelog/messages?is_human=either&is_valid=either&limit=999'\n", - "Retrieved 138 records, each with numf=24 fields.\n" - ] - } - ], + "outputs": [], "source": [ "# TODO Often fails on first request. Find out why!\n", "try:\n", @@ -182,168 +162,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "10", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Field Name
0time_lost_type
1subsystems
2cscs
3components
4primary_software_components
5site_id
6level
7date_added
8date_end
9date_invalidated
10is_valid
11id
12primary_hardware_components
13is_human
14message_text
15user_agent
16parent_id
17time_lost
18category
19user_id
20date_begin
21systems
22tags
23urls
\n", - "
" - ], - "text/plain": [ - " Field Name\n", - "0 time_lost_type\n", - "1 subsystems\n", - "2 cscs\n", - "3 components\n", - "4 primary_software_components\n", - "5 site_id\n", - "6 level\n", - "7 date_added\n", - "8 date_end\n", - "9 date_invalidated\n", - "10 is_valid\n", - "11 id\n", - "12 primary_hardware_components\n", - "13 is_human\n", - "14 message_text\n", - "15 user_agent\n", - "16 parent_id\n", - "17 time_lost\n", - "18 category\n", - "19 user_id\n", - "20 date_begin\n", - "21 systems\n", - "22 tags\n", - "23 urls" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.DataFrame(flds, columns=['Field Name'])" ] @@ -359,141 +181,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "12", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
012
time_lost_typefaultNoneNone
is_humanTrueFalseNone
level1000None
subsystemsNoneNoneNone
cscsNoneNoneNone
categoryNoneNoneNone
systemsNoneNoneNone
componentsNoneNoneNone
user_agentstringLOVEmake_log_entry
primary_software_componentsNoneNoneNone
site_idtucsonNoneNone
is_validTrueFalseNone
primary_hardware_componentsNoneNoneNone
\n", - "
" - ], - "text/plain": [ - " 0 1 2\n", - "time_lost_type fault None None\n", - "is_human True False None\n", - "level 100 0 None\n", - "subsystems None None None\n", - "cscs None None None\n", - "category None None None\n", - "systems None None None\n", - "components None None None\n", - "user_agent string LOVE make_log_entry\n", - "primary_software_components None None None\n", - "site_id tucson None None\n", - "is_valid True False None\n", - "primary_hardware_components None None None" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.DataFrame.from_dict(facets, orient='index')" ] @@ -509,149 +200,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "14", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table available as CSV file: \n" - ] - }, - { - "data": { - "text/html": [ - "tl.csv
" - ], - "text/plain": [ - "/home/pothiers/sandbox/ts_logging_and_reporting/notebooks_tsqr/tl.csv" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
date_addedtime_losttime_lost_type
02024-08-15T17:54:06.5674180.00None
12023-01-19T22:57:39.5612930.00None
22024-08-16T14:50:09.5070730.00None
32023-07-19T15:28:22.02790024.00None
42024-08-15T18:08:13.5480590.00None
............
1332022-11-30T02:19:07.3167850.00None
1342024-08-16T15:03:39.9964730.00None
1352023-05-09T17:26:25.05248724.01None
1362024-08-15T20:02:54.2999980.00None
1372024-08-23T18:16:32.7167420.00fault
\n", - "

138 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " date_added time_lost time_lost_type\n", - "0 2024-08-15T17:54:06.567418 0.00 None\n", - "1 2023-01-19T22:57:39.561293 0.00 None\n", - "2 2024-08-16T14:50:09.507073 0.00 None\n", - "3 2023-07-19T15:28:22.027900 24.00 None\n", - "4 2024-08-15T18:08:13.548059 0.00 None\n", - ".. ... ... ...\n", - "133 2022-11-30T02:19:07.316785 0.00 None\n", - "134 2024-08-16T15:03:39.996473 0.00 None\n", - "135 2023-05-09T17:26:25.052487 24.01 None\n", - "136 2024-08-15T20:02:54.299998 0.00 None\n", - "137 2024-08-23T18:16:32.716742 0.00 fault\n", - "\n", - "[138 rows x 3 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cols = ['date_added', 'time_lost', 'time_lost_type']\n", "df = pd.DataFrame(recs)[cols]\n", @@ -667,180 +219,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "15", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
message_texttagsuser_idcomponentsdate_end
0Wubba. Using do_makeLogEntry; vr=0.1[watcher, alarm]admin@love1.tu.lsst.orgNone2024-08-15T12:44:06.456000
1[]admin@love1.tu.lsst.orgNone2023-01-19T22:50:03.167000
2Wubba. Using do_makeLogEntry {vr=}[watcher, alarm, wubba]admin@love1.tu.lsst.orgNone2024-08-16T14:49:32.376667
3Narrative log test[observatorysoftwaretools, love]admin@love1.tu.lsst.orgNone2023-07-19T15:24:01.754000
4Wubba. Using do_makeLogEntry; vr=0.1[watcher, alarm]admin@love1.tu.lsst.orgNone2024-08-15T12:44:06.456000
..................
133ComCam is whack.[]admin@love1.tu.lsst.orgNone2022-11-30T02:17:35.179000
134Wubba. Using do_makeLogEntry {vr=}[watcher, alarm, wubba]admin@love1.tu.lsst.orgNone2024-08-16T15:03:02.869590
135Inria narrative log test 3[observatorysoftwaretools, love]admin@love1.tu.lsst.orgNone2023-05-09T17:25:33.463000
136Wubba. Using do_makeLogEntry; vr=0.2[watcher, alarm]admin@love1.tu.lsst.orgNone2024-08-15T12:54:06.456000
137Testing ampersan &Test&\\r\\n[]saranda@tucson-teststand.lsst.codesNone2024-08-23T18:15:55.678000
\n", - "

138 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " message_text tags \\\n", - "0 Wubba. Using do_makeLogEntry; vr=0.1 [watcher, alarm] \n", - "1 [] \n", - "2 Wubba. Using do_makeLogEntry {vr=} [watcher, alarm, wubba] \n", - "3 Narrative log test [observatorysoftwaretools, love] \n", - "4 Wubba. Using do_makeLogEntry; vr=0.1 [watcher, alarm] \n", - ".. ... ... \n", - "133 ComCam is whack. [] \n", - "134 Wubba. Using do_makeLogEntry {vr=} [watcher, alarm, wubba] \n", - "135 Inria narrative log test 3 [observatorysoftwaretools, love] \n", - "136 Wubba. Using do_makeLogEntry; vr=0.2 [watcher, alarm] \n", - "137 Testing ampersan &Test&\\r\\n [] \n", - "\n", - " user_id components \\\n", - "0 admin@love1.tu.lsst.org None \n", - "1 admin@love1.tu.lsst.org None \n", - "2 admin@love1.tu.lsst.org None \n", - "3 admin@love1.tu.lsst.org None \n", - "4 admin@love1.tu.lsst.org None \n", - ".. ... ... \n", - "133 admin@love1.tu.lsst.org None \n", - "134 admin@love1.tu.lsst.org None \n", - "135 admin@love1.tu.lsst.org None \n", - "136 admin@love1.tu.lsst.org None \n", - "137 saranda@tucson-teststand.lsst.codes None \n", - "\n", - " date_end \n", - "0 2024-08-15T12:44:06.456000 \n", - "1 2023-01-19T22:50:03.167000 \n", - "2 2024-08-16T14:49:32.376667 \n", - "3 2023-07-19T15:24:01.754000 \n", - "4 2024-08-15T12:44:06.456000 \n", - ".. ... \n", - "133 2022-11-30T02:17:35.179000 \n", - "134 2024-08-16T15:03:02.869590 \n", - "135 2023-05-09T17:25:33.463000 \n", - "136 2024-08-15T12:54:06.456000 \n", - "137 2024-08-23T18:15:55.678000 \n", - "\n", - "[138 rows x 5 columns]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cols = ['message_text','tags','user_id', 'components','date_end']\n", "df = pd.DataFrame(recs, columns=cols)\n", @@ -858,21 +240,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "17", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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6lOf0q5du2LW6evr06pVq1RVVaXS0lKtWLFCbW1tMes0NTVp+fLlKi4uVnV1te68804NDQ1l86VgDJhtTO0lpiGSKQAArsj5YLp582atWrVK27Zt08aNGzU4OKglS5aop6fHWueOO+7Q008/rSeeeEKbN29Wc3OzPv3pT1v3B4NBLV++XAMDA9qyZYseffRRPfLII7rnnnvG4iUhi8wxS/Po/AQAgOvyxnoH3Pbcc8/FXH/kkUdUXV2tHTt26IorrlBHR4d+9KMfaf369frYxz4mSXr44Yd17rnnatu2bbrsssv0m9/8Ru+++65eeOEF1dTU6MILL9TXv/513XXXXfra174mv98/Fi8NWWC2J/V6PfJ6wtX4QYIpAACuyPkS03gdHR2SpMrKSknSjh07NDg4qMWLF1vrzJkzRzNmzNDWrVslSVu3btW8efNUU1NjrbN06VJ1dnbqnXfeSfo8/f396uzsjFlw+jFDqNfjkdcTLjUllwIA4I4JFUxDoZC+9KUvadGiRTr//PMlSa2trfL7/aqoqIhZt6amRq2trdY69lBq3m/el8y6detUXl5uLfX19aP8apANZgj1eTzyRqrz6ZUPAIA7JlQwXbVqld5++209/vjjrj/X2rVr1dHRYS0HDx50/Tkx+swQ6vFIZjNT2pgCAOCOnG9jalq9erU2bNigl19+WdOnT7dur62t1cDAgNrb22NKTdva2lRbW2ut88orr8Rsz+y1b64Tr6CgQAUFBaP8KpBtZgj1eT3yRaryQ6Gx3CMAAHJXzpeYGoah1atX68knn9SLL76oWbNmxdy/YMEC5efna9OmTdZtu3btUlNTkxobGyVJjY2N2rlzpw4fPmyts3HjRgUCAc2dOzc7LwRjIpSkjSklpgAAuCPnS0xXrVql9evX65e//KXKysqsNqHl5eUqKipSeXm5brrpJq1Zs0aVlZUKBAK6/fbb1djYqMsuu0yStGTJEs2dO1ef//zndf/996u1tVV33323Vq1aRalojjNLR71eWxtTgikAAK7I+WD64IMPSpKuvPLKmNsffvhhfeELX5Akfec735HX69WKFSvU39+vpUuX6oc//KG1rs/n04YNG3TbbbepsbFRJSUlWrlype67775svQyMkWiv/GgbU4NgCgCAK3I+mGYSIgoLC/XAAw/ogQcecFynoaFBzzzzzGjuGk4D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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "x = [r['date_added'] for r in recs]\n", "y = [r['time_lost'] for r in recs]\n", @@ -899,63 +270,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "20", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "Message text from log:\n", - "> Testing ampersan &Test&\r\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "One full record (the last one retrieved):\n", - "> {'id': 'ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5', 'site_id': 'tucson', 'message_text': 'Testing ampersan &Test&\\r\\n', 'level': 0, 'tags': [], 'urls': [], 'time_lost': 0.0, 'date_begin': '2024-08-23T18:15:55.678000', 'user_id': 'saranda@tucson-teststand.lsst.codes', 'user_agent': 'LOVE', 'is_human': True, 'is_valid': True, 'date_added': '2024-08-23T18:16:32.716742', 'date_invalidated': None, 'parent_id': None, 'systems': None, 'subsystems': None, 'cscs': None, 'date_end': '2024-08-23T18:15:55.678000', 'components': None, 'primary_software_components': ['None'], 'primary_hardware_components': ['None'], 'category': 'None', 'time_lost_type': 'fault'}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "{'id': 'ffc0ff27-76a3-4364-b3d3-05ca6aab0fd5',\n", - " 'site_id': 'tucson',\n", - " 'message_text': 'Testing ampersan &Test&\\r\\n',\n", - " 'level': 0,\n", - " 'tags': [],\n", - " 'urls': [],\n", - " 'time_lost': 0.0,\n", - " 'date_begin': '2024-08-23T18:15:55.678000',\n", - " 'user_id': 'saranda@tucson-teststand.lsst.codes',\n", - " 'user_agent': 'LOVE',\n", - " 'is_human': True,\n", - " 'is_valid': True,\n", - " 'date_added': '2024-08-23T18:16:32.716742',\n", - " 'date_invalidated': None,\n", - " 'parent_id': None,\n", - " 'systems': None,\n", - " 'subsystems': None,\n", - " 'cscs': None,\n", - " 'date_end': '2024-08-23T18:15:55.678000',\n", - " 'components': None,\n", - " 'primary_software_components': ['None'],\n", - " 'primary_hardware_components': ['None'],\n", - " 'category': 'None',\n", - " 'time_lost_type': 'fault'}" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rec = recs[-1]\n", "\n", @@ -971,7 +289,7 @@ }, { "cell_type": "markdown", - "id": "22", + "id": "21", "metadata": {}, "source": [ "\n", @@ -981,7 +299,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23", + "id": "22", "metadata": {}, "outputs": [], "source": [] From 2faafac720a0e0f0f2c0580172204e22865f78f2 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Thu, 29 Aug 2024 09:39:24 -0700 Subject: [PATCH 15/17] WIP --- notebooks_tsqr/TEMPLATE_logrep.ipynb | 9 +- notebooks_tsqr/TEMPLATE_logrep.yaml | 5 +- notebooks_tsqr/efd.ipynb | 356 +++++++++++++++++++++++++ notebooks_tsqr/efd.yaml | 19 ++ notebooks_tsqr/exposurelog.ipynb | 31 +-- notebooks_tsqr/narrativelog.ipynb | 60 ++++- notebooks_tsqr/sources_dashboard.ipynb | 327 +++++++++++++++++++++++ 7 files changed, 777 insertions(+), 30 deletions(-) create mode 100644 notebooks_tsqr/efd.ipynb create mode 100644 notebooks_tsqr/efd.yaml create mode 100644 notebooks_tsqr/sources_dashboard.ipynb diff --git a/notebooks_tsqr/TEMPLATE_logrep.ipynb b/notebooks_tsqr/TEMPLATE_logrep.ipynb index d0fd168..7ba5d5f 100644 --- a/notebooks_tsqr/TEMPLATE_logrep.ipynb +++ b/notebooks_tsqr/TEMPLATE_logrep.ipynb @@ -55,8 +55,13 @@ "\n", "timeout = (float(response_timeout), float(read_timeout))\n", "\n", - "server = os.environ.get('EXTERNAL_INSTANCE_URL', \n", - " 'https://tucson-teststand.lsst.codes')\n", + "# RUNNING_INSIDE_JUPYTERLAB is True when running under Times Square\n", + "\n", + "summit = 'https://summit-lsp.lsst.codes'\n", + "usdf = 'https://usdf-rsp-dev.slac.stanford.edu'\n", + "tucson = 'https://tucson-teststand.lsst.codes'\n", + "server = os.environ.get('EXTERNAL_INSTANCE_URL', usdf)\n", + "\n", "service = f'{server}/{log}'\n", "service" ] diff --git a/notebooks_tsqr/TEMPLATE_logrep.yaml b/notebooks_tsqr/TEMPLATE_logrep.yaml index c6eb836..de6c99f 100644 --- a/notebooks_tsqr/TEMPLATE_logrep.yaml +++ b/notebooks_tsqr/TEMPLATE_logrep.yaml @@ -1,6 +1,9 @@ # For use with a Times Square notebook title: TEMPLATE for LR -description: Prototype 1 +description: > + Copy and rename this ipynb and yaml sidecar into a new + pair of files (.ipynb, .yaml). + The TEMPLATE_* files will eventually be hidden in Times Square. authors: - name: Steve Pothier slack: Steve Pothier diff --git a/notebooks_tsqr/efd.ipynb b/notebooks_tsqr/efd.ipynb new file mode 100644 index 0000000..a65f418 --- /dev/null +++ b/notebooks_tsqr/efd.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters. Set defaults here.\n", + "# Times Square replaces this cell with the user's parameters.\n", + "record_limit = '999'" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "\n", + "## Imports and General Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# Only use packages available in the Rubin Science Platform\n", + "import requests\n", + "from collections import defaultdict\n", + "import pandas as pd\n", + "from pprint import pp, pformat\n", + "from urllib.parse import urlencode\n", + "from IPython.display import FileLink, display_markdown\n", + "from matplotlib import pyplot as plt\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "env = 'usdf_dev' # usdf-dev, tucson, slac, summit\n", + "log_name = 'narrativelog'\n", + "log = log_name\n", + "limit = int(record_limit)\n", + "response_timeout = 3.05 # seconds, how long to wait for connection\n", + "read_timeout = 20 # seconds\n", + "\n", + "timeout = (float(response_timeout), float(read_timeout))\n", + "\n", + "# RUNNING_INSIDE_JUPYTERLAB is True when running under Times Square\n", + "server = os.environ.get('EXTERNAL_INSTANCE_URL', \n", + " 'https://tucson-teststand.lsst.codes')\n", + "service = f'{server}/{log}'\n", + "service" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "\n", + "## Setup Source" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "md = f'### Will retrieve from {service}'\n", + "display_markdown(md, raw=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "recs = None\n", + "ok = True\n", + "\n", + "# is_human=either&is_valid=either&offset=0&limit=50' \n", + "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", + "# tags=love&exclude_tags=ignore_message\n", + "qparams = dict(is_human='either',\n", + " is_valid='either',\n", + " limit=limit,\n", + " )\n", + "qstr = urlencode(qparams)\n", + "url = f'{service}/messages?{qstr}'\n", + "\n", + "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", + " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", + " 'date_invalidated', 'date_begin', 'date_end',\n", + " 'time_lost', # float\n", + " #'systems','subsystems','cscs', # values are lists, special handling\n", + " ])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "display_markdown(f'## Get (up to {limit}) Records', raw=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO Often fails on first request. Find out why!\n", + "try:\n", + " response = requests.get(url, timeout=timeout)\n", + "except:\n", + " pass \n", + " \n", + "try:\n", + " print(f'Attempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " facflds = flds - ignore_fields\n", + " # facets(field) = set(value-1, value-2, ...)\n", + " facets = {fld: set([str(r[fld])\n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + "except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + "numf = len(flds) if ok else 0\n", + "numr = len(recs) if ok else 0\n", + "print(f'Retrieved {numr} records, each with {numf} fields.')" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "\n", + "## Tables of (mostly raw) results" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "### Fields names provided in records from log." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(flds, columns=['Field Name'])" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "### Facets from log records.\n", + "A *facet* is the set all of values found for a field in the retrieved records. Facets are only calculated for some fields." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "display(pd.DataFrame.from_dict(facets, orient='index'))\n", + "display(facets)" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "### Table of selected log record fields.\n", + "Table can be retrieved as CSV file for local use." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "cols = ['date_added', 'time_lost']\n", + "df = pd.DataFrame(recs)[cols]\n", + "\n", + "# Allow download of CSV version of DataFrame\n", + "csvfile = 'tl.csv'\n", + "df.to_csv(csvfile)\n", + "myfile = FileLink(csvfile)\n", + "print('Table available as CSV file: ')\n", + "display(myfile)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(recs)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "\n", + "## Plots from log" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "x = [r['date_added'] for r in recs]\n", + "y = [r['time_lost'] for r in recs]\n", + "plt.plot(x, y) \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "\n", + "## Raw Content Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "20", + "metadata": {}, + "source": [ + "### Example of one record" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "rec = recs[-1]\n", + "\n", + "msg = rec[\"message_text\"]\n", + "md = f'Message text from log:\\n> {msg}'\n", + "display_markdown(md, raw=True)\n", + "\n", + "display(rec)" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "\n", + "## Stakeholder Elicitation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "#EXTERNAL_INSTANCE_URL\n", + "ed = dict(os.environ.items())\n", + "with pd.option_context('display.max_rows', None,):\n", + " print(pd.DataFrame(ed.values(), index=ed.keys()))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks_tsqr/efd.yaml b/notebooks_tsqr/efd.yaml new file mode 100644 index 0000000..de6c99f --- /dev/null +++ b/notebooks_tsqr/efd.yaml @@ -0,0 +1,19 @@ +# For use with a Times Square notebook +title: TEMPLATE for LR +description: > + Copy and rename this ipynb and yaml sidecar into a new + pair of files (.ipynb, .yaml). + The TEMPLATE_* files will eventually be hidden in Times Square. +authors: + - name: Steve Pothier + slack: Steve Pothier +tags: + - reporting + - prototype +parameters: + record_limit: + type: integer + description: Max number of records to output + default: 99 + minimum: 1 + maximum: 9999 diff --git a/notebooks_tsqr/exposurelog.ipynb b/notebooks_tsqr/exposurelog.ipynb index b8ff30b..a8dc90c 100644 --- a/notebooks_tsqr/exposurelog.ipynb +++ b/notebooks_tsqr/exposurelog.ipynb @@ -9,7 +9,7 @@ "source": [ "# Parameters. Set defaults here.\n", "# Times Square replaces this cell with the user's parameters.\n", - "record_limit = '999'" + "record_limit = '9999'" ] }, { @@ -52,8 +52,10 @@ "read_timeout = 20 # seconds\n", "timeout = (float(response_timeout), float(read_timeout))\n", "\n", - "server = os.environ.get('EXTERNAL_INSTANCE_URL', \n", - " 'https://tucson-teststand.lsst.codes')\n", + "summit = 'https://summit-lsp.lsst.codes'\n", + "usdf = 'https://usdf-rsp-dev.slac.stanford.edu'\n", + "tucson = 'https://tucson-teststand.lsst.codes'\n", + "server = os.environ.get('EXTERNAL_INSTANCE_URL', tucson)\n", "log = 'exposurelog'\n", "service = f'{server}/{log}'\n", "service" @@ -78,16 +80,6 @@ "recs = None\n", "ok = True\n", "\n", - "# is_human=either&is_valid=either&offset=0&limit=50' \n", - "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", - "# tags=love&exclude_tags=ignore_message\n", - "qparams = dict(is_human='either',\n", - " is_valid='either',\n", - " limit=limit,\n", - " )\n", - "qstr = urlencode(qparams)\n", - "url = f'{service}/messages?{qstr}'\n", - "\n", "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", " 'date_invalidated', 'date_begin', 'date_end',\n", @@ -112,6 +104,14 @@ "metadata": {}, "outputs": [], "source": [ + "# Endpoint: messages\n", + "\n", + "# is_human=either&is_valid=either&offset=0&limit=50' \n", + "# site_ids=tucson&message_text=wubba&min_level=0&max_level=999&user_ids=spothier&user_agents=LOVE\n", + "# tags=love&exclude_tags=ignore_message\n", + "qstr = urlencode(dict(is_human='either',is_valid='either', limit=limit))\n", + "url = f'{service}/messages?{qstr}'\n", + "\n", "try:\n", " print(f'Attempt to get logs from {url=}')\n", " response = requests.get(url, timeout=timeout)\n", @@ -125,7 +125,7 @@ " for fld in facflds}\n", "except Exception as err:\n", " ok = False\n", - " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + " print(f'ERROR getting {log} from {url=}: {err=}')\n", "numf = len(flds) if ok else 0\n", "numr = len(recs) if ok else 0\n", "print(f'Retrieved {numr} records, each with {numf=} fields.')" @@ -174,7 +174,8 @@ "metadata": {}, "outputs": [], "source": [ - "pd.DataFrame.from_dict(facets, orient='index')" + "display(pd.DataFrame.from_dict(facets, orient='index'))\n", + "facets" ] }, { diff --git a/notebooks_tsqr/narrativelog.ipynb b/notebooks_tsqr/narrativelog.ipynb index 62c0bdc..49a1e11 100644 --- a/notebooks_tsqr/narrativelog.ipynb +++ b/notebooks_tsqr/narrativelog.ipynb @@ -9,7 +9,7 @@ "source": [ "# Parameters. Set defaults here.\n", "# Times Square replaces this cell with the user's parameters.\n", - "record_limit = '999'" + "record_limit = '9999'" ] }, { @@ -55,8 +55,11 @@ "\n", "timeout = (float(response_timeout), float(read_timeout))\n", "\n", - "server = os.environ.get('EXTERNAL_INSTANCE_URL', \n", - " 'https://tucson-teststand.lsst.codes')\n", + "summit = 'https://summit-lsp.lsst.codes'\n", + "usdf = 'https://usdf-rsp-dev.slac.stanford.edu'\n", + "tucson = 'https://tucson-teststand.lsst.codes'\n", + "server = os.environ.get('EXTERNAL_INSTANCE_URL', usdf)\n", + "\n", "service = f'{server}/{log}'\n", "service" ] @@ -74,11 +77,7 @@ "cell_type": "code", "execution_count": null, "id": "5", - "metadata": { - "jupyter": { - "source_hidden": true - } - }, + "metadata": {}, "outputs": [], "source": [ "recs = None\n", @@ -137,7 +136,7 @@ " for fld in facflds}\n", "except Exception as err:\n", " ok = False\n", - " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + " print(f'ERROR getting {log} from {url=}: {err=}')\n", "numf = len(flds) if ok else 0\n", "numr = len(recs) if ok else 0\n", "print(f'Retrieved {numr} records, each with {numf=} fields.')" @@ -186,7 +185,8 @@ "metadata": {}, "outputs": [], "source": [ - "pd.DataFrame.from_dict(facets, orient='index')" + "display(pd.DataFrame.from_dict(facets, orient='index'))\n", + "facets" ] }, { @@ -288,9 +288,45 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "id": "21", "metadata": {}, + "outputs": [], + "source": [ + "neg_lost = [(r['id'],r['time_lost']) for r in recs if r['time_lost'] < 0]\n", + "neg_lost" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "none_str = ['none', 'None']\n", + "unvet = defaultdict(set)\n", + "for r in recs:\n", + " for f in flds:\n", + " if r[f] in none_str:\n", + " unvet[f].add((r['id'], r[f]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "flds" + ] + }, + { + "cell_type": "markdown", + "id": "24", + "metadata": {}, "source": [ "\n", "## Stakeholder Elicitation" @@ -299,7 +335,7 @@ { "cell_type": "code", "execution_count": null, - "id": "22", + "id": "25", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks_tsqr/sources_dashboard.ipynb b/notebooks_tsqr/sources_dashboard.ipynb new file mode 100644 index 0000000..4036bdf --- /dev/null +++ b/notebooks_tsqr/sources_dashboard.ipynb @@ -0,0 +1,327 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Logging and Reporting" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Table of contents\n", + "* [Parameters](#params)\n", + "* [Imports and setup](#imports)\n", + "* [Try every server](#every-server)\n", + "* [Report](#report)" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "\n", + "## Parameters\n", + "The first code cell must contain parameters with string values for compatibility with Times Square.\n", + "\n", + "See: https://rsp.lsst.io/v/usdfdev/guides/times-square/index.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "#Parameters\n", + "env = 'tucson' # usdf-dev, tucson, slac, summit\n", + "record_limit = '9999'\n", + "response_timeout = '3.05' # seconds, how long to wait for connection\n", + "read_timeout = '20' # seconds" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "\n", + "## Imports and General Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "from collections import defaultdict\n", + "import pandas as pd\n", + "from pprint import pp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "limit = int(record_limit)\n", + "timeout = (float(response_timeout), float(read_timeout))\n", + "\n", + "# Env list comes from drop-down menu top of:\n", + "# https://rsp.lsst.io/v/usdfdev/guides/times-square/\n", + "envs = dict(\n", + " #rubin_usdf_dev = '',\n", + " #data_lsst_cloud = '',\n", + " #usdf = '',\n", + " #base_data_facility = '',\n", + " summit = 'https://summit-lsp.lsst.codes',\n", + " usdf_dev = 'https://usdf-rsp-dev.slac.stanford.edu',\n", + " #rubin_idf_int = '',\n", + " tucson = 'https://tucson-teststand.lsst.codes',\n", + ")\n", + "envs" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "\n", + "## Try to access every Server, every Log in our list\n", + "We call the combination of a specific Server and specific Log a \"service\".\n", + "This is a First Look. As such, we don't try to get a useful list of records. \n", + "Instead, we save a few pieces of data from each service. A more tailored web-service call should be done to get useful records. For each service, we save:\n", + "1. The number of records retrieved\n", + "1. The list of fields found in a record (we assume all records from a service have the same fields)\n", + "1. An example of 1-2 records.\n", + "1. The [Facets](https://en.wikipedia.org/wiki/Faceted_search) of the service for all service fields that are not explictly excluded." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "verbose=False\n", + "fields = defaultdict(set) # fields[(env,log)] = {field1, field2, ...}\n", + "examples = defaultdict(list) # examples[(env,log)] = [rec1, rec2]\n", + "results = defaultdict(dict) # results[(env,log)] = dict(server,url, ok, numfields, numrecs)\n", + "facets = defaultdict(dict) # facets[(env,log)] = dict(field) = set(value-1, value-2, ...)\n", + "\n", + "# Dumb! Using same ignore set for all LOGS.\n", + "ignore_fields = set(['tags', 'urls', 'message_text', 'id', 'date_added', \n", + " 'obs_id', 'day_obs', 'seq_num', 'parent_id', 'user_id',\n", + " 'date_invalidated', 'date_begin', 'date_end',\n", + " 'time_lost', # float\n", + " #'systems','subsystems','cscs', # values are lists, special handling\n", + " ])\n", + "for env,server in envs.items():\n", + " ok = True\n", + " try:\n", + " recs = None\n", + " log = 'exposurelog'\n", + " #!url = f'{server}/{log}/messages?is_human=either&is_valid=either&offset=0&{limit=}'\n", + " url = f'{server}/{log}/messages?is_human=either&is_valid=either&{limit=}'\n", + " print(f'\\nAttempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " if verbose:\n", + " print(f'Number of {log} records: {len(recs):,}')\n", + " print(f'Got {log} fields: {flds}')\n", + " print(f'Example record: {recs[0]}') \n", + " fields[(env,log)] = flds\n", + " examples[(env,log)] = recs[:2] \n", + "\n", + " facflds = flds - ignore_fields\n", + " # Fails when r[fld] is a LIST instead of singleton\n", + " # I think when that happens occasionaly, its a BUG in the data! It happens.\n", + " facets[(env,log)] = {fld: set([str(r[fld])\n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + " except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + " numf = len(flds) if ok else 0\n", + " numr = len(recs) if ok else 0\n", + " results[(env,log)] = dict(ok=ok, server=server, url=url,numfields=numf, numrecs=numr)\n", + "\n", + " print()\n", + " try:\n", + " recs = None\n", + " log = 'narrativelog'\n", + " #! url = f'{server}/{log}/messages?is_human=either&is_valid=true&offset=0&{limit=}'\n", + " url = f'{server}/{log}/messages?is_human=either&is_valid=either&{limit=}'\n", + " print(f'\\nAttempt to get logs from {url=}')\n", + " response = requests.get(url, timeout=timeout)\n", + " response.raise_for_status()\n", + " recs = response.json()\n", + " flds = set(recs[0].keys())\n", + " if verbose:\n", + " print(f'Number of {log} records: {len(recs):,}')\n", + " print(f'Got {log} fields: {flds}')\n", + " print(f'Example record: {recs[0]}')\n", + " fields[(env,log)] = flds \n", + " examples[(env,log)] = recs[:2] \n", + "\n", + " facflds = flds - ignore_fields\n", + " # Fails when r[fld] is a LIST instead of singleton\n", + " # I think when that happens occasionaly, its a BUG in the data! It happens.\n", + " # Look for BAD facet values like: {'None', None}\n", + " facets[(env,log)] = {fld: set([r[fld] \n", + " for r in recs if not isinstance(r[fld], list)]) \n", + " for fld in facflds}\n", + " except Exception as err:\n", + " ok = False\n", + " print(f'ERROR getting {log} from {env=} using {url=}: {err=}')\n", + " numf = len(flds) if ok else 0\n", + " numr = len(recs) if ok else 0\n", + " results[(env,log)] = dict(ok=ok, server=server, url=url,numfields=numf, numrecs=numr)" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "\n", + "## Report\n", + "This is a silly report that may be useful for developers. Not so much for astronomers." + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "\n", + "### Success/Failure table" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "show_columns = ['ok', 'server', 'numfields', 'numrecs']\n", + "df = pd.DataFrame(data=dict(results)).T.loc[:,show_columns]\n", + "print(f'Got results from {df[\"ok\"].values.sum()} of {len(df)} env/logs')\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "\n", + "### Field Names" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "print('Field names for each Environment/Log source:')\n", + "for (env,log),flds in fields.items():\n", + " field_names = ', '.join(flds)\n", + " print(f'\\n{env}/{log}: {field_names}')\n", + "#!dict(fields)" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "\n", + "### Facets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "dict(facets)\n", + "for (env,log),flds in facets.items():\n", + " print(f'{env}/{log}:')\n", + " for fld,vals in flds.items():\n", + " print(f' {fld}: \\t{vals}')" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "\n", + "### Example Records" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "for (env,log),recs in examples.items():\n", + " print(f'\\n{env=}, {log=}: ')\n", + " print(' Example records: ')\n", + " pp(recs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c25b8d7b74578cf6d6977f5d3a4eb2f8592a5382 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Thu, 29 Aug 2024 11:38:15 -0700 Subject: [PATCH 16/17] WIP --- notebooks_tsqr/scaffolding.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks_tsqr/scaffolding.org b/notebooks_tsqr/scaffolding.org index 6c1c85a..5033b08 100644 --- a/notebooks_tsqr/scaffolding.org +++ b/notebooks_tsqr/scaffolding.org @@ -14,7 +14,7 @@ + num_recs_in_example + min_date + max_date - + + : # Parameters. Set defaults here. From d1d1e2b7d941b172bda4c9d6ef6c974c8c390496 Mon Sep 17 00:00:00 2001 From: Steve Pothier Date: Thu, 29 Aug 2024 17:59:16 -0700 Subject: [PATCH 17/17] WIP --- notebooks_tsqr/exposurelog.ipynb | 2 +- notebooks_tsqr/narrativelog.ipynb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/notebooks_tsqr/exposurelog.ipynb b/notebooks_tsqr/exposurelog.ipynb index a8dc90c..20b68b7 100644 --- a/notebooks_tsqr/exposurelog.ipynb +++ b/notebooks_tsqr/exposurelog.ipynb @@ -9,7 +9,7 @@ "source": [ "# Parameters. Set defaults here.\n", "# Times Square replaces this cell with the user's parameters.\n", - "record_limit = '9999'" + "record_limit = '99'" ] }, { diff --git a/notebooks_tsqr/narrativelog.ipynb b/notebooks_tsqr/narrativelog.ipynb index 37d9e65..8bbc00a 100644 --- a/notebooks_tsqr/narrativelog.ipynb +++ b/notebooks_tsqr/narrativelog.ipynb @@ -9,7 +9,7 @@ "source": [ "# Parameters. Set defaults here.\n", "# Times Square replaces this cell with the user's parameters.\n", - "record_limit = '9999'" + "record_limit = '99'" ] }, { @@ -33,7 +33,7 @@ "from collections import defaultdict\n", "import pandas as pd\n", "from pprint import pp\n", - "from urllib.parse import urlencode\n", + "b#\n", "from IPython.display import FileLink, display_markdown\n", "from matplotlib import pyplot as plt\n", "import os"