From f72bb28b5c7db8fd6390b3c3e7c3885fd2f9a7b1 Mon Sep 17 00:00:00 2001 From: cracraft Date: Tue, 7 May 2019 16:47:14 -0400 Subject: [PATCH 01/86] WIP: first commit of central store code --- jwql/database/database_interface.py | 16 +++ jwql/jwql_monitors/monitor_filesystem.py | 176 +++++++++++++++++++++-- 2 files changed, 183 insertions(+), 9 deletions(-) diff --git a/jwql/database/database_interface.py b/jwql/database/database_interface.py index 557223b6c..abd212675 100644 --- a/jwql/database/database_interface.py +++ b/jwql/database/database_interface.py @@ -243,6 +243,22 @@ def colnames(self): return a_list +class CentralStore(base): + """ORM for the central storage area filesystem monitor + table""" + + # Name the table + __tablename__ = 'central_storage' + + # Define the columns + id = Column(Integer, primary_key=True, nullable=False) + date = Column(DateTime, unique=True, nullable=False) + area = Column(String(), nullable=False) + size = Column(Float, nullable=False) + used = Column(Float, nullable=False) + available = Column(Float, nullable=False) + + class Monitor(base): """ORM for the ``monitor`` table""" diff --git a/jwql/jwql_monitors/monitor_filesystem.py b/jwql/jwql_monitors/monitor_filesystem.py index 5b97538cd..84ec332d5 100755 --- a/jwql/jwql_monitors/monitor_filesystem.py +++ b/jwql/jwql_monitors/monitor_filesystem.py @@ -39,6 +39,7 @@ import datetime import itertools import logging +import psutil import os import subprocess @@ -51,6 +52,7 @@ from jwql.database.database_interface import session from jwql.database.database_interface import FilesystemGeneral from jwql.database.database_interface import FilesystemInstrument +from jwql.database.database_interface import CentralStore from jwql.utils.logging_functions import configure_logging, log_info, log_fail from jwql.utils.permissions import set_permissions from jwql.utils.constants import FILE_SUFFIX_TYPES, JWST_INSTRUMENT_NAMES, JWST_INSTRUMENT_NAMES_MIXEDCASE @@ -58,6 +60,7 @@ from jwql.utils.utils import get_config FILESYSTEM = get_config()['filesystem'] +CENTRAL = get_config()['jwql_dir'] def gather_statistics(general_results_dict, instrument_results_dict): @@ -77,6 +80,7 @@ def gather_statistics(general_results_dict, instrument_results_dict): A dictionary for the ``filesystem_general`` database table instrument_results_dict : dict A dictionary for the ``filesystem_instrument`` database table + """ logging.info('Searching filesystem...') @@ -113,7 +117,7 @@ def gather_statistics(general_results_dict, instrument_results_dict): general_results_dict['total_file_size'] = general_results_dict['total_file_size'] / (2**40) general_results_dict['fits_file_size'] = general_results_dict['fits_file_size'] / (2**40) - logging.info('{} files found in filesystem'.format(general_results_dict['fits_file_count'])) + logging.info('{} fits files found in filesystem'.format(general_results_dict['fits_file_count'])) return general_results_dict, instrument_results_dict @@ -133,15 +137,82 @@ def get_global_filesystem_stats(general_results_dict): A dictionary for the ``filesystem_general`` database table """ - command = "df {}".format(FILESYSTEM) + command = "df -k {}".format(FILESYSTEM) command += " | awk '{print $3, $4}' | tail -n 1" stats = subprocess.check_output(command, shell=True).split() - general_results_dict['used'] = int(stats[0]) / (2**40) - general_results_dict['available'] = int(stats[1]) / (2**40) + general_results_dict['used'] = int(stats[0]) / (1024**3) + general_results_dict['available'] = int(stats[1]) / (1024**3) return general_results_dict +def get_area_stats(central_storage_dict): + """Gathers ``used`` and ``available`` ``df``-style stats on the + selected area. + + Parameters + ---------- + central_storage_dict : dict + A dictionary for the ``central_storage`` database table + + Returns + ------- + central_storage_dict : dict + A dictionary for the ``central_storage`` database table + """ + logging.info('Searching central storage system...') + + arealist = ['logs', 'outputs', 'test', 'preview_images', 'thumbnails', 'all'] + counteddirs = [] + + sum = 0 # to be used to count 'all' + for area in arealist: + + used = 0 + # initialize area in dictionary + if area not in central_storage_dict: + central_storage_dict[area] = {} + + if area == 'all': + fullpath = CENTRAL + else: + fullpath = os.path.join(CENTRAL, area) + + print(area, fullpath) + # record current area as being counted + counteddirs.append(fullpath) + print(counteddirs) + + # to get df stats, use -k to get 1024 byte blocks + command = "df -k {}".format(fullpath) + command += " | awk '{print $2, $3, $4}' | tail -n 1" + stats = subprocess.check_output(command, shell=True).split() + # to put in TB, have to multiply values by 1024 to get in bytes, then + # divide by 1024 ^ 4 to put in TB + total = int(stats[0]) / (1024 ** 3) + free = int(stats[2]) / (1024 ** 3) + central_storage_dict[area]['size'] = total + central_storage_dict[area]['available'] = free + + # do an os.walk on each directory to count up used space + + for dirpath, _, files in os.walk(fullpath): + for filename in files: + file_path = os.path.join(dirpath, filename) + # Check if file_path exists, if so, add to used space + exists = os.path.isfile(file_path) + if exists: + filesize = os.path.getsize(file_path) + used += filesize + sum += filesize + use = used / (1024 ** 4) + central_storage_dict[area]['used'] = use + print(area, total, use, free) + + logging.info('Finished searching central storage system') + return central_storage_dict + + def initialize_results_dicts(): """Initializes dictionaries that will hold filesystem statistics @@ -151,6 +222,8 @@ def initialize_results_dicts(): A dictionary for the ``filesystem_general`` database table instrument_results_dict : dict A dictionary for the ``filesystem_instrument`` database table + central_storage_dict : dict + A dictionary for the ``central_storage`` database table """ now = datetime.datetime.now() @@ -165,7 +238,10 @@ def initialize_results_dicts(): instrument_results_dict = {} instrument_results_dict['date'] = now - return general_results_dict, instrument_results_dict + central_storage_dict = {} + central_storage_dict['date'] = now + + return general_results_dict, instrument_results_dict, central_storage_dict @log_fail @@ -179,7 +255,7 @@ def monitor_filesystem(): logging.info('Beginning filesystem monitoring.') # Initialize dictionaries for database input - general_results_dict, instrument_results_dict = initialize_results_dicts() + general_results_dict, instrument_results_dict, central_storage_dict = initialize_results_dicts() # Walk through filesystem recursively to gather statistics general_results_dict, instrument_results_dict = gather_statistics(general_results_dict, instrument_results_dict) @@ -187,8 +263,11 @@ def monitor_filesystem(): # Get df style stats on file system general_results_dict = get_global_filesystem_stats(general_results_dict) + # Get stats on central storage areas + central_storage_dict = get_area_stats(central_storage_dict) + # Add data to database tables - update_database(general_results_dict, instrument_results_dict) + update_database(general_results_dict, instrument_results_dict, central_storage_dict) # Create the plots plot_filesystem_stats() @@ -292,17 +371,77 @@ def plot_filesystem_size(): return plot +def plot_central_store_dirs(): + """Plot central store sizes (size, used, available) versus date + + Returns + ------- + plot : bokeh.plotting.figure.Figure object + ``bokeh`` plot of total directory size versus date + """ + + # Plot system stats vs. date + results = session.query(CentralStore.date, CentralStore.size, CentralStore.available).all() + + arealist = ['logs', 'outputs', 'test', 'preview_images', 'thumbnails', 'all'] + + # Initialize plot + dates, total_sizes, availables = zip(*results) + plot = figure( + tools='pan,box_zoom,wheel_zoom,reset,save', + x_axis_type='datetime', + title='Central Store stats', + x_axis_label='Date', + y_axis_label='Size TB') + colors = itertools.cycle(palette) + + plot.line(dates, total_sizes, legend='Total size', line_color='red') + plot.circle(dates, total_sizes, color='red') + plot.line(dates, availables, legend='Free', line_color='blue') + plot.circle(dates, availables, color='blue') + + # This part of the plot should cycle through areas and plot area used values vs. date + for area, color in zip(arealist, colors): + + # Query for used sizes + results = session.query(CentralStore.date, getattr(CentralStore))\ + .filter(CentralStore.used == used) + + if area == 'all': + results = results.all() + else: + results = results.filter(CentralStore.area == area).all() + + # Group by date + if results: + results_dict = defaultdict(int) + for date, value in results: + results_dict[date] += value + + # Parse results so they can be easily plotted + dates = list(results_dict.keys()) + values = list(results_dict.values()) + + # Plot the results + plot.line(dates, values, legend='{} files'.format(area), line_color=color) + plot.circle(dates, values, color=color) + + return plot + + def plot_filesystem_stats(): """ Plot various filesystem statistics using ``bokeh`` and save them to the output directory. """ + logging.info('Starting plots.') p1 = plot_total_file_counts() p2 = plot_filesystem_size() p3 = plot_by_filetype('count', 'all') p4 = plot_by_filetype('size', 'all') - plot_list = [p1, p2, p3, p4] + p5 = plot_central_store_dirs() + plot_list = [p1, p2, p3, p4, p5] for instrument in JWST_INSTRUMENT_NAMES: plot_list.append(plot_by_filetype('count', instrument)) @@ -367,7 +506,7 @@ def plot_total_file_counts(): return plot -def update_database(general_results_dict, instrument_results_dict): +def update_database(general_results_dict, instrument_results_dict, central_storage_dict): """Updates the ``filesystem_general`` and ``filesystem_instrument`` database tables. @@ -377,7 +516,11 @@ def update_database(general_results_dict, instrument_results_dict): A dictionary for the ``filesystem_general`` database table instrument_results_dict : dict A dictionary for the ``filesystem_instrument`` database table + central_storage_dict : dict + A dictionary for the ``central_storage`` database table + """ + logging.info('Updating databases.') engine.execute(FilesystemGeneral.__table__.insert(), general_results_dict) session.commit() @@ -395,6 +538,21 @@ def update_database(general_results_dict, instrument_results_dict): engine.execute(FilesystemInstrument.__table__.insert(), new_record) session.commit() + # Add data to central_storage table + + arealist = ['logs', 'outputs', 'test', 'preview_images', 'thumbnails', 'all'] + + for area in arealist: + new_record = {} + new_record['date'] = central_storage_dict['date'] + new_record['area'] = area + new_record['size'] = central_storage_dict[area]['size'] + new_record['used'] = central_storage_dict[area]['used'] + new_record['available'] = central_storage_dict[area]['available'] + + engine.execute(CentralStore.__table__.insert(), new_record) + session.commit() + if __name__ == '__main__': From 83580c74e3ad6604a59ad30b3b422fa463bf7d6f Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Wed, 15 May 2019 14:01:34 -0400 Subject: [PATCH 02/86] Minor updates to package description and dependencies needed for pypi --- environment_python_3_5.yml | 1 + environment_python_3_6.yml | 1 + setup.py | 8 +++++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/environment_python_3_5.yml b/environment_python_3_5.yml index 0ab098dff..cf1119a46 100644 --- a/environment_python_3_5.yml +++ b/environment_python_3_5.yml @@ -26,6 +26,7 @@ dependencies: - sphinx_rtd_theme=0.1.9 - sqlalchemy=1.2.11 - stsci_rtd_theme=0.0.2 +- twine=1.13.0 - pip: - authlib==0.10 - codecov==2.0.15 diff --git a/environment_python_3_6.yml b/environment_python_3_6.yml index 68a0fcced..5b0e4d998 100644 --- a/environment_python_3_6.yml +++ b/environment_python_3_6.yml @@ -26,6 +26,7 @@ dependencies: - sphinx_rtd_theme=0.1.9 - sqlalchemy=1.3.3 - stsci_rtd_theme=0.0.2 +- twine=1.13.0 - pip: - authlib==0.10 - codecov==2.0.15 diff --git a/setup.py b/setup.py index 867bbf23d..908bbe144 100644 --- a/setup.py +++ b/setup.py @@ -4,8 +4,10 @@ VERSION = '0.19.0' -AUTHORS = 'Matthew Bourque, Sara Ogaz, Joe Filippazzo, Bryan Hilbert, Misty Cracraft, ' -AUTHORS += 'Graham Kanarek, Johannes Sahlmann, Lauren Chambers, Catherine Martlin' +AUTHORS = 'Matthew Bourque, Lauren Chambers, Misty Cracraft, Joe Filippazzo, Bryan Hilbert, ' +AUTHORS += 'Graham Kanarek, Catherine Martlin, Johannes Sahlmann' + +DESCRIPTION = 'The James Webb Space Telescope Quicklook Project' REQUIRES = [ 'astropy', @@ -31,7 +33,7 @@ setup( name='jwql', version=VERSION, - description='The JWST Quicklook Project', + description=DESCRIPTION, url='https://github.com/spacetelescope/jwql.git', author=AUTHORS, author_email='jwql@stsci.edu', From 1b88aa2357c1f66b307e78f0b0852894c5b55a12 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 16 May 2019 10:16:10 -0400 Subject: [PATCH 03/86] Fixed twine version to be compatible with python 3.5 --- environment_python_3_5.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment_python_3_5.yml b/environment_python_3_5.yml index cf1119a46..3bed7b091 100644 --- a/environment_python_3_5.yml +++ b/environment_python_3_5.yml @@ -26,7 +26,7 @@ dependencies: - sphinx_rtd_theme=0.1.9 - sqlalchemy=1.2.11 - stsci_rtd_theme=0.0.2 -- twine=1.13.0 +- twine=1.11.0 - pip: - authlib==0.10 - codecov==2.0.15 From 24bc470bc5b15b03fe006c3ce0a27fc10d850806 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Fri, 17 May 2019 11:42:18 -0400 Subject: [PATCH 04/86] Added credentials and commands to upload package to PyPI --- Jenkinsfile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2f0c00fad..b4c248e61 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,10 +5,12 @@ matrix_os = ["linux-stable"] matrix_python = ["3.5", "3.6"] matrix = [] -withCredentials([string( - credentialsId: 'jwql-codecov', - variable: 'codecov_token')]) { +withCredentials([ + string(credentialsId: 'jwql-codecov', variable: 'codecov_token'), + string(credentialsId: 'jwql-pypi-username', variable: 'pypi_username_token'), + string(credentialsId: 'jwql-pypi-password', variable: 'pypi_password_token')]) +{ for (os in matrix_os) { for (python_ver in matrix_python) { // Define each build configuration, copying and overriding values as necessary. @@ -20,20 +22,18 @@ withCredentials([string( bc.build_cmds = [ "conda env update --file=environment${env_py}.yml", "pip install codecov pytest-cov", - "python setup.py install"] + "python setup.py install", + "python setup.py sdist bdist_wheel"] bc.test_cmds = [ "pytest -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", "sed -i 's/file=\"[^\"]*\"//g;s/line=\"[^\"]*\"//g;s/skips=\"[^\"]*\"//g' results.xml", "codecov --token=${codecov_token}", "mkdir -v reports", - "mv -v coverage.xml reports/coverage.xml"] + "mv -v coverage.xml reports/coverage.xml", + "twine upload -u {pypi_username_token} -p {pypi_password_token} --repository-url https://upload.pypi.org/legacy/ dist/*"] matrix += bc } } - // bc1 = utils.copy(bc0) - // bc1.build_cmds[0] = "conda install -q -y python=3.5" - // Iterate over configurations that define the (distibuted) build matrix. - // Spawn a host of the given nodetype for each combination and run in parallel. utils.run(matrix) } From 0757d5bacd741ee65e0822f048a9b26cdd263dbb Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 3 Jun 2019 16:19:33 -0400 Subject: [PATCH 05/86] Updating bokeh to latest supported version --- jwql/website/apps/jwql/templates/base.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jwql/website/apps/jwql/templates/base.html b/jwql/website/apps/jwql/templates/base.html index 315bcc540..fe1cf0aa8 100644 --- a/jwql/website/apps/jwql/templates/base.html +++ b/jwql/website/apps/jwql/templates/base.html @@ -22,8 +22,8 @@ - - + + {% block preamble %} From 857aa5badec7e1909f9a82b6bef84cc163932745 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Tue, 4 Jun 2019 16:52:06 -0400 Subject: [PATCH 06/86] Add bokeh version test --- jwql/tests/test_plotting.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/jwql/tests/test_plotting.py b/jwql/tests/test_plotting.py index 14dcb07f4..27028a8c5 100755 --- a/jwql/tests/test_plotting.py +++ b/jwql/tests/test_plotting.py @@ -18,10 +18,18 @@ pytest -s test_plotting.py """ +import glob +import os +import re + +import bokeh from pandas import DataFrame from jwql.utils.plotting import bar_chart +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) +JWQL_DIR = __location__.split('tests')[0] + def test_bar_chart(): """Make sure some dummy data generates a ``bokeh`` plot""" @@ -36,3 +44,26 @@ def test_bar_chart(): plt = bar_chart(data, 'index') assert str(type(plt)) == "" + + +def test_bokeh_version(): + """Make sure that the current version of Bokeh matches the version being + used in all the web app HTML templates. + """ + env_version = bokeh.__version__ + + template_paths = os.path.join(JWQL_DIR, 'website/apps/jwql/templates', '*.html') + all_web_html_files = glob.glob(template_paths) + + for file in all_web_html_files: + with open(file) as f: + content = f.read() + + # Find all of the times "bokeh-#.#.#' appears in a template + html_versions = re.findall(r'(?<=bokeh-)\d+\.\d+\.\d+', content) + + # Make sure they all match the environment version + for version in html_versions: + assert version == env_version, \ + 'Bokeh version ({}) in HTML template {} '.format(version, os.path.basename(file)) + \ + 'does not match current environment version ({}).'.format(env_version) From 0ea60e68fb407e843aea88e2da191e1d4850aef7 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Wed, 5 Jun 2019 11:37:13 -0400 Subject: [PATCH 07/86] Add skip for builds that aren't Python 3.6 --- jwql/tests/test_plotting.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jwql/tests/test_plotting.py b/jwql/tests/test_plotting.py index 27028a8c5..97006f402 100755 --- a/jwql/tests/test_plotting.py +++ b/jwql/tests/test_plotting.py @@ -21,9 +21,11 @@ import glob import os import re +import sys import bokeh from pandas import DataFrame +import pytest from jwql.utils.plotting import bar_chart @@ -46,6 +48,8 @@ def test_bar_chart(): assert str(type(plt)) == "" +@pytest.mark.skipif(sys.version_info[:2] != (3, 6), + reason="Web server run on Python 3.6") def test_bokeh_version(): """Make sure that the current version of Bokeh matches the version being used in all the web app HTML templates. From 2a564952cddc1e4f5b90e783a312265adac78d35 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 10:34:03 -0400 Subject: [PATCH 08/86] Now using proper syntax for usernamePassword use of withCredentials --- Jenkinsfile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b4c248e61..b559ea186 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,8 +7,7 @@ matrix = [] withCredentials([ string(credentialsId: 'jwql-codecov', variable: 'codecov_token'), - string(credentialsId: 'jwql-pypi-username', variable: 'pypi_username_token'), - string(credentialsId: 'jwql-pypi-password', variable: 'pypi_password_token')]) + usernamePassword(credentialsId:'jwql-pypi', usernameVariable: 'pypi_username', passwordVariable: 'pypi_password')]) { for (os in matrix_os) { @@ -30,10 +29,15 @@ withCredentials([ "codecov --token=${codecov_token}", "mkdir -v reports", "mv -v coverage.xml reports/coverage.xml", - "twine upload -u {pypi_username_token} -p {pypi_password_token} --repository-url https://upload.pypi.org/legacy/ dist/*"] + "twine upload -u {pypi_username} -p {pypi_password} --repository-url https://upload.pypi.org/legacy/ dist/*"] matrix += bc } } utils.run(matrix) } + + +withCredentials([usernamePassword(credentialsId:'jwql-pypi', +usernameVariable: 'USERNAME', +passwordVariable: 'PASSWORD')]) { } \ No newline at end of file From c4d429812a0fe5795f6641f5b6d05d4bf686dc5a Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 10:34:57 -0400 Subject: [PATCH 09/86] Whoops, accidentally left in some pasted text --- Jenkinsfile | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b559ea186..f265ea100 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -35,9 +35,4 @@ withCredentials([ } utils.run(matrix) -} - - -withCredentials([usernamePassword(credentialsId:'jwql-pypi', -usernameVariable: 'USERNAME', -passwordVariable: 'PASSWORD')]) { } \ No newline at end of file +} \ No newline at end of file From 36eff593b9aad654b33193d301589fd6cbeab690 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 10:51:00 -0400 Subject: [PATCH 10/86] Added missing $ --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f265ea100..ebea44a7a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -29,7 +29,7 @@ withCredentials([ "codecov --token=${codecov_token}", "mkdir -v reports", "mv -v coverage.xml reports/coverage.xml", - "twine upload -u {pypi_username} -p {pypi_password} --repository-url https://upload.pypi.org/legacy/ dist/*"] + "twine upload -u ${pypi_username} -p ${pypi_password} --repository-url https://upload.pypi.org/legacy/ dist/*"] matrix += bc } } From 57c428862eca9f01d562284ed54c8070a0057968 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 11:06:54 -0400 Subject: [PATCH 11/86] Trying quotes around credential variables --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index ebea44a7a..cbe7b73c4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -29,7 +29,7 @@ withCredentials([ "codecov --token=${codecov_token}", "mkdir -v reports", "mv -v coverage.xml reports/coverage.xml", - "twine upload -u ${pypi_username} -p ${pypi_password} --repository-url https://upload.pypi.org/legacy/ dist/*"] + "twine upload -u '${pypi_username}' -p '${pypi_password}' --repository-url https://upload.pypi.org/legacy/ dist/*"] matrix += bc } } From d6b58b743cdada61d9c14aa86dd1b50d27dbcce0 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 11:20:36 -0400 Subject: [PATCH 12/86] Added skip-existing flag to hopefully avoid re-uploading the same distribution --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index cbe7b73c4..4db3c183a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -29,7 +29,7 @@ withCredentials([ "codecov --token=${codecov_token}", "mkdir -v reports", "mv -v coverage.xml reports/coverage.xml", - "twine upload -u '${pypi_username}' -p '${pypi_password}' --repository-url https://upload.pypi.org/legacy/ dist/*"] + "twine upload -u '${pypi_username}' -p '${pypi_password}' --repository-url https://upload.pypi.org/legacy/ --skip-existing dist/*"] matrix += bc } } From bb7459292259d23eab037ace003db97dd75437ac Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 11:49:56 -0400 Subject: [PATCH 13/86] Cleaning up Jenkinsfile --- Jenkinsfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 4db3c183a..84bf708e9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,17 +12,19 @@ withCredentials([ { for (os in matrix_os) { for (python_ver in matrix_python) { - // Define each build configuration, copying and overriding values as necessary. + env_py = "_python_${python_ver}".replace(".", "_") bc = new BuildConfig() bc.nodetype = os bc.name = "debug-${os}-${env_py}" bc.conda_packages = ["python=${python_ver}"] + bc.build_cmds = [ "conda env update --file=environment${env_py}.yml", "pip install codecov pytest-cov", "python setup.py install", "python setup.py sdist bdist_wheel"] + bc.test_cmds = [ "pytest -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", "sed -i 's/file=\"[^\"]*\"//g;s/line=\"[^\"]*\"//g;s/skips=\"[^\"]*\"//g' results.xml", @@ -30,6 +32,7 @@ withCredentials([ "mkdir -v reports", "mv -v coverage.xml reports/coverage.xml", "twine upload -u '${pypi_username}' -p '${pypi_password}' --repository-url https://upload.pypi.org/legacy/ --skip-existing dist/*"] + matrix += bc } } From 7234ad2b74be72801d5be835fcdeb284b4d2136c Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 13:36:40 -0400 Subject: [PATCH 14/86] Improved test_anomaly_records to test specific rootname --- jwql/tests/test_database_interface.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jwql/tests/test_database_interface.py b/jwql/tests/test_database_interface.py index 96bb884d0..fd0582baa 100755 --- a/jwql/tests/test_database_interface.py +++ b/jwql/tests/test_database_interface.py @@ -42,10 +42,10 @@ def test_anomaly_records(): """Test to see that new records can be entered""" # Add some data - random_string = ''.join(random.SystemRandom().choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(10)) - di.session.add(di.Anomaly(rootname=random_string, flag_date=datetime.datetime.today(), user='test', ghost=True)) + random_rootname = ''.join(random.SystemRandom().choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(10)) + di.session.add(di.Anomaly(rootname=random_rootname, flag_date=datetime.datetime.today(), user='test', ghost=True)) di.session.commit() # Test the ghosts column - ghosts = di.session.query(di.Anomaly).filter(di.Anomaly.ghost == "True") + ghosts = di.session.query(di.Anomaly).filter(di.Anomaly.rootname == random_rootname).filter(di.Anomaly.ghost == "True") assert ghosts.data_frame.iloc[0]['ghost'] == True From 7eb3619dcf86ae34482ce3c3df0b3b7a5d82cc59 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 14:48:26 -0400 Subject: [PATCH 15/86] Added tests for orm factory functions as well as a test to make sure all tables exist in the database --- jwql/tests/test_database_interface.py | 81 +++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/jwql/tests/test_database_interface.py b/jwql/tests/test_database_interface.py index fd0582baa..538b88690 100755 --- a/jwql/tests/test_database_interface.py +++ b/jwql/tests/test_database_interface.py @@ -25,11 +25,50 @@ import string from jwql.database import database_interface as di +from jwql.utils.constants import ANOMALIES +from jwql.utils.utils import get_config # Determine if tests are being run on jenkins ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +def test_all_tables_exist(): + """Test that the table ORMs defined in ``database_interface`` + actually exist as tables in the database""" + + # Get list of table ORMs from database_interface + table_orms = [] + database_interface_attributes = di.__dict__.keys() + for attribute in database_interface_attributes: + table_object = getattr(di, attribute) + try: + table_orms.append(table_object.__tablename__) + except AttributeError: + pass # Not all attributes of database_interface are table ORMs + + # Get list of tables that are actually in the database + existing_tables = di.engine.table_names() + + # Ensure that the ORMs defined in database_interface actually exist + # as tables in the database + for table in table_orms: + assert table in existing_tables + + +def test_anomaly_orm_factory(): + """Test that the ``anomaly_orm_factory`` function successfully + creates an ORM and contains the appropriate columns""" + + test_table_name = 'test_anomaly_table' + TestAnomalyTable = di.anomaly_orm_factory('test_anomaly_table') + table_attributes = TestAnomalyTable.__dict__.keys() + + assert str(TestAnomalyTable) == "".format(test_table_name) + + for anomaly in ANOMALIES: + assert anomaly in table_attributes + + @pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') def test_anomaly_table(): """Test to see that the database has an anomalies table""" @@ -49,3 +88,45 @@ def test_anomaly_records(): # Test the ghosts column ghosts = di.session.query(di.Anomaly).filter(di.Anomaly.rootname == random_rootname).filter(di.Anomaly.ghost == "True") assert ghosts.data_frame.iloc[0]['ghost'] == True + + +@pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') +def test_load_connections(): + """Test to see that a connection to the database can be + established""" + + session, base, engine, meta = di.load_connection(get_config()['connection_string']) + assert str(type(session)) == "" + assert str(type(base)) == "" + assert str(type(engine)) == "" + assert str(type(meta)) == "" + + +def test_monitor_orm_factory(): + """Test that the ``monitor_orm_factory`` function successfully + creates an ORM and contains the appropriate columns""" + + test_table_name = 'instrument_test_monitor_table' + + # Create temporary table definitions file + test_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'database', 'monitor_table_definitions', 'instrument') + test_filename = os.path.join(test_dir, '{}.txt'.format(test_table_name)) + if not os.path.isdir(test_dir): + os.mkdir(test_dir) + with open(test_filename, 'w') as f: + f.write('TEST_COLUMN, string') + + # Create the test table ORM + TestMonitorTable = di.monitor_orm_factory(test_table_name) + table_attributes = TestMonitorTable.__dict__.keys() + + # Ensure the ORM exists and contains appropriate columns + assert str(TestMonitorTable) == "".format(test_table_name) + for column in ['id', 'entry_date', 'test_column']: + assert column in table_attributes + + # Remove test files and directories + if os.path.isfile(test_filename): + os.remove(test_filename) + if os.path.isdir(test_dir): + os.rmdir(test_dir) From 875cd4f134d9ea694e8e51351b691da40687f4e4 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 15:17:10 -0400 Subject: [PATCH 16/86] Removed redundant test of asserting anomaly table exists. Added pytest skipif for test_all_tables_exists test since it requires access to the database itself --- jwql/tests/test_database_interface.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/jwql/tests/test_database_interface.py b/jwql/tests/test_database_interface.py index 538b88690..1b898f76c 100755 --- a/jwql/tests/test_database_interface.py +++ b/jwql/tests/test_database_interface.py @@ -32,6 +32,7 @@ ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +@pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') def test_all_tables_exist(): """Test that the table ORMs defined in ``database_interface`` actually exist as tables in the database""" @@ -69,13 +70,6 @@ def test_anomaly_orm_factory(): assert anomaly in table_attributes -@pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') -def test_anomaly_table(): - """Test to see that the database has an anomalies table""" - - assert 'anomaly' in di.engine.table_names() - - @pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') def test_anomaly_records(): """Test to see that new records can be entered""" From eb3f6f1cded6d33704ef7273e963ce9c6867e351 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 6 Jun 2019 15:29:01 -0400 Subject: [PATCH 17/86] Added Josh Alexander to acknowledgements --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e03cd513c..81cbbc4b5 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,7 @@ Any questions about the `jwql` project or its software can be directed to `jwql@ ## Acknowledgments: - Faith Abney (DMD) +- Joshua Alexander (DMD) [@obviousrebel](https://github.com/obviousrebel) - Anastasia Alexov (DMD) - Sara Anderson (DMD) - Tracy Beck (INS) From 5c7d84d1bdc4dc986eae65bcfdef2bd0db4a3ff3 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Fri, 7 Jun 2019 10:25:11 -0400 Subject: [PATCH 18/86] Also search for bokeh-widgets versions --- jwql/tests/test_plotting.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jwql/tests/test_plotting.py b/jwql/tests/test_plotting.py index 97006f402..4d142fcdb 100755 --- a/jwql/tests/test_plotting.py +++ b/jwql/tests/test_plotting.py @@ -65,6 +65,7 @@ def test_bokeh_version(): # Find all of the times "bokeh-#.#.#' appears in a template html_versions = re.findall(r'(?<=bokeh-)\d+\.\d+\.\d+', content) + html_versions += re.findall(r'(?<=bokeh-widgets-)\d+\.\d+\.\d+', content) # Make sure they all match the environment version for version in html_versions: From 5b0c2b16b95f61867422b3576f599defa920a902 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Jun 2019 15:44:04 -0400 Subject: [PATCH 19/86] Update sphinx from 2.1.0 to 2.1.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a8b804c75..985d2fded 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ psycopg2==2.8.2 pysiaf==0.2.5 python-dateutil==2.8.0 pytest==4.6.2 -sphinx==2.1.0 +sphinx==2.1.1 sphinx-automodapi==0.11 sqlalchemy==1.3.4 stsci_rtd_theme==0.0.2 From 157ad6a722a59da70f3f39150b8d0e48edc4312c Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Tue, 11 Jun 2019 12:13:36 -0400 Subject: [PATCH 20/86] Updated shinx dependency --- environment_python_3_6.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment_python_3_6.yml b/environment_python_3_6.yml index 6dad8297c..1f0623de1 100644 --- a/environment_python_3_6.yml +++ b/environment_python_3_6.yml @@ -23,7 +23,7 @@ dependencies: - pytest=4.5.0 - pytest-cov=2.6.1 - pytest-html=1.19.0 -- sphinx=2.0.1 +- sphinx=2.1.0 - sphinx_rtd_theme=0.1.9 - sqlalchemy=1.3.3 - stsci_rtd_theme=0.0.2 From e4c2099d5c3f4305bca45bb56e85b33c3f3f312b Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Tue, 11 Jun 2019 17:30:09 -0400 Subject: [PATCH 21/86] Trying try/except loop around url.read() to handle potential incomplete data --- jwql/tests/test_api_views.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/jwql/tests/test_api_views.py b/jwql/tests/test_api_views.py index 939b79fab..7686f08da 100644 --- a/jwql/tests/test_api_views.py +++ b/jwql/tests/test_api_views.py @@ -17,12 +17,14 @@ pytest -s test_api_views.py """ -import os +import http import json -import pytest +import os from urllib import request, error +import pytest + from jwql.utils.utils import get_base_url from jwql.utils.constants import JWST_INSTRUMENT_NAMES @@ -71,7 +73,6 @@ urls.append('api/{}/thumbnails/'.format(rootname)) # thumbnails_by_rootname -# @pytest.mark.skipif(ON_JENKINS, reason='Requires access to central storage.') @pytest.mark.parametrize('url', urls) def test_api_views(url): """Test to see if the given ``url`` returns a populated JSON object @@ -104,6 +105,9 @@ def test_api_views(url): pytest.skip("Dev server problem") raise(e) - data = json.loads(url.read().decode()) + try: + data = json.loads(url.read().decode()) + except (http.client.IncompleteRead) as e: + data = e.partial assert len(data[data_type]) > 0 From d02052a01f2763e5cfc94d93a19a716eaa5aacd5 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Tue, 11 Jun 2019 17:42:25 -0400 Subject: [PATCH 22/86] Updated referenced bokeh version in templates to match server version --- jwql/website/apps/jwql/templates/dashboard.html | 2 +- .../apps/jwql/templates/engineering_database.html | 2 +- .../apps/jwql/templates/filesystem_monitor_full.html | 6 +++--- .../apps/jwql/templates/miri_data_trending.html | 10 +++++----- .../apps/jwql/templates/nirspec_data_trending.html | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/jwql/website/apps/jwql/templates/dashboard.html b/jwql/website/apps/jwql/templates/dashboard.html index 0250fd416..2aea6bb50 100644 --- a/jwql/website/apps/jwql/templates/dashboard.html +++ b/jwql/website/apps/jwql/templates/dashboard.html @@ -5,7 +5,7 @@ Dashboard - JWQL - + {% for monitor_name, plots in dashboard_components.items() %} {% for plot_name, components in plots.items() %} {{ components[1] | safe}} diff --git a/jwql/website/apps/jwql/templates/engineering_database.html b/jwql/website/apps/jwql/templates/engineering_database.html index e3e4313c1..c2bbc5a2a 100644 --- a/jwql/website/apps/jwql/templates/engineering_database.html +++ b/jwql/website/apps/jwql/templates/engineering_database.html @@ -118,7 +118,7 @@

Query for records of an EDB mnemonic

Download data - + {{ edb_components['mnemonic_query_result_plot'][1] | safe}} {{ edb_components['mnemonic_query_result_plot'][0] | safe }} diff --git a/jwql/website/apps/jwql/templates/filesystem_monitor_full.html b/jwql/website/apps/jwql/templates/filesystem_monitor_full.html index 02043c0af..f8a0cfa52 100755 --- a/jwql/website/apps/jwql/templates/filesystem_monitor_full.html +++ b/jwql/website/apps/jwql/templates/filesystem_monitor_full.html @@ -5,9 +5,9 @@ Bokeh Plot - + - + @@ -33,7 +33,7 @@ (function() { var fn = function() { Bokeh.safely(function() { - var docs_json = {"34902372-cbe5-4439-a46d-64324ed09090":{"roots":{"references":[{"attributes":{"x":{"field":"x"},"y":{"field":"y"}},"id":"93dc5af9-6558-4b81-82c2-17bed6df3ea5","type":"Line"},{"attributes":{"callback":null},"id":"8ecefa3a-b82b-4c6f-a31c-987d5214c941","type":"DataRange1d"},{"attributes":{"axis_label":"Date","formatter":{"id":"b2359f7e-9340-4191-a6aa-1419f20d9063","type":"DatetimeTickFormatter"},"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},"ticker":{"id":"163d7cc6-1213-4d3a-8362-2a0fcd5725e9","type":"DatetimeTicker"}},"id":"bf30d024-7169-402f-8d67-ad0a1eaa4e11","type":"DatetimeAxis"},{"attributes":{"callback":null},"id":"28d23309-f8a5-4d85-921c-cb8311aed547","type":"DataRange1d"},{"attributes":{"num_minor_ticks":5},"id":"163d7cc6-1213-4d3a-8362-2a0fcd5725e9","type":"DatetimeTicker"},{"attributes":{"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},"ticker":{"id":"163d7cc6-1213-4d3a-8362-2a0fcd5725e9","type":"DatetimeTicker"}},"id":"ad541891-83dc-46a9-b948-177d2dfc7f95","type":"Grid"},{"attributes":{"axis_label":"GB","formatter":{"id":"cd14b243-1dfc-4e51-8db4-dcd9a3985887","type":"BasicTickFormatter"},"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},"ticker":{"id":"e14b88a1-f39b-4d40-86fd-f3af06dfc945","type":"BasicTicker"}},"id":"58a456a6-c6b4-4f8a-bc19-d25c1656c7b2","type":"LinearAxis"},{"attributes":{},"id":"e14b88a1-f39b-4d40-86fd-f3af06dfc945","type":"BasicTicker"},{"attributes":{"dimension":1,"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},"ticker":{"id":"e14b88a1-f39b-4d40-86fd-f3af06dfc945","type":"BasicTicker"}},"id":"c76f424b-42f3-43ac-baad-87c8aeca63ca","type":"Grid"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"4c770ba7-1f35-4ad8-af2d-b81fb90f33d4","type":"Line"},{"attributes":{"label":{"value":"i2d fits files"},"renderers":[{"id":"25952b66-5b1a-4140-b020-9991de572bad","type":"GlyphRenderer"}]},"id":"dfafa13f-9d7a-4432-ba7f-d3055320c14a","type":"LegendItem"},{"attributes":{"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"b9c3308f-cb11-4b8f-a6b9-790a4b8de085","type":"PanTool"},{"attributes":{"overlay":{"id":"eeb23522-001e-4c13-917d-456ed3542c3e","type":"BoxAnnotation"},"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"2f0e3e43-48c1-498f-9bac-5ae028797ed6","type":"BoxZoomTool"},{"attributes":{"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"c3d9134c-9736-4883-b3de-6f9fbb21b65c","type":"ResetTool"},{"attributes":{"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"9b91db84-0759-4f80-8b78-5c28d23a3a76","type":"SaveTool"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"eeb23522-001e-4c13-917d-456ed3542c3e","type":"BoxAnnotation"},{"attributes":{"data_source":{"id":"9043076c-5800-446f-b3e6-cc5b204ab9ac","type":"ColumnDataSource"},"glyph":{"id":"b2ef6cd5-59af-4483-86f9-bdbc1c764b7e","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"f9b0d0a3-04bb-43ab-9315-ea85c030078b","type":"Line"},"selection_glyph":null},"id":"f60d1b3b-e505-4985-9da5-16f8592de673","type":"GlyphRenderer"},{"attributes":{"label":{"value":"uncalibrated fits files"},"renderers":[{"id":"bddb7bad-e12c-44f7-957d-e7f2a3ae77d0","type":"GlyphRenderer"}]},"id":"02ed6e2b-89d4-47d4-b584-1d8a51c11bd9","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0A=","dtype":"float64","shape":[25]}}},"id":"f590eae7-7bbb-47d3-9944-72a21a99e09a","type":"ColumnDataSource"},{"attributes":{"fill_color":{"value":"purple"},"line_color":{"value":"purple"},"x":{"field":"x"},"y":{"field":"y"}},"id":"797fd21d-00c6-4892-a990-51d9233f5e06","type":"X"},{"attributes":{"data_source":{"id":"3ecad6ef-5a29-4f24-800e-ab43070f8a52","type":"ColumnDataSource"},"glyph":{"id":"797fd21d-00c6-4892-a990-51d9233f5e06","type":"X"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"92544187-1a54-4873-ae13-eaa7b5e14633","type":"X"},"selection_glyph":null},"id":"753f5064-2a31-44dd-86ff-14268167e6c9","type":"GlyphRenderer"},{"attributes":{},"id":"0734274f-b23d-4a3c-91b9-d0575b61f79e","type":"DatetimeTickFormatter"},{"attributes":{"fill_color":{"value":"green"},"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"64615e2a-d6d4-486c-8f5e-ff2e94b66311","type":"Triangle"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"2b0bf374-bcbe-4ad4-a7f0-7c2c1824d1b3","type":"Triangle"},{"attributes":{"data_source":{"id":"f590eae7-7bbb-47d3-9944-72a21a99e09a","type":"ColumnDataSource"},"glyph":{"id":"64615e2a-d6d4-486c-8f5e-ff2e94b66311","type":"Triangle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"2b0bf374-bcbe-4ad4-a7f0-7c2c1824d1b3","type":"Triangle"},"selection_glyph":null},"id":"d281fffc-3cef-4d70-aede-32384969d529","type":"GlyphRenderer"},{"attributes":{"data_source":{"id":"fd61eee8-80ac-406e-9711-1d14c2e7d2e1","type":"ColumnDataSource"},"glyph":{"id":"49e4d52d-3415-49d7-a129-c0d417ec2edf","type":"Square"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"4b185238-cf9c-49f3-bf24-9dc6bbf67508","type":"Square"},"selection_glyph":null},"id":"2f6e66c7-3f51-4495-b45f-702c18653a43","type":"GlyphRenderer"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"4b185238-cf9c-49f3-bf24-9dc6bbf67508","type":"Square"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUA=","dtype":"float64","shape":[25]}}},"id":"22434662-1775-4140-9d52-dd0552a42e1b","type":"ColumnDataSource"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"92544187-1a54-4873-ae13-eaa7b5e14633","type":"X"},{"attributes":{"fill_color":{"value":"blue"},"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"49e4d52d-3415-49d7-a129-c0d417ec2edf","type":"Square"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUA=","dtype":"float64","shape":[25]}}},"id":"e0ecfee9-6ba6-433f-9364-90b3583d3ec5","type":"ColumnDataSource"},{"attributes":{"children":[{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}]},"id":"e09bb773-ec12-4283-aea7-abd199a4e2c2","type":"Row"},{"attributes":{"fill_color":{"value":"red"},"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"01bb4887-aa1e-41f9-8c82-d7648342c270","type":"Diamond"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d58c93c9-8159-42c0-ab1f-bba7e6f35f03","type":"Diamond"},{"attributes":{"data_source":{"id":"22434662-1775-4140-9d52-dd0552a42e1b","type":"ColumnDataSource"},"glyph":{"id":"01bb4887-aa1e-41f9-8c82-d7648342c270","type":"Diamond"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"d58c93c9-8159-42c0-ab1f-bba7e6f35f03","type":"Diamond"},"selection_glyph":null},"id":"6a54b16e-1b27-41a6-b2fb-45259e5b174b","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":["2018-05-31T16:22:31.064827","2018-05-31T16:23:34.875007","2018-06-25T14:36:01.228092","2018-06-25T14:56:10.766647","2018-06-26T01:00:14.555477","2018-06-27T01:00:22.052019","2018-06-28T01:00:21.513147","2018-06-29T01:00:22.476578","2018-06-30T01:00:24.224710","2018-07-01T01:00:25.511597","2018-07-02T01:00:24.422766","2018-07-03T01:00:23.460390","2018-07-04T01:00:28.309859","2018-07-05T01:00:54.879811","2018-07-06T01:00:26.537881","2018-07-07T01:00:26.895856","2018-07-08T01:00:29.161379","2018-07-09T01:00:28.473588","2018-07-10T01:00:27.613517","2018-07-11T01:00:16.129835","2018-07-12T01:02:27.080409","2018-07-13T01:00:19.554408","2018-07-14T01:00:22.178614","2018-07-15T01:00:38.036625","2018-07-16T01:01:26.903659"],"y":{"__ndarray__":"AAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUA=","dtype":"float64","shape":[25]}}},"id":"fd61eee8-80ac-406e-9711-1d14c2e7d2e1","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUA=","dtype":"float64","shape":[25]}}},"id":"62567e6c-da6e-4af0-8071-37cf85d9ca6c","type":"ColumnDataSource"},{"attributes":{"line_color":{"value":"orange"},"x":{"field":"x"},"y":{"field":"y"}},"id":"8cd25382-5c37-4b81-9d8b-b87e89b91ba7","type":"Line"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkA=","dtype":"float64","shape":[25]}}},"id":"3ecad6ef-5a29-4f24-800e-ab43070f8a52","type":"ColumnDataSource"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"dabb8b6e-9eb4-4444-a37a-4bf7181cf615","type":"Line"},{"attributes":{"data_source":{"id":"e0ecfee9-6ba6-433f-9364-90b3583d3ec5","type":"ColumnDataSource"},"glyph":{"id":"8cd25382-5c37-4b81-9d8b-b87e89b91ba7","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"dabb8b6e-9eb4-4444-a37a-4bf7181cf615","type":"Line"},"selection_glyph":null},"id":"30ec13fe-a19f-45d0-988c-331fe4126276","type":"GlyphRenderer"},{"attributes":{},"id":"17541ea6-0467-435e-8bfc-cb7c5c36ee70","type":"BasicTickFormatter"},{"attributes":{"label":{"value":"calibrated fits files"},"renderers":[{"id":"389be021-e56d-4cbd-a710-792ec0802edd","type":"GlyphRenderer"}]},"id":"e98194e3-8786-4b95-b467-3922db06330e","type":"LegendItem"},{"attributes":{"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"ea4727f3-30a4-419d-a4d6-a7073eae08aa","type":"Line"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d5c1000d-556c-4f80-ac77-ca15d66651f9","type":"Line"},{"attributes":{"data_source":{"id":"62567e6c-da6e-4af0-8071-37cf85d9ca6c","type":"ColumnDataSource"},"glyph":{"id":"ea4727f3-30a4-419d-a4d6-a7073eae08aa","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"d5c1000d-556c-4f80-ac77-ca15d66651f9","type":"Line"},"selection_glyph":null},"id":"389be021-e56d-4cbd-a710-792ec0802edd","type":"GlyphRenderer"},{"attributes":{"children":[{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}]},"id":"5d68b34c-771e-4e2e-b5c9-a67ad9ca441b","type":"Row"},{"attributes":{"label":{"value":"rateints fits files"},"renderers":[{"id":"30ec13fe-a19f-45d0-988c-331fe4126276","type":"GlyphRenderer"}]},"id":"7af883db-f635-448b-8db8-37bf0002efa9","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEA=","dtype":"float64","shape":[25]}}},"id":"da4e600d-3c18-41fb-9b3f-870aeedd2c29","type":"ColumnDataSource"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"05784843-10ed-4438-bd6e-0d463711ba2d","type":"Line"},{"attributes":{"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},"ticker":{"id":"60e3c8e5-99b0-4b0d-bb4a-ca374be44bf5","type":"DatetimeTicker"}},"id":"c5d7b825-7dc4-4c95-a88c-c6d500f94595","type":"Grid"},{"attributes":{"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d5402c2d-94f0-423b-b18c-ef224b8f406a","type":"Line"},{"attributes":{"data_source":{"id":"e6f95491-b253-40ed-a16e-661fea38d86a","type":"ColumnDataSource"},"glyph":{"id":"d5402c2d-94f0-423b-b18c-ef224b8f406a","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"05784843-10ed-4438-bd6e-0d463711ba2d","type":"Line"},"selection_glyph":null},"id":"fcc1ac07-0148-4437-9955-2be6428f7127","type":"GlyphRenderer"},{"attributes":{"axis_label":"Count","formatter":{"id":"17541ea6-0467-435e-8bfc-cb7c5c36ee70","type":"BasicTickFormatter"},"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},"ticker":{"id":"5c0f5335-6fac-4ac4-9a27-83328575da61","type":"BasicTicker"}},"id":"897265b9-a8a5-4847-be9b-7014127bfdd9","type":"LinearAxis"},{"attributes":{"fill_color":{"value":"red"},"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"6dbbcc4f-d6cc-438d-b26f-aaa79519314b","type":"Circle"},{"attributes":{},"id":"5c0f5335-6fac-4ac4-9a27-83328575da61","type":"BasicTicker"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"f8cf0dda-d3ec-4ac4-a436-1c794cabac31","type":"Circle"},{"attributes":{"data_source":{"id":"da4e600d-3c18-41fb-9b3f-870aeedd2c29","type":"ColumnDataSource"},"glyph":{"id":"6dbbcc4f-d6cc-438d-b26f-aaa79519314b","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"f8cf0dda-d3ec-4ac4-a436-1c794cabac31","type":"Circle"},"selection_glyph":null},"id":"0ec5dc01-578b-4520-b1f0-79c233afe57d","type":"GlyphRenderer"},{"attributes":{"dimension":1,"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},"ticker":{"id":"5c0f5335-6fac-4ac4-9a27-83328575da61","type":"BasicTicker"}},"id":"03912cf7-ceeb-48cf-9fc5-60a6b5db6ba9","type":"Grid"},{"attributes":{"fill_color":{"value":"orange"},"line_color":{"value":"orange"},"x":{"field":"x"},"y":{"field":"y"}},"id":"a27f2bc1-f9cc-4c16-b76e-05da21455cb3","type":"Asterisk"},{"attributes":{"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}},"id":"60e19b94-81f3-4a5b-a417-d28f1a9384cd","type":"PanTool"},{"attributes":{"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"cc759e9c-1128-4e42-af41-78306d4ede68","type":"Line"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"d0067da3-ce29-4f1f-afb5-248a3854f398","type":"PanTool"},{"id":"dd1f44ac-5912-4463-847e-69047d3269c6","type":"BoxZoomTool"},{"id":"c437f336-22d4-47ab-92b8-512a5c8dd976","type":"ResetTool"},{"id":"b8b7f68b-f8b0-441c-bad7-6e06ffa24787","type":"SaveTool"}]},"id":"9a55c09a-9401-4b7d-9aed-3c5e0a544aa4","type":"Toolbar"},{"attributes":{"callback":null},"id":"1da94554-25f9-46c4-b0bb-9c46c535e68e","type":"DataRange1d"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEA=","dtype":"float64","shape":[25]}}},"id":"9043076c-5800-446f-b3e6-cc5b204ab9ac","type":"ColumnDataSource"},{"attributes":{},"id":"be295c94-1ce5-4f44-be55-ef19af5b7671","type":"ToolEvents"},{"attributes":{"line_color":{"value":"blue"},"line_width":{"value":2},"x":{"field":"x"},"y":{"field":"y"}},"id":"b2ef6cd5-59af-4483-86f9-bdbc1c764b7e","type":"Line"},{"attributes":{"label":{"value":"Free bytes"},"renderers":[{"id":"fcc1ac07-0148-4437-9955-2be6428f7127","type":"GlyphRenderer"}]},"id":"1514e9e9-9c67-4ecb-a74f-acff2d0a0039","type":"LegendItem"},{"attributes":{"plot":null,"text":"Total File Counts by Type"},"id":"356efb19-c8eb-4b9b-a288-ea51e50c11cc","type":"Title"},{"attributes":{"label":{"value":"Total size"},"renderers":[{"id":"07133336-7067-4cb7-81c1-ff7ab495d293","type":"GlyphRenderer"}]},"id":"1586667e-5b34-4667-8fcc-d547d01e2cb3","type":"LegendItem"},{"attributes":{"label":{"value":"calibrated fits files"},"renderers":[{"id":"f6ea966e-deca-48a0-8c2b-1b01853a54e4","type":"GlyphRenderer"}]},"id":"c5a144c2-97d6-4219-a8a1-d87ebc1efdd0","type":"LegendItem"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"8f14093d-f439-41d4-989f-af03f433d33f","type":"AdaptiveTicker"},{"attributes":{"months":[0,4,8]},"id":"4a1935a4-65c1-4d7a-98fc-ac775f23b23b","type":"MonthsTicker"},{"attributes":{"overlay":{"id":"c7f5d9b9-5039-47df-bcd2-2733ae077aea","type":"BoxAnnotation"},"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}},"id":"3511cf69-feab-4da0-8cfd-2f7f8c95571f","type":"BoxZoomTool"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d8f3e663-8ada-41a9-bb07-393c45dd7879","type":"Line"},{"attributes":{"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}},"id":"0abfbcc4-d9c3-4399-9c37-d1ee428c0b0a","type":"ResetTool"},{"attributes":{"months":[0,6]},"id":"aba8ad3a-1c3c-492a-bb6f-8a25b3d80d59","type":"MonthsTicker"},{"attributes":{},"id":"34e8ec95-f34a-49eb-8ceb-b9619778b25b","type":"YearsTicker"},{"attributes":{"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}},"id":"d56a4637-bebd-49de-b1d9-e99f0cef0805","type":"SaveTool"},{"attributes":{"line_color":{"value":"purple"},"x":{"field":"x"},"y":{"field":"y"}},"id":"bf65850a-36ca-4ab7-b321-5f06917ece37","type":"Line"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"c7f5d9b9-5039-47df-bcd2-2733ae077aea","type":"BoxAnnotation"},{"attributes":{"items":[{"id":"b43d9294-afb0-4d6b-a9c2-e4b7ab4cc37e","type":"LegendItem"},{"id":"b2b98280-f2ff-4f9e-b224-6b4d6faac3b1","type":"LegendItem"},{"id":"c5a144c2-97d6-4219-a8a1-d87ebc1efdd0","type":"LegendItem"},{"id":"cfd52bd8-bc4e-44d5-bead-5fb85f365648","type":"LegendItem"},{"id":"4b84a15e-33b0-462f-8867-58db605e8fcf","type":"LegendItem"},{"id":"d8cd6315-dee8-47ac-a8d4-8741d447397a","type":"LegendItem"}],"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"d35ed1b7-dbd6-4136-b64f-db33470af8d7","type":"Legend"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUA=","dtype":"float64","shape":[25]}}},"id":"2eb3ae3d-acc6-4e48-89aa-e899c1bedef5","type":"ColumnDataSource"},{"attributes":{"num_minor_ticks":5},"id":"60e3c8e5-99b0-4b0d-bb4a-ca374be44bf5","type":"DatetimeTicker"},{"attributes":{"label":{"value":"Total fits files"},"renderers":[{"id":"090f8653-b156-44b8-80cc-401370848453","type":"GlyphRenderer"}]},"id":"b43d9294-afb0-4d6b-a9c2-e4b7ab4cc37e","type":"LegendItem"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"e9e8411c-bd03-4950-a2b5-bec85e18bf32","type":"Line"},{"attributes":{"below":[{"id":"fc52962a-2146-449d-b34e-8511b1d8425f","type":"DatetimeAxis"}],"left":[{"id":"078fa362-2400-4b4f-93a6-fd77c1512c64","type":"LinearAxis"}],"renderers":[{"id":"fc52962a-2146-449d-b34e-8511b1d8425f","type":"DatetimeAxis"},{"id":"87cc6cc9-f3b9-4ee5-8b39-da3271d0cc26","type":"Grid"},{"id":"078fa362-2400-4b4f-93a6-fd77c1512c64","type":"LinearAxis"},{"id":"97b1e295-8be8-4aeb-8a6a-4c0d9e5b5c23","type":"Grid"},{"id":"a185894f-c931-4e1f-b771-a26b13dc0fee","type":"BoxAnnotation"},{"id":"d35ed1b7-dbd6-4136-b64f-db33470af8d7","type":"Legend"},{"id":"090f8653-b156-44b8-80cc-401370848453","type":"GlyphRenderer"},{"id":"daf0cb77-8c45-48b0-8c35-e225e4c24413","type":"GlyphRenderer"},{"id":"74dc8b93-7ef4-41c4-8c51-a27fec47ef29","type":"GlyphRenderer"},{"id":"8947c0af-13a9-472b-a211-29d935efe20e","type":"GlyphRenderer"},{"id":"f6ea966e-deca-48a0-8c2b-1b01853a54e4","type":"GlyphRenderer"},{"id":"00b34c30-92d1-4360-af90-cb20df645ff4","type":"GlyphRenderer"},{"id":"08b92294-79eb-4a8e-b8cf-8da59ce3b366","type":"GlyphRenderer"},{"id":"4149b3f1-1e16-43fa-ae52-a6cd1817624b","type":"GlyphRenderer"},{"id":"122c4a3a-74db-4c47-ac70-b32015b9a1d7","type":"GlyphRenderer"},{"id":"2742f0df-eaff-4d7e-86be-19a7a71e427f","type":"GlyphRenderer"},{"id":"a709dd5a-3ccb-4402-a7a4-207db94831c6","type":"GlyphRenderer"},{"id":"d38143a2-315e-4851-8110-b701bcc16f5c","type":"GlyphRenderer"}],"title":{"id":"356efb19-c8eb-4b9b-a288-ea51e50c11cc","type":"Title"},"tool_events":{"id":"be295c94-1ce5-4f44-be55-ef19af5b7671","type":"ToolEvents"},"toolbar":{"id":"9a55c09a-9401-4b7d-9aed-3c5e0a544aa4","type":"Toolbar"},"toolbar_location":null,"x_range":{"id":"1da94554-25f9-46c4-b0bb-9c46c535e68e","type":"DataRange1d"},"y_range":{"id":"d0957cea-00b2-45e0-9068-077b3e2ad752","type":"DataRange1d"}},"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"5bc99ac8-786a-4fa6-8bf5-d059582c430b","type":"MonthsTicker"},{"attributes":{"data_source":{"id":"6176765d-1ae3-49cf-890e-149b30109778","type":"ColumnDataSource"},"glyph":{"id":"bf65850a-36ca-4ab7-b321-5f06917ece37","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"e9e8411c-bd03-4950-a2b5-bec85e18bf32","type":"Line"},"selection_glyph":null},"id":"a709dd5a-3ccb-4402-a7a4-207db94831c6","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAmu+/EUAAAACY778RQAAAAIxdzwVAAAAAhF3PBUAAAACEXc8FQAAAAIRdzwVAAAAAfDesBUAAAADoD4gFQAAAADgigwVAAAAAOCKDBUAAAAA4IoMFQAAAADgigwVAAAAAQNd9BUAAAAA8130FQAAAADzXfQVAAAAAQNd9BUAAAAA8130FQAAAACzTfQVAAAAAKNN9BUAAAAAo030FQAAAACjTfQVAAAAAGNN9BUAAAAAY030FQAAAABjTfQVAAAAAGNN9BUA=","dtype":"float64","shape":[25]}}},"id":"88e5d5a0-5799-4e4f-b700-03bf82b3e590","type":"ColumnDataSource"},{"attributes":{"months":[0,4,8]},"id":"a383c7ef-aa46-4ea0-9170-90d969c72130","type":"MonthsTicker"},{"attributes":{"data_source":{"id":"7cb7b3cd-b926-4727-a586-149cf4b6cce5","type":"ColumnDataSource"},"glyph":{"id":"03c120a0-3c70-48da-a521-30f83c95886c","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"3d826d5c-2665-4f04-af39-4892ccc1c68f","type":"Circle"},"selection_glyph":null},"id":"9918c67a-d21d-4295-8ab8-2ebdc206e2aa","type":"GlyphRenderer"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"3d826d5c-2665-4f04-af39-4892ccc1c68f","type":"Circle"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"780e2bec-0869-4f66-a8eb-86517ec4797d","type":"DaysTicker"},{"attributes":{"callback":null},"id":"1b71728c-821c-48c7-b8a4-eebbbe0fb07c","type":"DataRange1d"},{"attributes":{"fill_color":{"value":"black"},"x":{"field":"x"},"y":{"field":"y"}},"id":"343297b8-a291-4880-a1d2-c76c76fe04fe","type":"Circle"},{"attributes":{"fill_color":{"value":"green"},"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"03c120a0-3c70-48da-a521-30f83c95886c","type":"Circle"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523]}},"id":"b7db8458-e70a-48c1-bfca-f459654b85dc","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395]}},"id":"40a4f74b-3311-4671-bc08-1f106d5d1638","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608]}},"id":"6176765d-1ae3-49cf-890e-149b30109778","type":"ColumnDataSource"},{"attributes":{"axis_label":"GB","formatter":{"id":"a82b6824-8ee4-4317-b2c9-63f7a9682699","type":"BasicTickFormatter"},"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},"ticker":{"id":"f40d5e9f-3321-45f3-bc69-3895a2509c4b","type":"BasicTicker"}},"id":"5b314523-4073-4634-97ae-892f36f4eb47","type":"LinearAxis"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"a6e63c2f-fa0d-41af-a762-ae820b7131c5","type":"Circle"},{"attributes":{"callback":null},"id":"946901ca-a7cc-4b26-9a74-0a32b50e3580","type":"DataRange1d"},{"attributes":{"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},"ticker":{"id":"a7080a57-e39e-4ea3-9922-1daf96a4c605","type":"DatetimeTicker"}},"id":"4d69bf08-38f1-4c65-b5a8-f1303d5abebb","type":"Grid"},{"attributes":{"label":{"value":"uncalibrated fits files"},"renderers":[{"id":"74dc8b93-7ef4-41c4-8c51-a27fec47ef29","type":"GlyphRenderer"}]},"id":"b2b98280-f2ff-4f9e-b224-6b4d6faac3b1","type":"LegendItem"},{"attributes":{"axis_label":"Date","formatter":{"id":"0734274f-b23d-4a3c-91b9-d0575b61f79e","type":"DatetimeTickFormatter"},"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},"ticker":{"id":"60e3c8e5-99b0-4b0d-bb4a-ca374be44bf5","type":"DatetimeTicker"}},"id":"39cd38b6-a3a2-4f45-87be-bfc5a4594331","type":"DatetimeAxis"},{"attributes":{},"id":"f40d5e9f-3321-45f3-bc69-3895a2509c4b","type":"BasicTicker"},{"attributes":{"fill_color":{"value":"blue"},"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"3271eb39-dbc9-47e0-9786-775ed673a844","type":"Circle"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"eaccf055-5c89-4da1-b5ab-c023e266d74a","type":"Circle"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"47fd4883-d39c-4097-a327-6cd440081906","type":"MonthsTicker"},{"attributes":{"data_source":{"id":"88e5d5a0-5799-4e4f-b700-03bf82b3e590","type":"ColumnDataSource"},"glyph":{"id":"3271eb39-dbc9-47e0-9786-775ed673a844","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"eaccf055-5c89-4da1-b5ab-c023e266d74a","type":"Circle"},"selection_glyph":null},"id":"73dd8efa-6dc3-4a3b-8be2-9be1900f73a3","type":"GlyphRenderer"},{"attributes":{"num_minor_ticks":5},"id":"a7080a57-e39e-4ea3-9922-1daf96a4c605","type":"DatetimeTicker"},{"attributes":{"data_source":{"id":"60fae463-96e0-4499-aa29-18809270b8f7","type":"ColumnDataSource"},"glyph":{"id":"343297b8-a291-4880-a1d2-c76c76fe04fe","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"a6e63c2f-fa0d-41af-a762-ae820b7131c5","type":"Circle"},"selection_glyph":null},"id":"d08440e5-5498-41d1-aa8c-ce6b0ca63a2d","type":"GlyphRenderer"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"line_width":{"value":2},"x":{"field":"x"},"y":{"field":"y"}},"id":"f9b0d0a3-04bb-43ab-9315-ea85c030078b","type":"Line"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"e7ae2693-6d21-48c9-b70e-912dc51aab05","type":"MonthsTicker"},{"attributes":{"plot":null,"text":"Total File Counts"},"id":"a7e6fe59-e3b5-4ee5-95c0-972cbb6ee11a","type":"Title"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"a2bd0f68-bf54-4997-a1c5-ef0093dee9b2","type":"Triangle"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"a1b065d4-40dc-4513-b9f8-3c5ecee18efa","type":"MonthsTicker"},{"attributes":{"dimension":1,"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},"ticker":{"id":"f40d5e9f-3321-45f3-bc69-3895a2509c4b","type":"BasicTicker"}},"id":"b6b367f9-d6c3-4e06-b1c9-4d68b58969cb","type":"Grid"},{"attributes":{"data_source":{"id":"0d6623a5-bda0-433c-980a-9e263215cf1f","type":"ColumnDataSource"},"glyph":{"id":"cc759e9c-1128-4e42-af41-78306d4ede68","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"c27c86e6-b1e6-4a6e-92e5-ce6fdc824142","type":"Line"},"selection_glyph":null},"id":"74dc8b93-7ef4-41c4-8c51-a27fec47ef29","type":"GlyphRenderer"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"5d7cc1f3-dba7-40c8-a0ba-478384af3367","type":"DaysTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAzCCADEAAAADQIIAMQAAAADpRGBVAAAAAPlEYFUAAAAA+URgVQAAAAD5RGBVAAAAAQuQpFUAAAAAM+DsVQAAAAORuPhVAAAAA5G4+FUAAAADkbj4VQAAAAORuPhVAAAAAYBRBFUAAAABiFEEVQAAAAGIUQRVAAAAAYBRBFUAAAABiFEEVQAAAAGoWQRVAAAAAbBZBFUAAAABsFkEVQAAAAGwWQRVAAAAAdBZBFUAAAAB0FkEVQAAAAHQWQRVAAAAAdBZBFUA=","dtype":"float64","shape":[25]}}},"id":"395ed7d4-4904-4960-a4f4-aad38a5350e5","type":"ColumnDataSource"},{"attributes":{"days":[1,8,15,22]},"id":"cae50c1d-cc54-48f5-a799-f298cbd90e2f","type":"DaysTicker"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"820b0330-109c-4a99-89c0-2efaf0879383","type":"AdaptiveTicker"},{"attributes":{"data_source":{"id":"40a4f74b-3311-4671-bc08-1f106d5d1638","type":"ColumnDataSource"},"glyph":{"id":"c6324ce5-fc39-4ae9-9a9b-d2618aff237d","type":"Triangle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"a2bd0f68-bf54-4997-a1c5-ef0093dee9b2","type":"Triangle"},"selection_glyph":null},"id":"4149b3f1-1e16-43fa-ae52-a6cd1817624b","type":"GlyphRenderer"},{"attributes":{},"id":"430c0afa-d7a7-4fb9-a437-1495e640d03c","type":"BasicTickFormatter"},{"attributes":{"callback":null},"id":"b4878e82-6860-40c9-96c8-fe4ad588cf06","type":"DataRange1d"},{"attributes":{"fill_color":{"value":"black"},"x":{"field":"x"},"y":{"field":"y"}},"id":"8a43e9ab-6738-4936-9ad8-f24926210c79","type":"Circle"},{"attributes":{"days":[1,15]},"id":"4887862b-a5d2-4034-9afe-143cbbd2b9d6","type":"DaysTicker"},{"attributes":{},"id":"569f6ac8-0faf-42af-8378-dafb5f299964","type":"ToolEvents"},{"attributes":{"axis_label":"Date","formatter":{"id":"c57746ea-3aaf-44c4-a6fe-a4ce744adc55","type":"DatetimeTickFormatter"},"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},"ticker":{"id":"a7080a57-e39e-4ea3-9922-1daf96a4c605","type":"DatetimeTicker"}},"id":"6b0fc3b4-7951-45b5-906d-cd23f852ba81","type":"DatetimeAxis"},{"attributes":{"data_source":{"id":"b7db8458-e70a-48c1-bfca-f459654b85dc","type":"ColumnDataSource"},"glyph":{"id":"8a43e9ab-6738-4936-9ad8-f24926210c79","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"0357c241-eecb-48f0-8199-55aa2a374fa3","type":"Circle"},"selection_glyph":null},"id":"daf0cb77-8c45-48b0-8c35-e225e4c24413","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAmu+/EUAAAACY778RQAAAAIxdzwVAAAAAhF3PBUAAAACEXc8FQAAAAIRdzwVAAAAAfDesBUAAAADoD4gFQAAAADgigwVAAAAAOCKDBUAAAAA4IoMFQAAAADgigwVAAAAAQNd9BUAAAAA8130FQAAAADzXfQVAAAAAQNd9BUAAAAA8130FQAAAACzTfQVAAAAAKNN9BUAAAAAo030FQAAAACjTfQVAAAAAGNN9BUAAAAAY030FQAAAABjTfQVAAAAAGNN9BUA=","dtype":"float64","shape":[25]}}},"id":"e6f95491-b253-40ed-a16e-661fea38d86a","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAzCCADEAAAADQIIAMQAAAADpRGBVAAAAAPlEYFUAAAAA+URgVQAAAAD5RGBVAAAAAQuQpFUAAAAAM+DsVQAAAAORuPhVAAAAA5G4+FUAAAADkbj4VQAAAAORuPhVAAAAAYBRBFUAAAABiFEEVQAAAAGIUQRVAAAAAYBRBFUAAAABiFEEVQAAAAGoWQRVAAAAAbBZBFUAAAABsFkEVQAAAAGwWQRVAAAAAdBZBFUAAAAB0FkEVQAAAAHQWQRVAAAAAdBZBFUA=","dtype":"float64","shape":[25]}}},"id":"7cb7b3cd-b926-4727-a586-149cf4b6cce5","type":"ColumnDataSource"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"60e19b94-81f3-4a5b-a417-d28f1a9384cd","type":"PanTool"},{"id":"3511cf69-feab-4da0-8cfd-2f7f8c95571f","type":"BoxZoomTool"},{"id":"0abfbcc4-d9c3-4399-9c37-d1ee428c0b0a","type":"ResetTool"},{"id":"d56a4637-bebd-49de-b1d9-e99f0cef0805","type":"SaveTool"}]},"id":"2a71acb8-3393-4b80-8cc7-e7a364034f52","type":"Toolbar"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"0357c241-eecb-48f0-8199-55aa2a374fa3","type":"Circle"},{"attributes":{"days":[1,15]},"id":"c6dcd46e-6f6e-483e-b6ac-edf076f1e76b","type":"DaysTicker"},{"attributes":{"fill_color":{"value":"green"},"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c6324ce5-fc39-4ae9-9a9b-d2618aff237d","type":"Triangle"},{"attributes":{"days":[1,15]},"id":"668c1d3e-9b19-4a7b-b281-58ae881f0c5c","type":"DaysTicker"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"7670f17f-3c98-45e7-8bdb-69335633e9c9","type":"DaysTicker"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"d5557dca-8962-4f83-a335-d8adc4bf44e8","type":"AdaptiveTicker"},{"attributes":{},"id":"1c71fb97-afb7-4369-9252-61116aea3045","type":"DatetimeTickFormatter"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c27c86e6-b1e6-4a6e-92e5-ce6fdc824142","type":"Line"},{"attributes":{"months":[0,6]},"id":"0322ffe1-72d7-4483-9bb7-e1691ca33a1a","type":"MonthsTicker"},{"attributes":{"label":{"value":"Used bytes"},"renderers":[{"id":"e72ee102-c962-4ccb-a3a8-4946f7235bbf","type":"GlyphRenderer"}]},"id":"12f1d485-d57e-4143-ba94-b56f83a00786","type":"LegendItem"},{"attributes":{},"id":"7f773bc5-4380-41ba-a0e2-30fa1585b95f","type":"YearsTicker"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"c9018a59-4d70-49fc-bad4-0d810f532b84","type":"AdaptiveTicker"},{"attributes":{"callback":null},"id":"d0957cea-00b2-45e0-9068-077b3e2ad752","type":"DataRange1d"},{"attributes":{"days":[1,8,15,22]},"id":"7a082768-6e01-4baa-a714-9de998ce4a7f","type":"DaysTicker"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"e50fe3d8-54b0-434a-aa94-61da2599db2b","type":"DaysTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEA=","dtype":"float64","shape":[25]}}},"id":"1b451d88-6227-4226-93be-5561316953dd","type":"ColumnDataSource"},{"attributes":{"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"1db199d0-229b-489f-8aef-bd9804f01791","type":"Line"},{"attributes":{},"id":"cb578861-ab36-4b07-9779-8840113a3321","type":"ToolEvents"},{"attributes":{"fill_color":{"value":"blue"},"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"5242806a-3b9b-4aed-a8d9-835cf51b58dd","type":"Circle"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"5b98adf0-5c75-42a3-a10b-ffb99c99e376","type":"Line"},{"attributes":{"data_source":{"id":"395ed7d4-4904-4960-a4f4-aad38a5350e5","type":"ColumnDataSource"},"glyph":{"id":"1db199d0-229b-489f-8aef-bd9804f01791","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"5b98adf0-5c75-42a3-a10b-ffb99c99e376","type":"Line"},"selection_glyph":null},"id":"e72ee102-c962-4ccb-a3a8-4946f7235bbf","type":"GlyphRenderer"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"0ffa5373-40c5-45d0-b9be-2c538b27ec6e","type":"Circle"},{"attributes":{"data_source":{"id":"1b451d88-6227-4226-93be-5561316953dd","type":"ColumnDataSource"},"glyph":{"id":"5242806a-3b9b-4aed-a8d9-835cf51b58dd","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"0ffa5373-40c5-45d0-b9be-2c538b27ec6e","type":"Circle"},"selection_glyph":null},"id":"917f7296-eab9-4ff6-936c-655cbca1ba6f","type":"GlyphRenderer"},{"attributes":{"axis_label":"Date","formatter":{"id":"1c71fb97-afb7-4369-9252-61116aea3045","type":"DatetimeTickFormatter"},"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},"ticker":{"id":"a380724e-edb2-4a0b-9b94-b8d9a054d184","type":"DatetimeTicker"}},"id":"fc52962a-2146-449d-b34e-8511b1d8425f","type":"DatetimeAxis"},{"attributes":{"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},"ticker":{"id":"a380724e-edb2-4a0b-9b94-b8d9a054d184","type":"DatetimeTicker"}},"id":"87cc6cc9-f3b9-4ee5-8b39-da3271d0cc26","type":"Grid"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"5838296d-3520-4b52-aa8b-a9d6a1245574","type":"DaysTicker"},{"attributes":{"below":[{"id":"6b0fc3b4-7951-45b5-906d-cd23f852ba81","type":"DatetimeAxis"}],"left":[{"id":"5b314523-4073-4634-97ae-892f36f4eb47","type":"LinearAxis"}],"renderers":[{"id":"6b0fc3b4-7951-45b5-906d-cd23f852ba81","type":"DatetimeAxis"},{"id":"4d69bf08-38f1-4c65-b5a8-f1303d5abebb","type":"Grid"},{"id":"5b314523-4073-4634-97ae-892f36f4eb47","type":"LinearAxis"},{"id":"b6b367f9-d6c3-4e06-b1c9-4d68b58969cb","type":"Grid"},{"id":"7ba314ec-8316-460a-8b2b-b1a0bafcb5e7","type":"BoxAnnotation"},{"id":"4f72b2b8-5c90-4144-a810-d9ccd95dd35c","type":"Legend"},{"id":"07133336-7067-4cb7-81c1-ff7ab495d293","type":"GlyphRenderer"},{"id":"0ec5dc01-578b-4520-b1f0-79c233afe57d","type":"GlyphRenderer"},{"id":"fcc1ac07-0148-4437-9955-2be6428f7127","type":"GlyphRenderer"},{"id":"73dd8efa-6dc3-4a3b-8be2-9be1900f73a3","type":"GlyphRenderer"},{"id":"e72ee102-c962-4ccb-a3a8-4946f7235bbf","type":"GlyphRenderer"},{"id":"9918c67a-d21d-4295-8ab8-2ebdc206e2aa","type":"GlyphRenderer"}],"title":{"id":"d3ba7f42-6fd6-4517-8035-9487b8d743d6","type":"Title"},"tool_events":{"id":"cb578861-ab36-4b07-9779-8840113a3321","type":"ToolEvents"},"toolbar":{"id":"33855718-dfdf-44df-ba72-6eaea75f3ffa","type":"Toolbar"},"toolbar_location":null,"x_range":{"id":"73362e54-e29f-4fd6-aa98-839873325f8c","type":"DataRange1d"},"y_range":{"id":"b4878e82-6860-40c9-96c8-fe4ad588cf06","type":"DataRange1d"}},"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"3d553f46-80be-49c7-be60-1385dc59400d","type":"PanTool"},{"id":"02f67862-ff19-4f8b-aa63-1dace43bc79d","type":"BoxZoomTool"},{"id":"1fd3c902-bb06-4cf0-9e62-ecc08e329065","type":"ResetTool"},{"id":"7d42f462-435f-45a9-ba06-921414a8c7d7","type":"SaveTool"}]},"id":"33855718-dfdf-44df-ba72-6eaea75f3ffa","type":"Toolbar"},{"attributes":{"num_minor_ticks":5},"id":"a380724e-edb2-4a0b-9b94-b8d9a054d184","type":"DatetimeTicker"},{"attributes":{"callback":null},"id":"73362e54-e29f-4fd6-aa98-839873325f8c","type":"DataRange1d"},{"attributes":{"axis_label":"Count","formatter":{"id":"430c0afa-d7a7-4fb9-a437-1495e640d03c","type":"BasicTickFormatter"},"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},"ticker":{"id":"5ffe610f-ab71-44b5-8644-1563916683b2","type":"BasicTicker"}},"id":"078fa362-2400-4b4f-93a6-fd77c1512c64","type":"LinearAxis"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"c96f8559-69d8-44f5-9e38-aa4ad5566d2b","type":"DaysTicker"},{"attributes":{},"id":"5ffe610f-ab71-44b5-8644-1563916683b2","type":"BasicTicker"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"74b33b26-0ae9-4b87-8e22-77fcbed68c12","type":"AdaptiveTicker"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"ece6f6fd-57d4-4754-a201-2abfebdb8395","type":"MonthsTicker"},{"attributes":{"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"3d553f46-80be-49c7-be60-1385dc59400d","type":"PanTool"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"588ff9bb-6d90-4100-9779-bcbc2622c242","type":"AdaptiveTicker"},{"attributes":{"dimension":1,"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},"ticker":{"id":"5ffe610f-ab71-44b5-8644-1563916683b2","type":"BasicTicker"}},"id":"97b1e295-8be8-4aeb-8a6a-4c0d9e5b5c23","type":"Grid"},{"attributes":{},"id":"c57746ea-3aaf-44c4-a6fe-a4ce744adc55","type":"DatetimeTickFormatter"},{"attributes":{"months":[0,6]},"id":"229e7c7f-f287-4d19-8d65-b8ef3acfd92c","type":"MonthsTicker"},{"attributes":{"overlay":{"id":"7ba314ec-8316-460a-8b2b-b1a0bafcb5e7","type":"BoxAnnotation"},"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"02f67862-ff19-4f8b-aa63-1dace43bc79d","type":"BoxZoomTool"},{"attributes":{"data_source":{"id":"bd516d7e-f534-41cb-8f33-27ab029eb302","type":"ColumnDataSource"},"glyph":{"id":"61ac20e3-7efc-4faf-805f-b88fa6901b71","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"b885029e-97a8-43ef-9048-05bc99f11df2","type":"Line"},"selection_glyph":null},"id":"07133336-7067-4cb7-81c1-ff7ab495d293","type":"GlyphRenderer"},{"attributes":{"x":{"field":"x"},"y":{"field":"y"}},"id":"56b132b7-949c-4f60-9c93-b5f809a97697","type":"Line"},{"attributes":{"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"1fd3c902-bb06-4cf0-9e62-ecc08e329065","type":"ResetTool"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523]}},"id":"ecc92d83-3df6-4023-bddc-aa395848eb31","type":"ColumnDataSource"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"cc0e1ef1-18a0-42a3-9801-01d5ad33454a","type":"AdaptiveTicker"},{"attributes":{"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"7d42f462-435f-45a9-ba06-921414a8c7d7","type":"SaveTool"},{"attributes":{"data_source":{"id":"ecc92d83-3df6-4023-bddc-aa395848eb31","type":"ColumnDataSource"},"glyph":{"id":"56b132b7-949c-4f60-9c93-b5f809a97697","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"d8f3e663-8ada-41a9-bb07-393c45dd7879","type":"Line"},"selection_glyph":null},"id":"090f8653-b156-44b8-80cc-401370848453","type":"GlyphRenderer"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"b885029e-97a8-43ef-9048-05bc99f11df2","type":"Line"},{"attributes":{"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"d0067da3-ce29-4f1f-afb5-248a3854f398","type":"PanTool"},{"attributes":{},"id":"a82b6824-8ee4-4317-b2c9-63f7a9682699","type":"BasicTickFormatter"},{"attributes":{"months":[0,4,8]},"id":"8047885b-5b1e-4fbd-b08e-f0b2c840c48d","type":"MonthsTicker"},{"attributes":{"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"b8b7f68b-f8b0-441c-bad7-6e06ffa24787","type":"SaveTool"},{"attributes":{},"id":"3abeccf7-3554-4565-ae1c-d1d14a3592b5","type":"YearsTicker"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"7c2ee7be-cff0-4cbe-a093-4b4376661d0a","type":"MonthsTicker"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"7ba314ec-8316-460a-8b2b-b1a0bafcb5e7","type":"BoxAnnotation"},{"attributes":{"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"61ac20e3-7efc-4faf-805f-b88fa6901b71","type":"Line"},{"attributes":{"overlay":{"id":"a185894f-c931-4e1f-b771-a26b13dc0fee","type":"BoxAnnotation"},"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"dd1f44ac-5912-4463-847e-69047d3269c6","type":"BoxZoomTool"},{"attributes":{"items":[{"id":"1586667e-5b34-4667-8fcc-d547d01e2cb3","type":"LegendItem"},{"id":"1514e9e9-9c67-4ecb-a74f-acff2d0a0039","type":"LegendItem"},{"id":"12f1d485-d57e-4143-ba94-b56f83a00786","type":"LegendItem"}],"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"4f72b2b8-5c90-4144-a810-d9ccd95dd35c","type":"Legend"},{"attributes":{"days":[1,8,15,22]},"id":"c2c3b876-5d22-49ef-9f01-55c4007ec3ff","type":"DaysTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEA=","dtype":"float64","shape":[25]}}},"id":"bd516d7e-f534-41cb-8f33-27ab029eb302","type":"ColumnDataSource"},{"attributes":{"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"c437f336-22d4-47ab-92b8-512a5c8dd976","type":"ResetTool"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983]}},"id":"0d6623a5-bda0-433c-980a-9e263215cf1f","type":"ColumnDataSource"},{"attributes":{"label":{"value":"rate fits files"},"renderers":[{"id":"400ba1e2-7c47-449e-a5e7-7f315638c83c","type":"GlyphRenderer"}]},"id":"ac6ba57d-7622-4cd1-bd92-c5b4e5572cee","type":"LegendItem"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"1bdb589e-ef40-454c-9642-8ab908620c11","type":"DaysTicker"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"a185894f-c931-4e1f-b771-a26b13dc0fee","type":"BoxAnnotation"},{"attributes":{"days":[1,15]},"id":"e8e4d59b-d137-4250-8f08-ce43b20814f3","type":"DaysTicker"},{"attributes":{"below":[{"id":"bf30d024-7169-402f-8d67-ad0a1eaa4e11","type":"DatetimeAxis"}],"left":[{"id":"58a456a6-c6b4-4f8a-bc19-d25c1656c7b2","type":"LinearAxis"}],"renderers":[{"id":"bf30d024-7169-402f-8d67-ad0a1eaa4e11","type":"DatetimeAxis"},{"id":"ad541891-83dc-46a9-b948-177d2dfc7f95","type":"Grid"},{"id":"58a456a6-c6b4-4f8a-bc19-d25c1656c7b2","type":"LinearAxis"},{"id":"c76f424b-42f3-43ac-baad-87c8aeca63ca","type":"Grid"},{"id":"eeb23522-001e-4c13-917d-456ed3542c3e","type":"BoxAnnotation"},{"id":"38e75e64-419a-4232-b8ef-7e0bbf004f25","type":"Legend"},{"id":"2220f817-c9f0-436a-9870-48937a96dc9f","type":"GlyphRenderer"},{"id":"d08440e5-5498-41d1-aa8c-ce6b0ca63a2d","type":"GlyphRenderer"},{"id":"bddb7bad-e12c-44f7-957d-e7f2a3ae77d0","type":"GlyphRenderer"},{"id":"6a54b16e-1b27-41a6-b2fb-45259e5b174b","type":"GlyphRenderer"},{"id":"389be021-e56d-4cbd-a710-792ec0802edd","type":"GlyphRenderer"},{"id":"2f6e66c7-3f51-4495-b45f-702c18653a43","type":"GlyphRenderer"},{"id":"400ba1e2-7c47-449e-a5e7-7f315638c83c","type":"GlyphRenderer"},{"id":"d281fffc-3cef-4d70-aede-32384969d529","type":"GlyphRenderer"},{"id":"30ec13fe-a19f-45d0-988c-331fe4126276","type":"GlyphRenderer"},{"id":"1e453549-6c01-4a53-b9e2-539b40013c11","type":"GlyphRenderer"},{"id":"25952b66-5b1a-4140-b020-9991de572bad","type":"GlyphRenderer"},{"id":"753f5064-2a31-44dd-86ff-14268167e6c9","type":"GlyphRenderer"}],"title":{"id":"1fe3f910-35d5-4171-94ad-44fbcfbd970e","type":"Title"},"tool_events":{"id":"6227ebb1-f485-46c4-840b-55d6d2e7301a","type":"ToolEvents"},"toolbar":{"id":"c18634ea-cb96-4962-bde1-a0f11fcaabb2","type":"Toolbar"},"toolbar_location":null,"x_range":{"id":"8ecefa3a-b82b-4c6f-a31c-987d5214c941","type":"DataRange1d"},"y_range":{"id":"28d23309-f8a5-4d85-921c-cb8311aed547","type":"DataRange1d"}},"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"5816850a-7133-42fe-b05c-d10eb540dc61","type":"DaysTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983]}},"id":"3e678b93-8ffb-4831-a076-df5461d0e613","type":"ColumnDataSource"},{"attributes":{"line_color":{"value":"purple"},"x":{"field":"x"},"y":{"field":"y"}},"id":"3f57063e-a316-43ce-8036-1829c503bd01","type":"Line"},{"attributes":{"data_source":{"id":"2eb3ae3d-acc6-4e48-89aa-e899c1bedef5","type":"ColumnDataSource"},"glyph":{"id":"a27f2bc1-f9cc-4c16-b76e-05da21455cb3","type":"Asterisk"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"a3effb8d-8d01-423c-b43d-dd854e3dfd15","type":"Asterisk"},"selection_glyph":null},"id":"1e453549-6c01-4a53-b9e2-539b40013c11","type":"GlyphRenderer"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"d5e24009-af1c-4675-b54e-de5ae5fcd145","type":"AdaptiveTicker"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"a3effb8d-8d01-423c-b43d-dd854e3dfd15","type":"Asterisk"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"1a2a9e67-e327-4a29-afa4-5b523c48c0d8","type":"AdaptiveTicker"},{"attributes":{"days":[1,8,15,22]},"id":"f68e01c8-23c4-4530-8bf4-a8ef16dfdfde","type":"DaysTicker"},{"attributes":{"data_source":{"id":"df7dea0c-df28-4040-9aef-c71decec7af0","type":"ColumnDataSource"},"glyph":{"id":"0058e57c-0df5-4176-baf9-01f4e6508640","type":"X"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"0bacfb4f-d4f8-42f9-9502-80217f3aebaf","type":"X"},"selection_glyph":null},"id":"d38143a2-315e-4851-8110-b701bcc16f5c","type":"GlyphRenderer"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"e2ae5a1b-3b5a-4b71-a8aa-1e03f2bd4000","type":"MonthsTicker"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"0bacfb4f-d4f8-42f9-9502-80217f3aebaf","type":"X"},{"attributes":{"fill_color":{"value":"purple"},"line_color":{"value":"purple"},"x":{"field":"x"},"y":{"field":"y"}},"id":"0058e57c-0df5-4176-baf9-01f4e6508640","type":"X"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"043c9740-fca3-4e93-8a06-5f551a163c36","type":"AdaptiveTicker"},{"attributes":{"fill_color":{"value":"red"},"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c9d00a60-c8e7-463d-83ee-293026bf8001","type":"Diamond"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"89aeec03-ce45-427f-9481-2429ca81c660","type":"Diamond"},{"attributes":{"data_source":{"id":"3e678b93-8ffb-4831-a076-df5461d0e613","type":"ColumnDataSource"},"glyph":{"id":"c9d00a60-c8e7-463d-83ee-293026bf8001","type":"Diamond"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"89aeec03-ce45-427f-9481-2429ca81c660","type":"Diamond"},"selection_glyph":null},"id":"8947c0af-13a9-472b-a211-29d935efe20e","type":"GlyphRenderer"},{"attributes":{"label":{"value":"rate fits files"},"renderers":[{"id":"08b92294-79eb-4a8e-b8cf-8da59ce3b366","type":"GlyphRenderer"}]},"id":"cfd52bd8-bc4e-44d5-bead-5fb85f365648","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276]}},"id":"780defa9-5161-4103-a451-69f9a095d8f6","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851]}},"id":"2d133071-420c-4dd3-9e0d-802ff92a4700","type":"ColumnDataSource"},{"attributes":{"children":[{"id":"e09bb773-ec12-4283-aea7-abd199a4e2c2","type":"Row"},{"id":"5d68b34c-771e-4e2e-b5c9-a67ad9ca441b","type":"Row"}]},"id":"f06bda53-9ee3-4720-a413-6cedaf3c5a48","type":"Column"},{"attributes":{"data_source":{"id":"1804755b-53e1-407e-bcad-f3c185212ec1","type":"ColumnDataSource"},"glyph":{"id":"9e460312-684d-4d97-b38d-5cfe68685438","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"9b5403e3-54af-49c2-9eca-d10d726bad67","type":"Line"},"selection_glyph":null},"id":"08b92294-79eb-4a8e-b8cf-8da59ce3b366","type":"GlyphRenderer"},{"attributes":{"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"9e460312-684d-4d97-b38d-5cfe68685438","type":"Line"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"7e915ea1-0c84-45e5-8a19-629ce1eae581","type":"MonthsTicker"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"9b5403e3-54af-49c2-9eca-d10d726bad67","type":"Line"},{"attributes":{"months":[0,6]},"id":"40534f58-506d-4d29-a312-e46245548944","type":"MonthsTicker"},{"attributes":{},"id":"c6d3c3a9-c470-4005-b1d3-ce260c9b03a5","type":"YearsTicker"},{"attributes":{"months":[0,4,8]},"id":"f4223d9d-989c-4e88-862a-568f26cb50ab","type":"MonthsTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0A=","dtype":"float64","shape":[25]}}},"id":"c9a1abc1-ed56-40e3-97fc-cb539891ac3f","type":"ColumnDataSource"},{"attributes":{"sizing_mode":"scale_width","toolbar_location":"above","tools":[{"id":"60e19b94-81f3-4a5b-a417-d28f1a9384cd","type":"PanTool"},{"id":"3511cf69-feab-4da0-8cfd-2f7f8c95571f","type":"BoxZoomTool"},{"id":"0abfbcc4-d9c3-4399-9c37-d1ee428c0b0a","type":"ResetTool"},{"id":"d56a4637-bebd-49de-b1d9-e99f0cef0805","type":"SaveTool"},{"id":"3d553f46-80be-49c7-be60-1385dc59400d","type":"PanTool"},{"id":"02f67862-ff19-4f8b-aa63-1dace43bc79d","type":"BoxZoomTool"},{"id":"1fd3c902-bb06-4cf0-9e62-ecc08e329065","type":"ResetTool"},{"id":"7d42f462-435f-45a9-ba06-921414a8c7d7","type":"SaveTool"},{"id":"d0067da3-ce29-4f1f-afb5-248a3854f398","type":"PanTool"},{"id":"dd1f44ac-5912-4463-847e-69047d3269c6","type":"BoxZoomTool"},{"id":"c437f336-22d4-47ab-92b8-512a5c8dd976","type":"ResetTool"},{"id":"b8b7f68b-f8b0-441c-bad7-6e06ffa24787","type":"SaveTool"},{"id":"b9c3308f-cb11-4b8f-a6b9-790a4b8de085","type":"PanTool"},{"id":"2f0e3e43-48c1-498f-9bac-5ae028797ed6","type":"BoxZoomTool"},{"id":"c3d9134c-9736-4883-b3de-6f9fbb21b65c","type":"ResetTool"},{"id":"9b91db84-0759-4f80-8b78-5c28d23a3a76","type":"SaveTool"}]},"id":"3d8cea66-eec7-4f5e-bd12-246b06207e44","type":"ToolbarBox"},{"attributes":{"items":[{"id":"d3aab170-cfcc-46d9-9ec5-f4873f50ae31","type":"LegendItem"},{"id":"02ed6e2b-89d4-47d4-b584-1d8a51c11bd9","type":"LegendItem"},{"id":"e98194e3-8786-4b95-b467-3922db06330e","type":"LegendItem"},{"id":"ac6ba57d-7622-4cd1-bd92-c5b4e5572cee","type":"LegendItem"},{"id":"7af883db-f635-448b-8db8-37bf0002efa9","type":"LegendItem"},{"id":"dfafa13f-9d7a-4432-ba7f-d3055320c14a","type":"LegendItem"}],"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"38e75e64-419a-4232-b8ef-7e0bbf004f25","type":"Legend"},{"attributes":{"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"aee4b8d8-e454-49af-9de0-36e311615a47","type":"Line"},{"attributes":{"children":[{"id":"3d8cea66-eec7-4f5e-bd12-246b06207e44","type":"ToolbarBox"},{"id":"f06bda53-9ee3-4720-a413-6cedaf3c5a48","type":"Column"}]},"id":"96f08819-7695-4447-9677-3818752101f1","type":"Column"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"50d96e49-0713-4b3c-9b43-49a7ea96c7cc","type":"Line"},{"attributes":{"data_source":{"id":"2d133071-420c-4dd3-9e0d-802ff92a4700","type":"ColumnDataSource"},"glyph":{"id":"aee4b8d8-e454-49af-9de0-36e311615a47","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"50d96e49-0713-4b3c-9b43-49a7ea96c7cc","type":"Line"},"selection_glyph":null},"id":"f6ea966e-deca-48a0-8c2b-1b01853a54e4","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608]}},"id":"df7dea0c-df28-4040-9aef-c71decec7af0","type":"ColumnDataSource"},{"attributes":{"data_source":{"id":"d0000ea0-0ca5-457f-9256-2e2f59b041de","type":"ColumnDataSource"},"glyph":{"id":"ee2bbd78-8eab-434c-a64d-65609b95a287","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"07f033c9-6e1d-4ebd-9032-f70a5e4501c9","type":"Line"},"selection_glyph":null},"id":"bddb7bad-e12c-44f7-957d-e7f2a3ae77d0","type":"GlyphRenderer"},{"attributes":{"label":{"value":"Total fits files"},"renderers":[{"id":"2220f817-c9f0-436a-9870-48937a96dc9f","type":"GlyphRenderer"}]},"id":"d3aab170-cfcc-46d9-9ec5-f4873f50ae31","type":"LegendItem"},{"attributes":{"label":{"value":"rateints fits files"},"renderers":[{"id":"122c4a3a-74db-4c47-ac70-b32015b9a1d7","type":"GlyphRenderer"}]},"id":"4b84a15e-33b0-462f-8867-58db605e8fcf","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395]}},"id":"1804755b-53e1-407e-bcad-f3c185212ec1","type":"ColumnDataSource"},{"attributes":{"fill_color":{"value":"orange"},"line_color":{"value":"orange"},"x":{"field":"x"},"y":{"field":"y"}},"id":"7917eda0-37f2-4a20-aeff-cb8a3e36149e","type":"Asterisk"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"fe5e77dc-052e-427a-9d2b-9ad18f8c5c55","type":"AdaptiveTicker"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"469b0cc1-3bbf-4940-9936-33499374a1b4","type":"Line"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c45e1401-f8d4-4e4d-85c7-6f8626dd1cc9","type":"Asterisk"},{"attributes":{"data_source":{"id":"752e82bc-d0db-45be-80e3-976caeabfe08","type":"ColumnDataSource"},"glyph":{"id":"ba433c33-83be-4faf-8d63-45788e0a70fd","type":"Square"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"c84b4251-117e-42f6-be42-875d40cc490b","type":"Square"},"selection_glyph":null},"id":"00b34c30-92d1-4360-af90-cb20df645ff4","type":"GlyphRenderer"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c84b4251-117e-42f6-be42-875d40cc490b","type":"Square"},{"attributes":{"fill_color":{"value":"blue"},"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"ba433c33-83be-4faf-8d63-45788e0a70fd","type":"Square"},{"attributes":{"data_source":{"id":"780defa9-5161-4103-a451-69f9a095d8f6","type":"ColumnDataSource"},"glyph":{"id":"7917eda0-37f2-4a20-aeff-cb8a3e36149e","type":"Asterisk"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"c45e1401-f8d4-4e4d-85c7-6f8626dd1cc9","type":"Asterisk"},"selection_glyph":null},"id":"2742f0df-eaff-4d7e-86be-19a7a71e427f","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":["2018-05-31T16:22:31.064827","2018-05-31T16:23:34.875007","2018-06-25T14:36:01.228092","2018-06-25T14:56:10.766647","2018-06-26T01:00:14.555477","2018-06-27T01:00:22.052019","2018-06-28T01:00:21.513147","2018-06-29T01:00:22.476578","2018-06-30T01:00:24.224710","2018-07-01T01:00:25.511597","2018-07-02T01:00:24.422766","2018-07-03T01:00:23.460390","2018-07-04T01:00:28.309859","2018-07-05T01:00:54.879811","2018-07-06T01:00:26.537881","2018-07-07T01:00:26.895856","2018-07-08T01:00:29.161379","2018-07-09T01:00:28.473588","2018-07-10T01:00:27.613517","2018-07-11T01:00:16.129835","2018-07-12T01:02:27.080409","2018-07-13T01:00:19.554408","2018-07-14T01:00:22.178614","2018-07-15T01:00:38.036625","2018-07-16T01:01:26.903659"],"y":[851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851]}},"id":"752e82bc-d0db-45be-80e3-976caeabfe08","type":"ColumnDataSource"},{"attributes":{},"id":"b2359f7e-9340-4191-a6aa-1419f20d9063","type":"DatetimeTickFormatter"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"069095e7-27c3-4654-8428-e847a13e1545","type":"AdaptiveTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276]}},"id":"f228f770-227b-4dcc-984d-1abbceb3ab80","type":"ColumnDataSource"},{"attributes":{"data_source":{"id":"f228f770-227b-4dcc-984d-1abbceb3ab80","type":"ColumnDataSource"},"glyph":{"id":"d5daa592-e46c-4186-935b-2302962424c0","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"e1ccd822-a2a5-44c4-b7dd-2aa591be0188","type":"Line"},"selection_glyph":null},"id":"122c4a3a-74db-4c47-ac70-b32015b9a1d7","type":"GlyphRenderer"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"e1ccd822-a2a5-44c4-b7dd-2aa591be0188","type":"Line"},{"attributes":{"data_source":{"id":"ff5788ef-f90e-4f33-aac6-9dc510b0240b","type":"ColumnDataSource"},"glyph":{"id":"93dc5af9-6558-4b81-82c2-17bed6df3ea5","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"4c770ba7-1f35-4ad8-af2d-b81fb90f33d4","type":"Line"},"selection_glyph":null},"id":"2220f817-c9f0-436a-9870-48937a96dc9f","type":"GlyphRenderer"},{"attributes":{"line_color":{"value":"orange"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d5daa592-e46c-4186-935b-2302962424c0","type":"Line"},{"attributes":{},"id":"cd14b243-1dfc-4e51-8db4-dcd9a3985887","type":"BasicTickFormatter"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUA=","dtype":"float64","shape":[25]}}},"id":"ff5788ef-f90e-4f33-aac6-9dc510b0240b","type":"ColumnDataSource"},{"attributes":{"plot":null,"text":"Total File Sizes by Type"},"id":"1fe3f910-35d5-4171-94ad-44fbcfbd970e","type":"Title"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"b9c3308f-cb11-4b8f-a6b9-790a4b8de085","type":"PanTool"},{"id":"2f0e3e43-48c1-498f-9bac-5ae028797ed6","type":"BoxZoomTool"},{"id":"c3d9134c-9736-4883-b3de-6f9fbb21b65c","type":"ResetTool"},{"id":"9b91db84-0759-4f80-8b78-5c28d23a3a76","type":"SaveTool"}]},"id":"c18634ea-cb96-4962-bde1-a0f11fcaabb2","type":"Toolbar"},{"attributes":{"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"ee2bbd78-8eab-434c-a64d-65609b95a287","type":"Line"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c05f0913-cc0b-4a9c-a653-a24218cfe673","type":"Line"},{"attributes":{"label":{"value":"i2d fits files"},"renderers":[{"id":"a709dd5a-3ccb-4402-a7a4-207db94831c6","type":"GlyphRenderer"}]},"id":"d8cd6315-dee8-47ac-a8d4-8741d447397a","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUA=","dtype":"float64","shape":[25]}}},"id":"60fae463-96e0-4499-aa29-18809270b8f7","type":"ColumnDataSource"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"07f033c9-6e1d-4ebd-9032-f70a5e4501c9","type":"Line"},{"attributes":{"data_source":{"id":"c9a1abc1-ed56-40e3-97fc-cb539891ac3f","type":"ColumnDataSource"},"glyph":{"id":"89331a95-a58d-4b07-8af2-ff66fdb9071c","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"469b0cc1-3bbf-4940-9936-33499374a1b4","type":"Line"},"selection_glyph":null},"id":"400ba1e2-7c47-449e-a5e7-7f315638c83c","type":"GlyphRenderer"},{"attributes":{"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"89331a95-a58d-4b07-8af2-ff66fdb9071c","type":"Line"},{"attributes":{"data_source":{"id":"c27fe8be-eebe-4e81-a24d-4e61f84420ed","type":"ColumnDataSource"},"glyph":{"id":"3f57063e-a316-43ce-8036-1829c503bd01","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"c05f0913-cc0b-4a9c-a653-a24218cfe673","type":"Line"},"selection_glyph":null},"id":"25952b66-5b1a-4140-b020-9991de572bad","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkA=","dtype":"float64","shape":[25]}}},"id":"c27fe8be-eebe-4e81-a24d-4e61f84420ed","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUA=","dtype":"float64","shape":[25]}}},"id":"d0000ea0-0ca5-457f-9256-2e2f59b041de","type":"ColumnDataSource"},{"attributes":{},"id":"6227ebb1-f485-46c4-840b-55d6d2e7301a","type":"ToolEvents"},{"attributes":{"plot":null,"text":"System stats"},"id":"d3ba7f42-6fd6-4517-8035-9487b8d743d6","type":"Title"},{"attributes":{"below":[{"id":"39cd38b6-a3a2-4f45-87be-bfc5a4594331","type":"DatetimeAxis"}],"left":[{"id":"897265b9-a8a5-4847-be9b-7014127bfdd9","type":"LinearAxis"}],"renderers":[{"id":"39cd38b6-a3a2-4f45-87be-bfc5a4594331","type":"DatetimeAxis"},{"id":"c5d7b825-7dc4-4c95-a88c-c6d500f94595","type":"Grid"},{"id":"897265b9-a8a5-4847-be9b-7014127bfdd9","type":"LinearAxis"},{"id":"03912cf7-ceeb-48cf-9fc5-60a6b5db6ba9","type":"Grid"},{"id":"c7f5d9b9-5039-47df-bcd2-2733ae077aea","type":"BoxAnnotation"},{"id":"f60d1b3b-e505-4985-9da5-16f8592de673","type":"GlyphRenderer"},{"id":"917f7296-eab9-4ff6-936c-655cbca1ba6f","type":"GlyphRenderer"}],"title":{"id":"a7e6fe59-e3b5-4ee5-95c0-972cbb6ee11a","type":"Title"},"tool_events":{"id":"569f6ac8-0faf-42af-8378-dafb5f299964","type":"ToolEvents"},"toolbar":{"id":"2a71acb8-3393-4b80-8cc7-e7a364034f52","type":"Toolbar"},"toolbar_location":null,"x_range":{"id":"1b71728c-821c-48c7-b8a4-eebbbe0fb07c","type":"DataRange1d"},"y_range":{"id":"946901ca-a7cc-4b26-9a74-0a32b50e3580","type":"DataRange1d"}},"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}],"root_ids":["96f08819-7695-4447-9677-3818752101f1"]},"title":"Bokeh Application","version":"1.0.1"}}; + var docs_json = {"34902372-cbe5-4439-a46d-64324ed09090":{"roots":{"references":[{"attributes":{"x":{"field":"x"},"y":{"field":"y"}},"id":"93dc5af9-6558-4b81-82c2-17bed6df3ea5","type":"Line"},{"attributes":{"callback":null},"id":"8ecefa3a-b82b-4c6f-a31c-987d5214c941","type":"DataRange1d"},{"attributes":{"axis_label":"Date","formatter":{"id":"b2359f7e-9340-4191-a6aa-1419f20d9063","type":"DatetimeTickFormatter"},"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},"ticker":{"id":"163d7cc6-1213-4d3a-8362-2a0fcd5725e9","type":"DatetimeTicker"}},"id":"bf30d024-7169-402f-8d67-ad0a1eaa4e11","type":"DatetimeAxis"},{"attributes":{"callback":null},"id":"28d23309-f8a5-4d85-921c-cb8311aed547","type":"DataRange1d"},{"attributes":{"num_minor_ticks":5},"id":"163d7cc6-1213-4d3a-8362-2a0fcd5725e9","type":"DatetimeTicker"},{"attributes":{"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},"ticker":{"id":"163d7cc6-1213-4d3a-8362-2a0fcd5725e9","type":"DatetimeTicker"}},"id":"ad541891-83dc-46a9-b948-177d2dfc7f95","type":"Grid"},{"attributes":{"axis_label":"GB","formatter":{"id":"cd14b243-1dfc-4e51-8db4-dcd9a3985887","type":"BasicTickFormatter"},"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},"ticker":{"id":"e14b88a1-f39b-4d40-86fd-f3af06dfc945","type":"BasicTicker"}},"id":"58a456a6-c6b4-4f8a-bc19-d25c1656c7b2","type":"LinearAxis"},{"attributes":{},"id":"e14b88a1-f39b-4d40-86fd-f3af06dfc945","type":"BasicTicker"},{"attributes":{"dimension":1,"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},"ticker":{"id":"e14b88a1-f39b-4d40-86fd-f3af06dfc945","type":"BasicTicker"}},"id":"c76f424b-42f3-43ac-baad-87c8aeca63ca","type":"Grid"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"4c770ba7-1f35-4ad8-af2d-b81fb90f33d4","type":"Line"},{"attributes":{"label":{"value":"i2d fits files"},"renderers":[{"id":"25952b66-5b1a-4140-b020-9991de572bad","type":"GlyphRenderer"}]},"id":"dfafa13f-9d7a-4432-ba7f-d3055320c14a","type":"LegendItem"},{"attributes":{"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"b9c3308f-cb11-4b8f-a6b9-790a4b8de085","type":"PanTool"},{"attributes":{"overlay":{"id":"eeb23522-001e-4c13-917d-456ed3542c3e","type":"BoxAnnotation"},"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"2f0e3e43-48c1-498f-9bac-5ae028797ed6","type":"BoxZoomTool"},{"attributes":{"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"c3d9134c-9736-4883-b3de-6f9fbb21b65c","type":"ResetTool"},{"attributes":{"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"9b91db84-0759-4f80-8b78-5c28d23a3a76","type":"SaveTool"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"eeb23522-001e-4c13-917d-456ed3542c3e","type":"BoxAnnotation"},{"attributes":{"data_source":{"id":"9043076c-5800-446f-b3e6-cc5b204ab9ac","type":"ColumnDataSource"},"glyph":{"id":"b2ef6cd5-59af-4483-86f9-bdbc1c764b7e","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"f9b0d0a3-04bb-43ab-9315-ea85c030078b","type":"Line"},"selection_glyph":null},"id":"f60d1b3b-e505-4985-9da5-16f8592de673","type":"GlyphRenderer"},{"attributes":{"label":{"value":"uncalibrated fits files"},"renderers":[{"id":"bddb7bad-e12c-44f7-957d-e7f2a3ae77d0","type":"GlyphRenderer"}]},"id":"02ed6e2b-89d4-47d4-b584-1d8a51c11bd9","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0A=","dtype":"float64","shape":[25]}}},"id":"f590eae7-7bbb-47d3-9944-72a21a99e09a","type":"ColumnDataSource"},{"attributes":{"fill_color":{"value":"purple"},"line_color":{"value":"purple"},"x":{"field":"x"},"y":{"field":"y"}},"id":"797fd21d-00c6-4892-a990-51d9233f5e06","type":"X"},{"attributes":{"data_source":{"id":"3ecad6ef-5a29-4f24-800e-ab43070f8a52","type":"ColumnDataSource"},"glyph":{"id":"797fd21d-00c6-4892-a990-51d9233f5e06","type":"X"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"92544187-1a54-4873-ae13-eaa7b5e14633","type":"X"},"selection_glyph":null},"id":"753f5064-2a31-44dd-86ff-14268167e6c9","type":"GlyphRenderer"},{"attributes":{},"id":"0734274f-b23d-4a3c-91b9-d0575b61f79e","type":"DatetimeTickFormatter"},{"attributes":{"fill_color":{"value":"green"},"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"64615e2a-d6d4-486c-8f5e-ff2e94b66311","type":"Triangle"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"2b0bf374-bcbe-4ad4-a7f0-7c2c1824d1b3","type":"Triangle"},{"attributes":{"data_source":{"id":"f590eae7-7bbb-47d3-9944-72a21a99e09a","type":"ColumnDataSource"},"glyph":{"id":"64615e2a-d6d4-486c-8f5e-ff2e94b66311","type":"Triangle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"2b0bf374-bcbe-4ad4-a7f0-7c2c1824d1b3","type":"Triangle"},"selection_glyph":null},"id":"d281fffc-3cef-4d70-aede-32384969d529","type":"GlyphRenderer"},{"attributes":{"data_source":{"id":"fd61eee8-80ac-406e-9711-1d14c2e7d2e1","type":"ColumnDataSource"},"glyph":{"id":"49e4d52d-3415-49d7-a129-c0d417ec2edf","type":"Square"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"4b185238-cf9c-49f3-bf24-9dc6bbf67508","type":"Square"},"selection_glyph":null},"id":"2f6e66c7-3f51-4495-b45f-702c18653a43","type":"GlyphRenderer"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"4b185238-cf9c-49f3-bf24-9dc6bbf67508","type":"Square"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUA=","dtype":"float64","shape":[25]}}},"id":"22434662-1775-4140-9d52-dd0552a42e1b","type":"ColumnDataSource"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"92544187-1a54-4873-ae13-eaa7b5e14633","type":"X"},{"attributes":{"fill_color":{"value":"blue"},"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"49e4d52d-3415-49d7-a129-c0d417ec2edf","type":"Square"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUA=","dtype":"float64","shape":[25]}}},"id":"e0ecfee9-6ba6-433f-9364-90b3583d3ec5","type":"ColumnDataSource"},{"attributes":{"children":[{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}]},"id":"e09bb773-ec12-4283-aea7-abd199a4e2c2","type":"Row"},{"attributes":{"fill_color":{"value":"red"},"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"01bb4887-aa1e-41f9-8c82-d7648342c270","type":"Diamond"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d58c93c9-8159-42c0-ab1f-bba7e6f35f03","type":"Diamond"},{"attributes":{"data_source":{"id":"22434662-1775-4140-9d52-dd0552a42e1b","type":"ColumnDataSource"},"glyph":{"id":"01bb4887-aa1e-41f9-8c82-d7648342c270","type":"Diamond"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"d58c93c9-8159-42c0-ab1f-bba7e6f35f03","type":"Diamond"},"selection_glyph":null},"id":"6a54b16e-1b27-41a6-b2fb-45259e5b174b","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":["2018-05-31T16:22:31.064827","2018-05-31T16:23:34.875007","2018-06-25T14:36:01.228092","2018-06-25T14:56:10.766647","2018-06-26T01:00:14.555477","2018-06-27T01:00:22.052019","2018-06-28T01:00:21.513147","2018-06-29T01:00:22.476578","2018-06-30T01:00:24.224710","2018-07-01T01:00:25.511597","2018-07-02T01:00:24.422766","2018-07-03T01:00:23.460390","2018-07-04T01:00:28.309859","2018-07-05T01:00:54.879811","2018-07-06T01:00:26.537881","2018-07-07T01:00:26.895856","2018-07-08T01:00:29.161379","2018-07-09T01:00:28.473588","2018-07-10T01:00:27.613517","2018-07-11T01:00:16.129835","2018-07-12T01:02:27.080409","2018-07-13T01:00:19.554408","2018-07-14T01:00:22.178614","2018-07-15T01:00:38.036625","2018-07-16T01:01:26.903659"],"y":{"__ndarray__":"AAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUA=","dtype":"float64","shape":[25]}}},"id":"fd61eee8-80ac-406e-9711-1d14c2e7d2e1","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUAAAABr8aNNQAAAAGvxo01AAAAAa/GjTUA=","dtype":"float64","shape":[25]}}},"id":"62567e6c-da6e-4af0-8071-37cf85d9ca6c","type":"ColumnDataSource"},{"attributes":{"line_color":{"value":"orange"},"x":{"field":"x"},"y":{"field":"y"}},"id":"8cd25382-5c37-4b81-9d8b-b87e89b91ba7","type":"Line"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkA=","dtype":"float64","shape":[25]}}},"id":"3ecad6ef-5a29-4f24-800e-ab43070f8a52","type":"ColumnDataSource"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"dabb8b6e-9eb4-4444-a37a-4bf7181cf615","type":"Line"},{"attributes":{"data_source":{"id":"e0ecfee9-6ba6-433f-9364-90b3583d3ec5","type":"ColumnDataSource"},"glyph":{"id":"8cd25382-5c37-4b81-9d8b-b87e89b91ba7","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"dabb8b6e-9eb4-4444-a37a-4bf7181cf615","type":"Line"},"selection_glyph":null},"id":"30ec13fe-a19f-45d0-988c-331fe4126276","type":"GlyphRenderer"},{"attributes":{},"id":"17541ea6-0467-435e-8bfc-cb7c5c36ee70","type":"BasicTickFormatter"},{"attributes":{"label":{"value":"calibrated fits files"},"renderers":[{"id":"389be021-e56d-4cbd-a710-792ec0802edd","type":"GlyphRenderer"}]},"id":"e98194e3-8786-4b95-b467-3922db06330e","type":"LegendItem"},{"attributes":{"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"ea4727f3-30a4-419d-a4d6-a7073eae08aa","type":"Line"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d5c1000d-556c-4f80-ac77-ca15d66651f9","type":"Line"},{"attributes":{"data_source":{"id":"62567e6c-da6e-4af0-8071-37cf85d9ca6c","type":"ColumnDataSource"},"glyph":{"id":"ea4727f3-30a4-419d-a4d6-a7073eae08aa","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"d5c1000d-556c-4f80-ac77-ca15d66651f9","type":"Line"},"selection_glyph":null},"id":"389be021-e56d-4cbd-a710-792ec0802edd","type":"GlyphRenderer"},{"attributes":{"children":[{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}]},"id":"5d68b34c-771e-4e2e-b5c9-a67ad9ca441b","type":"Row"},{"attributes":{"label":{"value":"rateints fits files"},"renderers":[{"id":"30ec13fe-a19f-45d0-988c-331fe4126276","type":"GlyphRenderer"}]},"id":"7af883db-f635-448b-8db8-37bf0002efa9","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEA=","dtype":"float64","shape":[25]}}},"id":"da4e600d-3c18-41fb-9b3f-870aeedd2c29","type":"ColumnDataSource"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"05784843-10ed-4438-bd6e-0d463711ba2d","type":"Line"},{"attributes":{"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},"ticker":{"id":"60e3c8e5-99b0-4b0d-bb4a-ca374be44bf5","type":"DatetimeTicker"}},"id":"c5d7b825-7dc4-4c95-a88c-c6d500f94595","type":"Grid"},{"attributes":{"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d5402c2d-94f0-423b-b18c-ef224b8f406a","type":"Line"},{"attributes":{"data_source":{"id":"e6f95491-b253-40ed-a16e-661fea38d86a","type":"ColumnDataSource"},"glyph":{"id":"d5402c2d-94f0-423b-b18c-ef224b8f406a","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"05784843-10ed-4438-bd6e-0d463711ba2d","type":"Line"},"selection_glyph":null},"id":"fcc1ac07-0148-4437-9955-2be6428f7127","type":"GlyphRenderer"},{"attributes":{"axis_label":"Count","formatter":{"id":"17541ea6-0467-435e-8bfc-cb7c5c36ee70","type":"BasicTickFormatter"},"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},"ticker":{"id":"5c0f5335-6fac-4ac4-9a27-83328575da61","type":"BasicTicker"}},"id":"897265b9-a8a5-4847-be9b-7014127bfdd9","type":"LinearAxis"},{"attributes":{"fill_color":{"value":"red"},"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"6dbbcc4f-d6cc-438d-b26f-aaa79519314b","type":"Circle"},{"attributes":{},"id":"5c0f5335-6fac-4ac4-9a27-83328575da61","type":"BasicTicker"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"f8cf0dda-d3ec-4ac4-a436-1c794cabac31","type":"Circle"},{"attributes":{"data_source":{"id":"da4e600d-3c18-41fb-9b3f-870aeedd2c29","type":"ColumnDataSource"},"glyph":{"id":"6dbbcc4f-d6cc-438d-b26f-aaa79519314b","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"f8cf0dda-d3ec-4ac4-a436-1c794cabac31","type":"Circle"},"selection_glyph":null},"id":"0ec5dc01-578b-4520-b1f0-79c233afe57d","type":"GlyphRenderer"},{"attributes":{"dimension":1,"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},"ticker":{"id":"5c0f5335-6fac-4ac4-9a27-83328575da61","type":"BasicTicker"}},"id":"03912cf7-ceeb-48cf-9fc5-60a6b5db6ba9","type":"Grid"},{"attributes":{"fill_color":{"value":"orange"},"line_color":{"value":"orange"},"x":{"field":"x"},"y":{"field":"y"}},"id":"a27f2bc1-f9cc-4c16-b76e-05da21455cb3","type":"Asterisk"},{"attributes":{"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}},"id":"60e19b94-81f3-4a5b-a417-d28f1a9384cd","type":"PanTool"},{"attributes":{"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"cc759e9c-1128-4e42-af41-78306d4ede68","type":"Line"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"d0067da3-ce29-4f1f-afb5-248a3854f398","type":"PanTool"},{"id":"dd1f44ac-5912-4463-847e-69047d3269c6","type":"BoxZoomTool"},{"id":"c437f336-22d4-47ab-92b8-512a5c8dd976","type":"ResetTool"},{"id":"b8b7f68b-f8b0-441c-bad7-6e06ffa24787","type":"SaveTool"}]},"id":"9a55c09a-9401-4b7d-9aed-3c5e0a544aa4","type":"Toolbar"},{"attributes":{"callback":null},"id":"1da94554-25f9-46c4-b0bb-9c46c535e68e","type":"DataRange1d"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEA=","dtype":"float64","shape":[25]}}},"id":"9043076c-5800-446f-b3e6-cc5b204ab9ac","type":"ColumnDataSource"},{"attributes":{},"id":"be295c94-1ce5-4f44-be55-ef19af5b7671","type":"ToolEvents"},{"attributes":{"line_color":{"value":"blue"},"line_width":{"value":2},"x":{"field":"x"},"y":{"field":"y"}},"id":"b2ef6cd5-59af-4483-86f9-bdbc1c764b7e","type":"Line"},{"attributes":{"label":{"value":"Free bytes"},"renderers":[{"id":"fcc1ac07-0148-4437-9955-2be6428f7127","type":"GlyphRenderer"}]},"id":"1514e9e9-9c67-4ecb-a74f-acff2d0a0039","type":"LegendItem"},{"attributes":{"plot":null,"text":"Total File Counts by Type"},"id":"356efb19-c8eb-4b9b-a288-ea51e50c11cc","type":"Title"},{"attributes":{"label":{"value":"Total size"},"renderers":[{"id":"07133336-7067-4cb7-81c1-ff7ab495d293","type":"GlyphRenderer"}]},"id":"1586667e-5b34-4667-8fcc-d547d01e2cb3","type":"LegendItem"},{"attributes":{"label":{"value":"calibrated fits files"},"renderers":[{"id":"f6ea966e-deca-48a0-8c2b-1b01853a54e4","type":"GlyphRenderer"}]},"id":"c5a144c2-97d6-4219-a8a1-d87ebc1efdd0","type":"LegendItem"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"8f14093d-f439-41d4-989f-af03f433d33f","type":"AdaptiveTicker"},{"attributes":{"months":[0,4,8]},"id":"4a1935a4-65c1-4d7a-98fc-ac775f23b23b","type":"MonthsTicker"},{"attributes":{"overlay":{"id":"c7f5d9b9-5039-47df-bcd2-2733ae077aea","type":"BoxAnnotation"},"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}},"id":"3511cf69-feab-4da0-8cfd-2f7f8c95571f","type":"BoxZoomTool"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d8f3e663-8ada-41a9-bb07-393c45dd7879","type":"Line"},{"attributes":{"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}},"id":"0abfbcc4-d9c3-4399-9c37-d1ee428c0b0a","type":"ResetTool"},{"attributes":{"months":[0,6]},"id":"aba8ad3a-1c3c-492a-bb6f-8a25b3d80d59","type":"MonthsTicker"},{"attributes":{},"id":"34e8ec95-f34a-49eb-8ceb-b9619778b25b","type":"YearsTicker"},{"attributes":{"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}},"id":"d56a4637-bebd-49de-b1d9-e99f0cef0805","type":"SaveTool"},{"attributes":{"line_color":{"value":"purple"},"x":{"field":"x"},"y":{"field":"y"}},"id":"bf65850a-36ca-4ab7-b321-5f06917ece37","type":"Line"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"c7f5d9b9-5039-47df-bcd2-2733ae077aea","type":"BoxAnnotation"},{"attributes":{"items":[{"id":"b43d9294-afb0-4d6b-a9c2-e4b7ab4cc37e","type":"LegendItem"},{"id":"b2b98280-f2ff-4f9e-b224-6b4d6faac3b1","type":"LegendItem"},{"id":"c5a144c2-97d6-4219-a8a1-d87ebc1efdd0","type":"LegendItem"},{"id":"cfd52bd8-bc4e-44d5-bead-5fb85f365648","type":"LegendItem"},{"id":"4b84a15e-33b0-462f-8867-58db605e8fcf","type":"LegendItem"},{"id":"d8cd6315-dee8-47ac-a8d4-8741d447397a","type":"LegendItem"}],"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"d35ed1b7-dbd6-4136-b64f-db33470af8d7","type":"Legend"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUAAAAA9yh9lQAAAAD3KH2VAAAAAPcofZUA=","dtype":"float64","shape":[25]}}},"id":"2eb3ae3d-acc6-4e48-89aa-e899c1bedef5","type":"ColumnDataSource"},{"attributes":{"num_minor_ticks":5},"id":"60e3c8e5-99b0-4b0d-bb4a-ca374be44bf5","type":"DatetimeTicker"},{"attributes":{"label":{"value":"Total fits files"},"renderers":[{"id":"090f8653-b156-44b8-80cc-401370848453","type":"GlyphRenderer"}]},"id":"b43d9294-afb0-4d6b-a9c2-e4b7ab4cc37e","type":"LegendItem"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"e9e8411c-bd03-4950-a2b5-bec85e18bf32","type":"Line"},{"attributes":{"below":[{"id":"fc52962a-2146-449d-b34e-8511b1d8425f","type":"DatetimeAxis"}],"left":[{"id":"078fa362-2400-4b4f-93a6-fd77c1512c64","type":"LinearAxis"}],"renderers":[{"id":"fc52962a-2146-449d-b34e-8511b1d8425f","type":"DatetimeAxis"},{"id":"87cc6cc9-f3b9-4ee5-8b39-da3271d0cc26","type":"Grid"},{"id":"078fa362-2400-4b4f-93a6-fd77c1512c64","type":"LinearAxis"},{"id":"97b1e295-8be8-4aeb-8a6a-4c0d9e5b5c23","type":"Grid"},{"id":"a185894f-c931-4e1f-b771-a26b13dc0fee","type":"BoxAnnotation"},{"id":"d35ed1b7-dbd6-4136-b64f-db33470af8d7","type":"Legend"},{"id":"090f8653-b156-44b8-80cc-401370848453","type":"GlyphRenderer"},{"id":"daf0cb77-8c45-48b0-8c35-e225e4c24413","type":"GlyphRenderer"},{"id":"74dc8b93-7ef4-41c4-8c51-a27fec47ef29","type":"GlyphRenderer"},{"id":"8947c0af-13a9-472b-a211-29d935efe20e","type":"GlyphRenderer"},{"id":"f6ea966e-deca-48a0-8c2b-1b01853a54e4","type":"GlyphRenderer"},{"id":"00b34c30-92d1-4360-af90-cb20df645ff4","type":"GlyphRenderer"},{"id":"08b92294-79eb-4a8e-b8cf-8da59ce3b366","type":"GlyphRenderer"},{"id":"4149b3f1-1e16-43fa-ae52-a6cd1817624b","type":"GlyphRenderer"},{"id":"122c4a3a-74db-4c47-ac70-b32015b9a1d7","type":"GlyphRenderer"},{"id":"2742f0df-eaff-4d7e-86be-19a7a71e427f","type":"GlyphRenderer"},{"id":"a709dd5a-3ccb-4402-a7a4-207db94831c6","type":"GlyphRenderer"},{"id":"d38143a2-315e-4851-8110-b701bcc16f5c","type":"GlyphRenderer"}],"title":{"id":"356efb19-c8eb-4b9b-a288-ea51e50c11cc","type":"Title"},"tool_events":{"id":"be295c94-1ce5-4f44-be55-ef19af5b7671","type":"ToolEvents"},"toolbar":{"id":"9a55c09a-9401-4b7d-9aed-3c5e0a544aa4","type":"Toolbar"},"toolbar_location":null,"x_range":{"id":"1da94554-25f9-46c4-b0bb-9c46c535e68e","type":"DataRange1d"},"y_range":{"id":"d0957cea-00b2-45e0-9068-077b3e2ad752","type":"DataRange1d"}},"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"5bc99ac8-786a-4fa6-8bf5-d059582c430b","type":"MonthsTicker"},{"attributes":{"data_source":{"id":"6176765d-1ae3-49cf-890e-149b30109778","type":"ColumnDataSource"},"glyph":{"id":"bf65850a-36ca-4ab7-b321-5f06917ece37","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"e9e8411c-bd03-4950-a2b5-bec85e18bf32","type":"Line"},"selection_glyph":null},"id":"a709dd5a-3ccb-4402-a7a4-207db94831c6","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAmu+/EUAAAACY778RQAAAAIxdzwVAAAAAhF3PBUAAAACEXc8FQAAAAIRdzwVAAAAAfDesBUAAAADoD4gFQAAAADgigwVAAAAAOCKDBUAAAAA4IoMFQAAAADgigwVAAAAAQNd9BUAAAAA8130FQAAAADzXfQVAAAAAQNd9BUAAAAA8130FQAAAACzTfQVAAAAAKNN9BUAAAAAo030FQAAAACjTfQVAAAAAGNN9BUAAAAAY030FQAAAABjTfQVAAAAAGNN9BUA=","dtype":"float64","shape":[25]}}},"id":"88e5d5a0-5799-4e4f-b700-03bf82b3e590","type":"ColumnDataSource"},{"attributes":{"months":[0,4,8]},"id":"a383c7ef-aa46-4ea0-9170-90d969c72130","type":"MonthsTicker"},{"attributes":{"data_source":{"id":"7cb7b3cd-b926-4727-a586-149cf4b6cce5","type":"ColumnDataSource"},"glyph":{"id":"03c120a0-3c70-48da-a521-30f83c95886c","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"3d826d5c-2665-4f04-af39-4892ccc1c68f","type":"Circle"},"selection_glyph":null},"id":"9918c67a-d21d-4295-8ab8-2ebdc206e2aa","type":"GlyphRenderer"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"3d826d5c-2665-4f04-af39-4892ccc1c68f","type":"Circle"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"780e2bec-0869-4f66-a8eb-86517ec4797d","type":"DaysTicker"},{"attributes":{"callback":null},"id":"1b71728c-821c-48c7-b8a4-eebbbe0fb07c","type":"DataRange1d"},{"attributes":{"fill_color":{"value":"black"},"x":{"field":"x"},"y":{"field":"y"}},"id":"343297b8-a291-4880-a1d2-c76c76fe04fe","type":"Circle"},{"attributes":{"fill_color":{"value":"green"},"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"03c120a0-3c70-48da-a521-30f83c95886c","type":"Circle"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523]}},"id":"b7db8458-e70a-48c1-bfca-f459654b85dc","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395]}},"id":"40a4f74b-3311-4671-bc08-1f106d5d1638","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608]}},"id":"6176765d-1ae3-49cf-890e-149b30109778","type":"ColumnDataSource"},{"attributes":{"axis_label":"GB","formatter":{"id":"a82b6824-8ee4-4317-b2c9-63f7a9682699","type":"BasicTickFormatter"},"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},"ticker":{"id":"f40d5e9f-3321-45f3-bc69-3895a2509c4b","type":"BasicTicker"}},"id":"5b314523-4073-4634-97ae-892f36f4eb47","type":"LinearAxis"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"a6e63c2f-fa0d-41af-a762-ae820b7131c5","type":"Circle"},{"attributes":{"callback":null},"id":"946901ca-a7cc-4b26-9a74-0a32b50e3580","type":"DataRange1d"},{"attributes":{"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},"ticker":{"id":"a7080a57-e39e-4ea3-9922-1daf96a4c605","type":"DatetimeTicker"}},"id":"4d69bf08-38f1-4c65-b5a8-f1303d5abebb","type":"Grid"},{"attributes":{"label":{"value":"uncalibrated fits files"},"renderers":[{"id":"74dc8b93-7ef4-41c4-8c51-a27fec47ef29","type":"GlyphRenderer"}]},"id":"b2b98280-f2ff-4f9e-b224-6b4d6faac3b1","type":"LegendItem"},{"attributes":{"axis_label":"Date","formatter":{"id":"0734274f-b23d-4a3c-91b9-d0575b61f79e","type":"DatetimeTickFormatter"},"plot":{"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"},"ticker":{"id":"60e3c8e5-99b0-4b0d-bb4a-ca374be44bf5","type":"DatetimeTicker"}},"id":"39cd38b6-a3a2-4f45-87be-bfc5a4594331","type":"DatetimeAxis"},{"attributes":{},"id":"f40d5e9f-3321-45f3-bc69-3895a2509c4b","type":"BasicTicker"},{"attributes":{"fill_color":{"value":"blue"},"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"3271eb39-dbc9-47e0-9786-775ed673a844","type":"Circle"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"eaccf055-5c89-4da1-b5ab-c023e266d74a","type":"Circle"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"47fd4883-d39c-4097-a327-6cd440081906","type":"MonthsTicker"},{"attributes":{"data_source":{"id":"88e5d5a0-5799-4e4f-b700-03bf82b3e590","type":"ColumnDataSource"},"glyph":{"id":"3271eb39-dbc9-47e0-9786-775ed673a844","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"eaccf055-5c89-4da1-b5ab-c023e266d74a","type":"Circle"},"selection_glyph":null},"id":"73dd8efa-6dc3-4a3b-8be2-9be1900f73a3","type":"GlyphRenderer"},{"attributes":{"num_minor_ticks":5},"id":"a7080a57-e39e-4ea3-9922-1daf96a4c605","type":"DatetimeTicker"},{"attributes":{"data_source":{"id":"60fae463-96e0-4499-aa29-18809270b8f7","type":"ColumnDataSource"},"glyph":{"id":"343297b8-a291-4880-a1d2-c76c76fe04fe","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"a6e63c2f-fa0d-41af-a762-ae820b7131c5","type":"Circle"},"selection_glyph":null},"id":"d08440e5-5498-41d1-aa8c-ce6b0ca63a2d","type":"GlyphRenderer"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"line_width":{"value":2},"x":{"field":"x"},"y":{"field":"y"}},"id":"f9b0d0a3-04bb-43ab-9315-ea85c030078b","type":"Line"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"e7ae2693-6d21-48c9-b70e-912dc51aab05","type":"MonthsTicker"},{"attributes":{"plot":null,"text":"Total File Counts"},"id":"a7e6fe59-e3b5-4ee5-95c0-972cbb6ee11a","type":"Title"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"a2bd0f68-bf54-4997-a1c5-ef0093dee9b2","type":"Triangle"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"a1b065d4-40dc-4513-b9f8-3c5ecee18efa","type":"MonthsTicker"},{"attributes":{"dimension":1,"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},"ticker":{"id":"f40d5e9f-3321-45f3-bc69-3895a2509c4b","type":"BasicTicker"}},"id":"b6b367f9-d6c3-4e06-b1c9-4d68b58969cb","type":"Grid"},{"attributes":{"data_source":{"id":"0d6623a5-bda0-433c-980a-9e263215cf1f","type":"ColumnDataSource"},"glyph":{"id":"cc759e9c-1128-4e42-af41-78306d4ede68","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"c27c86e6-b1e6-4a6e-92e5-ce6fdc824142","type":"Line"},"selection_glyph":null},"id":"74dc8b93-7ef4-41c4-8c51-a27fec47ef29","type":"GlyphRenderer"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"5d7cc1f3-dba7-40c8-a0ba-478384af3367","type":"DaysTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAzCCADEAAAADQIIAMQAAAADpRGBVAAAAAPlEYFUAAAAA+URgVQAAAAD5RGBVAAAAAQuQpFUAAAAAM+DsVQAAAAORuPhVAAAAA5G4+FUAAAADkbj4VQAAAAORuPhVAAAAAYBRBFUAAAABiFEEVQAAAAGIUQRVAAAAAYBRBFUAAAABiFEEVQAAAAGoWQRVAAAAAbBZBFUAAAABsFkEVQAAAAGwWQRVAAAAAdBZBFUAAAAB0FkEVQAAAAHQWQRVAAAAAdBZBFUA=","dtype":"float64","shape":[25]}}},"id":"395ed7d4-4904-4960-a4f4-aad38a5350e5","type":"ColumnDataSource"},{"attributes":{"days":[1,8,15,22]},"id":"cae50c1d-cc54-48f5-a799-f298cbd90e2f","type":"DaysTicker"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"820b0330-109c-4a99-89c0-2efaf0879383","type":"AdaptiveTicker"},{"attributes":{"data_source":{"id":"40a4f74b-3311-4671-bc08-1f106d5d1638","type":"ColumnDataSource"},"glyph":{"id":"c6324ce5-fc39-4ae9-9a9b-d2618aff237d","type":"Triangle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"a2bd0f68-bf54-4997-a1c5-ef0093dee9b2","type":"Triangle"},"selection_glyph":null},"id":"4149b3f1-1e16-43fa-ae52-a6cd1817624b","type":"GlyphRenderer"},{"attributes":{},"id":"430c0afa-d7a7-4fb9-a437-1495e640d03c","type":"BasicTickFormatter"},{"attributes":{"callback":null},"id":"b4878e82-6860-40c9-96c8-fe4ad588cf06","type":"DataRange1d"},{"attributes":{"fill_color":{"value":"black"},"x":{"field":"x"},"y":{"field":"y"}},"id":"8a43e9ab-6738-4936-9ad8-f24926210c79","type":"Circle"},{"attributes":{"days":[1,15]},"id":"4887862b-a5d2-4034-9afe-143cbbd2b9d6","type":"DaysTicker"},{"attributes":{},"id":"569f6ac8-0faf-42af-8378-dafb5f299964","type":"ToolEvents"},{"attributes":{"axis_label":"Date","formatter":{"id":"c57746ea-3aaf-44c4-a6fe-a4ce744adc55","type":"DatetimeTickFormatter"},"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},"ticker":{"id":"a7080a57-e39e-4ea3-9922-1daf96a4c605","type":"DatetimeTicker"}},"id":"6b0fc3b4-7951-45b5-906d-cd23f852ba81","type":"DatetimeAxis"},{"attributes":{"data_source":{"id":"b7db8458-e70a-48c1-bfca-f459654b85dc","type":"ColumnDataSource"},"glyph":{"id":"8a43e9ab-6738-4936-9ad8-f24926210c79","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"0357c241-eecb-48f0-8199-55aa2a374fa3","type":"Circle"},"selection_glyph":null},"id":"daf0cb77-8c45-48b0-8c35-e225e4c24413","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAmu+/EUAAAACY778RQAAAAIxdzwVAAAAAhF3PBUAAAACEXc8FQAAAAIRdzwVAAAAAfDesBUAAAADoD4gFQAAAADgigwVAAAAAOCKDBUAAAAA4IoMFQAAAADgigwVAAAAAQNd9BUAAAAA8130FQAAAADzXfQVAAAAAQNd9BUAAAAA8130FQAAAACzTfQVAAAAAKNN9BUAAAAAo030FQAAAACjTfQVAAAAAGNN9BUAAAAAY030FQAAAABjTfQVAAAAAGNN9BUA=","dtype":"float64","shape":[25]}}},"id":"e6f95491-b253-40ed-a16e-661fea38d86a","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAzCCADEAAAADQIIAMQAAAADpRGBVAAAAAPlEYFUAAAAA+URgVQAAAAD5RGBVAAAAAQuQpFUAAAAAM+DsVQAAAAORuPhVAAAAA5G4+FUAAAADkbj4VQAAAAORuPhVAAAAAYBRBFUAAAABiFEEVQAAAAGIUQRVAAAAAYBRBFUAAAABiFEEVQAAAAGoWQRVAAAAAbBZBFUAAAABsFkEVQAAAAGwWQRVAAAAAdBZBFUAAAAB0FkEVQAAAAHQWQRVAAAAAdBZBFUA=","dtype":"float64","shape":[25]}}},"id":"7cb7b3cd-b926-4727-a586-149cf4b6cce5","type":"ColumnDataSource"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"60e19b94-81f3-4a5b-a417-d28f1a9384cd","type":"PanTool"},{"id":"3511cf69-feab-4da0-8cfd-2f7f8c95571f","type":"BoxZoomTool"},{"id":"0abfbcc4-d9c3-4399-9c37-d1ee428c0b0a","type":"ResetTool"},{"id":"d56a4637-bebd-49de-b1d9-e99f0cef0805","type":"SaveTool"}]},"id":"2a71acb8-3393-4b80-8cc7-e7a364034f52","type":"Toolbar"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"0357c241-eecb-48f0-8199-55aa2a374fa3","type":"Circle"},{"attributes":{"days":[1,15]},"id":"c6dcd46e-6f6e-483e-b6ac-edf076f1e76b","type":"DaysTicker"},{"attributes":{"fill_color":{"value":"green"},"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c6324ce5-fc39-4ae9-9a9b-d2618aff237d","type":"Triangle"},{"attributes":{"days":[1,15]},"id":"668c1d3e-9b19-4a7b-b281-58ae881f0c5c","type":"DaysTicker"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"7670f17f-3c98-45e7-8bdb-69335633e9c9","type":"DaysTicker"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"d5557dca-8962-4f83-a335-d8adc4bf44e8","type":"AdaptiveTicker"},{"attributes":{},"id":"1c71fb97-afb7-4369-9252-61116aea3045","type":"DatetimeTickFormatter"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c27c86e6-b1e6-4a6e-92e5-ce6fdc824142","type":"Line"},{"attributes":{"months":[0,6]},"id":"0322ffe1-72d7-4483-9bb7-e1691ca33a1a","type":"MonthsTicker"},{"attributes":{"label":{"value":"Used bytes"},"renderers":[{"id":"e72ee102-c962-4ccb-a3a8-4946f7235bbf","type":"GlyphRenderer"}]},"id":"12f1d485-d57e-4143-ba94-b56f83a00786","type":"LegendItem"},{"attributes":{},"id":"7f773bc5-4380-41ba-a0e2-30fa1585b95f","type":"YearsTicker"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"c9018a59-4d70-49fc-bad4-0d810f532b84","type":"AdaptiveTicker"},{"attributes":{"callback":null},"id":"d0957cea-00b2-45e0-9068-077b3e2ad752","type":"DataRange1d"},{"attributes":{"days":[1,8,15,22]},"id":"7a082768-6e01-4baa-a714-9de998ce4a7f","type":"DaysTicker"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"e50fe3d8-54b0-434a-aa94-61da2599db2b","type":"DaysTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEAAAAAAgI7EQAAAAACAjsRAAAAAAICOxEA=","dtype":"float64","shape":[25]}}},"id":"1b451d88-6227-4226-93be-5561316953dd","type":"ColumnDataSource"},{"attributes":{"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"1db199d0-229b-489f-8aef-bd9804f01791","type":"Line"},{"attributes":{},"id":"cb578861-ab36-4b07-9779-8840113a3321","type":"ToolEvents"},{"attributes":{"fill_color":{"value":"blue"},"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"5242806a-3b9b-4aed-a8d9-835cf51b58dd","type":"Circle"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"5b98adf0-5c75-42a3-a10b-ffb99c99e376","type":"Line"},{"attributes":{"data_source":{"id":"395ed7d4-4904-4960-a4f4-aad38a5350e5","type":"ColumnDataSource"},"glyph":{"id":"1db199d0-229b-489f-8aef-bd9804f01791","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"5b98adf0-5c75-42a3-a10b-ffb99c99e376","type":"Line"},"selection_glyph":null},"id":"e72ee102-c962-4ccb-a3a8-4946f7235bbf","type":"GlyphRenderer"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"0ffa5373-40c5-45d0-b9be-2c538b27ec6e","type":"Circle"},{"attributes":{"data_source":{"id":"1b451d88-6227-4226-93be-5561316953dd","type":"ColumnDataSource"},"glyph":{"id":"5242806a-3b9b-4aed-a8d9-835cf51b58dd","type":"Circle"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"0ffa5373-40c5-45d0-b9be-2c538b27ec6e","type":"Circle"},"selection_glyph":null},"id":"917f7296-eab9-4ff6-936c-655cbca1ba6f","type":"GlyphRenderer"},{"attributes":{"axis_label":"Date","formatter":{"id":"1c71fb97-afb7-4369-9252-61116aea3045","type":"DatetimeTickFormatter"},"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},"ticker":{"id":"a380724e-edb2-4a0b-9b94-b8d9a054d184","type":"DatetimeTicker"}},"id":"fc52962a-2146-449d-b34e-8511b1d8425f","type":"DatetimeAxis"},{"attributes":{"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},"ticker":{"id":"a380724e-edb2-4a0b-9b94-b8d9a054d184","type":"DatetimeTicker"}},"id":"87cc6cc9-f3b9-4ee5-8b39-da3271d0cc26","type":"Grid"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"5838296d-3520-4b52-aa8b-a9d6a1245574","type":"DaysTicker"},{"attributes":{"below":[{"id":"6b0fc3b4-7951-45b5-906d-cd23f852ba81","type":"DatetimeAxis"}],"left":[{"id":"5b314523-4073-4634-97ae-892f36f4eb47","type":"LinearAxis"}],"renderers":[{"id":"6b0fc3b4-7951-45b5-906d-cd23f852ba81","type":"DatetimeAxis"},{"id":"4d69bf08-38f1-4c65-b5a8-f1303d5abebb","type":"Grid"},{"id":"5b314523-4073-4634-97ae-892f36f4eb47","type":"LinearAxis"},{"id":"b6b367f9-d6c3-4e06-b1c9-4d68b58969cb","type":"Grid"},{"id":"7ba314ec-8316-460a-8b2b-b1a0bafcb5e7","type":"BoxAnnotation"},{"id":"4f72b2b8-5c90-4144-a810-d9ccd95dd35c","type":"Legend"},{"id":"07133336-7067-4cb7-81c1-ff7ab495d293","type":"GlyphRenderer"},{"id":"0ec5dc01-578b-4520-b1f0-79c233afe57d","type":"GlyphRenderer"},{"id":"fcc1ac07-0148-4437-9955-2be6428f7127","type":"GlyphRenderer"},{"id":"73dd8efa-6dc3-4a3b-8be2-9be1900f73a3","type":"GlyphRenderer"},{"id":"e72ee102-c962-4ccb-a3a8-4946f7235bbf","type":"GlyphRenderer"},{"id":"9918c67a-d21d-4295-8ab8-2ebdc206e2aa","type":"GlyphRenderer"}],"title":{"id":"d3ba7f42-6fd6-4517-8035-9487b8d743d6","type":"Title"},"tool_events":{"id":"cb578861-ab36-4b07-9779-8840113a3321","type":"ToolEvents"},"toolbar":{"id":"33855718-dfdf-44df-ba72-6eaea75f3ffa","type":"Toolbar"},"toolbar_location":null,"x_range":{"id":"73362e54-e29f-4fd6-aa98-839873325f8c","type":"DataRange1d"},"y_range":{"id":"b4878e82-6860-40c9-96c8-fe4ad588cf06","type":"DataRange1d"}},"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"3d553f46-80be-49c7-be60-1385dc59400d","type":"PanTool"},{"id":"02f67862-ff19-4f8b-aa63-1dace43bc79d","type":"BoxZoomTool"},{"id":"1fd3c902-bb06-4cf0-9e62-ecc08e329065","type":"ResetTool"},{"id":"7d42f462-435f-45a9-ba06-921414a8c7d7","type":"SaveTool"}]},"id":"33855718-dfdf-44df-ba72-6eaea75f3ffa","type":"Toolbar"},{"attributes":{"num_minor_ticks":5},"id":"a380724e-edb2-4a0b-9b94-b8d9a054d184","type":"DatetimeTicker"},{"attributes":{"callback":null},"id":"73362e54-e29f-4fd6-aa98-839873325f8c","type":"DataRange1d"},{"attributes":{"axis_label":"Count","formatter":{"id":"430c0afa-d7a7-4fb9-a437-1495e640d03c","type":"BasicTickFormatter"},"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},"ticker":{"id":"5ffe610f-ab71-44b5-8644-1563916683b2","type":"BasicTicker"}},"id":"078fa362-2400-4b4f-93a6-fd77c1512c64","type":"LinearAxis"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"c96f8559-69d8-44f5-9e38-aa4ad5566d2b","type":"DaysTicker"},{"attributes":{},"id":"5ffe610f-ab71-44b5-8644-1563916683b2","type":"BasicTicker"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"74b33b26-0ae9-4b87-8e22-77fcbed68c12","type":"AdaptiveTicker"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"ece6f6fd-57d4-4754-a201-2abfebdb8395","type":"MonthsTicker"},{"attributes":{"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"3d553f46-80be-49c7-be60-1385dc59400d","type":"PanTool"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"588ff9bb-6d90-4100-9779-bcbc2622c242","type":"AdaptiveTicker"},{"attributes":{"dimension":1,"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"},"ticker":{"id":"5ffe610f-ab71-44b5-8644-1563916683b2","type":"BasicTicker"}},"id":"97b1e295-8be8-4aeb-8a6a-4c0d9e5b5c23","type":"Grid"},{"attributes":{},"id":"c57746ea-3aaf-44c4-a6fe-a4ce744adc55","type":"DatetimeTickFormatter"},{"attributes":{"months":[0,6]},"id":"229e7c7f-f287-4d19-8d65-b8ef3acfd92c","type":"MonthsTicker"},{"attributes":{"overlay":{"id":"7ba314ec-8316-460a-8b2b-b1a0bafcb5e7","type":"BoxAnnotation"},"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"02f67862-ff19-4f8b-aa63-1dace43bc79d","type":"BoxZoomTool"},{"attributes":{"data_source":{"id":"bd516d7e-f534-41cb-8f33-27ab029eb302","type":"ColumnDataSource"},"glyph":{"id":"61ac20e3-7efc-4faf-805f-b88fa6901b71","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"b885029e-97a8-43ef-9048-05bc99f11df2","type":"Line"},"selection_glyph":null},"id":"07133336-7067-4cb7-81c1-ff7ab495d293","type":"GlyphRenderer"},{"attributes":{"x":{"field":"x"},"y":{"field":"y"}},"id":"56b132b7-949c-4f60-9c93-b5f809a97697","type":"Line"},{"attributes":{"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"1fd3c902-bb06-4cf0-9e62-ecc08e329065","type":"ResetTool"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,10523]}},"id":"ecc92d83-3df6-4023-bddc-aa395848eb31","type":"ColumnDataSource"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"cc0e1ef1-18a0-42a3-9801-01d5ad33454a","type":"AdaptiveTicker"},{"attributes":{"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"7d42f462-435f-45a9-ba06-921414a8c7d7","type":"SaveTool"},{"attributes":{"data_source":{"id":"ecc92d83-3df6-4023-bddc-aa395848eb31","type":"ColumnDataSource"},"glyph":{"id":"56b132b7-949c-4f60-9c93-b5f809a97697","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"d8f3e663-8ada-41a9-bb07-393c45dd7879","type":"Line"},"selection_glyph":null},"id":"090f8653-b156-44b8-80cc-401370848453","type":"GlyphRenderer"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"b885029e-97a8-43ef-9048-05bc99f11df2","type":"Line"},{"attributes":{"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"d0067da3-ce29-4f1f-afb5-248a3854f398","type":"PanTool"},{"attributes":{},"id":"a82b6824-8ee4-4317-b2c9-63f7a9682699","type":"BasicTickFormatter"},{"attributes":{"months":[0,4,8]},"id":"8047885b-5b1e-4fbd-b08e-f0b2c840c48d","type":"MonthsTicker"},{"attributes":{"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"b8b7f68b-f8b0-441c-bad7-6e06ffa24787","type":"SaveTool"},{"attributes":{},"id":"3abeccf7-3554-4565-ae1c-d1d14a3592b5","type":"YearsTicker"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"7c2ee7be-cff0-4cbe-a093-4b4376661d0a","type":"MonthsTicker"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"7ba314ec-8316-460a-8b2b-b1a0bafcb5e7","type":"BoxAnnotation"},{"attributes":{"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"61ac20e3-7efc-4faf-805f-b88fa6901b71","type":"Line"},{"attributes":{"overlay":{"id":"a185894f-c931-4e1f-b771-a26b13dc0fee","type":"BoxAnnotation"},"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"dd1f44ac-5912-4463-847e-69047d3269c6","type":"BoxZoomTool"},{"attributes":{"items":[{"id":"1586667e-5b34-4667-8fcc-d547d01e2cb3","type":"LegendItem"},{"id":"1514e9e9-9c67-4ecb-a74f-acff2d0a0039","type":"LegendItem"},{"id":"12f1d485-d57e-4143-ba94-b56f83a00786","type":"LegendItem"}],"plot":{"id":"825fabc5-82ef-492d-b1f8-1e760600509d","subtype":"Figure","type":"Plot"}},"id":"4f72b2b8-5c90-4144-a810-d9ccd95dd35c","type":"Legend"},{"attributes":{"days":[1,8,15,22]},"id":"c2c3b876-5d22-49ef-9f01-55c4007ec3ff","type":"DaysTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEA=","dtype":"float64","shape":[25]}}},"id":"bd516d7e-f534-41cb-8f33-27ab029eb302","type":"ColumnDataSource"},{"attributes":{"plot":{"id":"23bd3064-7b03-4730-9455-daff372129b0","subtype":"Figure","type":"Plot"}},"id":"c437f336-22d4-47ab-92b8-512a5c8dd976","type":"ResetTool"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983]}},"id":"0d6623a5-bda0-433c-980a-9e263215cf1f","type":"ColumnDataSource"},{"attributes":{"label":{"value":"rate fits files"},"renderers":[{"id":"400ba1e2-7c47-449e-a5e7-7f315638c83c","type":"GlyphRenderer"}]},"id":"ac6ba57d-7622-4cd1-bd92-c5b4e5572cee","type":"LegendItem"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"1bdb589e-ef40-454c-9642-8ab908620c11","type":"DaysTicker"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"a185894f-c931-4e1f-b771-a26b13dc0fee","type":"BoxAnnotation"},{"attributes":{"days":[1,15]},"id":"e8e4d59b-d137-4250-8f08-ce43b20814f3","type":"DaysTicker"},{"attributes":{"below":[{"id":"bf30d024-7169-402f-8d67-ad0a1eaa4e11","type":"DatetimeAxis"}],"left":[{"id":"58a456a6-c6b4-4f8a-bc19-d25c1656c7b2","type":"LinearAxis"}],"renderers":[{"id":"bf30d024-7169-402f-8d67-ad0a1eaa4e11","type":"DatetimeAxis"},{"id":"ad541891-83dc-46a9-b948-177d2dfc7f95","type":"Grid"},{"id":"58a456a6-c6b4-4f8a-bc19-d25c1656c7b2","type":"LinearAxis"},{"id":"c76f424b-42f3-43ac-baad-87c8aeca63ca","type":"Grid"},{"id":"eeb23522-001e-4c13-917d-456ed3542c3e","type":"BoxAnnotation"},{"id":"38e75e64-419a-4232-b8ef-7e0bbf004f25","type":"Legend"},{"id":"2220f817-c9f0-436a-9870-48937a96dc9f","type":"GlyphRenderer"},{"id":"d08440e5-5498-41d1-aa8c-ce6b0ca63a2d","type":"GlyphRenderer"},{"id":"bddb7bad-e12c-44f7-957d-e7f2a3ae77d0","type":"GlyphRenderer"},{"id":"6a54b16e-1b27-41a6-b2fb-45259e5b174b","type":"GlyphRenderer"},{"id":"389be021-e56d-4cbd-a710-792ec0802edd","type":"GlyphRenderer"},{"id":"2f6e66c7-3f51-4495-b45f-702c18653a43","type":"GlyphRenderer"},{"id":"400ba1e2-7c47-449e-a5e7-7f315638c83c","type":"GlyphRenderer"},{"id":"d281fffc-3cef-4d70-aede-32384969d529","type":"GlyphRenderer"},{"id":"30ec13fe-a19f-45d0-988c-331fe4126276","type":"GlyphRenderer"},{"id":"1e453549-6c01-4a53-b9e2-539b40013c11","type":"GlyphRenderer"},{"id":"25952b66-5b1a-4140-b020-9991de572bad","type":"GlyphRenderer"},{"id":"753f5064-2a31-44dd-86ff-14268167e6c9","type":"GlyphRenderer"}],"title":{"id":"1fe3f910-35d5-4171-94ad-44fbcfbd970e","type":"Title"},"tool_events":{"id":"6227ebb1-f485-46c4-840b-55d6d2e7301a","type":"ToolEvents"},"toolbar":{"id":"c18634ea-cb96-4962-bde1-a0f11fcaabb2","type":"Toolbar"},"toolbar_location":null,"x_range":{"id":"8ecefa3a-b82b-4c6f-a31c-987d5214c941","type":"DataRange1d"},"y_range":{"id":"28d23309-f8a5-4d85-921c-cb8311aed547","type":"DataRange1d"}},"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"5816850a-7133-42fe-b05c-d10eb540dc61","type":"DaysTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983]}},"id":"3e678b93-8ffb-4831-a076-df5461d0e613","type":"ColumnDataSource"},{"attributes":{"line_color":{"value":"purple"},"x":{"field":"x"},"y":{"field":"y"}},"id":"3f57063e-a316-43ce-8036-1829c503bd01","type":"Line"},{"attributes":{"data_source":{"id":"2eb3ae3d-acc6-4e48-89aa-e899c1bedef5","type":"ColumnDataSource"},"glyph":{"id":"a27f2bc1-f9cc-4c16-b76e-05da21455cb3","type":"Asterisk"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"a3effb8d-8d01-423c-b43d-dd854e3dfd15","type":"Asterisk"},"selection_glyph":null},"id":"1e453549-6c01-4a53-b9e2-539b40013c11","type":"GlyphRenderer"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"d5e24009-af1c-4675-b54e-de5ae5fcd145","type":"AdaptiveTicker"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"a3effb8d-8d01-423c-b43d-dd854e3dfd15","type":"Asterisk"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"1a2a9e67-e327-4a29-afa4-5b523c48c0d8","type":"AdaptiveTicker"},{"attributes":{"days":[1,8,15,22]},"id":"f68e01c8-23c4-4530-8bf4-a8ef16dfdfde","type":"DaysTicker"},{"attributes":{"data_source":{"id":"df7dea0c-df28-4040-9aef-c71decec7af0","type":"ColumnDataSource"},"glyph":{"id":"0058e57c-0df5-4176-baf9-01f4e6508640","type":"X"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"0bacfb4f-d4f8-42f9-9502-80217f3aebaf","type":"X"},"selection_glyph":null},"id":"d38143a2-315e-4851-8110-b701bcc16f5c","type":"GlyphRenderer"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"e2ae5a1b-3b5a-4b71-a8aa-1e03f2bd4000","type":"MonthsTicker"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"0bacfb4f-d4f8-42f9-9502-80217f3aebaf","type":"X"},{"attributes":{"fill_color":{"value":"purple"},"line_color":{"value":"purple"},"x":{"field":"x"},"y":{"field":"y"}},"id":"0058e57c-0df5-4176-baf9-01f4e6508640","type":"X"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"043c9740-fca3-4e93-8a06-5f551a163c36","type":"AdaptiveTicker"},{"attributes":{"fill_color":{"value":"red"},"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c9d00a60-c8e7-463d-83ee-293026bf8001","type":"Diamond"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"89aeec03-ce45-427f-9481-2429ca81c660","type":"Diamond"},{"attributes":{"data_source":{"id":"3e678b93-8ffb-4831-a076-df5461d0e613","type":"ColumnDataSource"},"glyph":{"id":"c9d00a60-c8e7-463d-83ee-293026bf8001","type":"Diamond"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"89aeec03-ce45-427f-9481-2429ca81c660","type":"Diamond"},"selection_glyph":null},"id":"8947c0af-13a9-472b-a211-29d935efe20e","type":"GlyphRenderer"},{"attributes":{"label":{"value":"rate fits files"},"renderers":[{"id":"08b92294-79eb-4a8e-b8cf-8da59ce3b366","type":"GlyphRenderer"}]},"id":"cfd52bd8-bc4e-44d5-bead-5fb85f365648","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276]}},"id":"780defa9-5161-4103-a451-69f9a095d8f6","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851]}},"id":"2d133071-420c-4dd3-9e0d-802ff92a4700","type":"ColumnDataSource"},{"attributes":{"children":[{"id":"e09bb773-ec12-4283-aea7-abd199a4e2c2","type":"Row"},{"id":"5d68b34c-771e-4e2e-b5c9-a67ad9ca441b","type":"Row"}]},"id":"f06bda53-9ee3-4720-a413-6cedaf3c5a48","type":"Column"},{"attributes":{"data_source":{"id":"1804755b-53e1-407e-bcad-f3c185212ec1","type":"ColumnDataSource"},"glyph":{"id":"9e460312-684d-4d97-b38d-5cfe68685438","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"9b5403e3-54af-49c2-9eca-d10d726bad67","type":"Line"},"selection_glyph":null},"id":"08b92294-79eb-4a8e-b8cf-8da59ce3b366","type":"GlyphRenderer"},{"attributes":{"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"9e460312-684d-4d97-b38d-5cfe68685438","type":"Line"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"7e915ea1-0c84-45e5-8a19-629ce1eae581","type":"MonthsTicker"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"9b5403e3-54af-49c2-9eca-d10d726bad67","type":"Line"},{"attributes":{"months":[0,6]},"id":"40534f58-506d-4d29-a312-e46245548944","type":"MonthsTicker"},{"attributes":{},"id":"c6d3c3a9-c470-4005-b1d3-ce260c9b03a5","type":"YearsTicker"},{"attributes":{"months":[0,4,8]},"id":"f4223d9d-989c-4e88-862a-568f26cb50ab","type":"MonthsTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0AAAEA8ruJfQAAAQDyu4l9AAABAPK7iX0A=","dtype":"float64","shape":[25]}}},"id":"c9a1abc1-ed56-40e3-97fc-cb539891ac3f","type":"ColumnDataSource"},{"attributes":{"sizing_mode":"scale_width","toolbar_location":"above","tools":[{"id":"60e19b94-81f3-4a5b-a417-d28f1a9384cd","type":"PanTool"},{"id":"3511cf69-feab-4da0-8cfd-2f7f8c95571f","type":"BoxZoomTool"},{"id":"0abfbcc4-d9c3-4399-9c37-d1ee428c0b0a","type":"ResetTool"},{"id":"d56a4637-bebd-49de-b1d9-e99f0cef0805","type":"SaveTool"},{"id":"3d553f46-80be-49c7-be60-1385dc59400d","type":"PanTool"},{"id":"02f67862-ff19-4f8b-aa63-1dace43bc79d","type":"BoxZoomTool"},{"id":"1fd3c902-bb06-4cf0-9e62-ecc08e329065","type":"ResetTool"},{"id":"7d42f462-435f-45a9-ba06-921414a8c7d7","type":"SaveTool"},{"id":"d0067da3-ce29-4f1f-afb5-248a3854f398","type":"PanTool"},{"id":"dd1f44ac-5912-4463-847e-69047d3269c6","type":"BoxZoomTool"},{"id":"c437f336-22d4-47ab-92b8-512a5c8dd976","type":"ResetTool"},{"id":"b8b7f68b-f8b0-441c-bad7-6e06ffa24787","type":"SaveTool"},{"id":"b9c3308f-cb11-4b8f-a6b9-790a4b8de085","type":"PanTool"},{"id":"2f0e3e43-48c1-498f-9bac-5ae028797ed6","type":"BoxZoomTool"},{"id":"c3d9134c-9736-4883-b3de-6f9fbb21b65c","type":"ResetTool"},{"id":"9b91db84-0759-4f80-8b78-5c28d23a3a76","type":"SaveTool"}]},"id":"3d8cea66-eec7-4f5e-bd12-246b06207e44","type":"ToolbarBox"},{"attributes":{"items":[{"id":"d3aab170-cfcc-46d9-9ec5-f4873f50ae31","type":"LegendItem"},{"id":"02ed6e2b-89d4-47d4-b584-1d8a51c11bd9","type":"LegendItem"},{"id":"e98194e3-8786-4b95-b467-3922db06330e","type":"LegendItem"},{"id":"ac6ba57d-7622-4cd1-bd92-c5b4e5572cee","type":"LegendItem"},{"id":"7af883db-f635-448b-8db8-37bf0002efa9","type":"LegendItem"},{"id":"dfafa13f-9d7a-4432-ba7f-d3055320c14a","type":"LegendItem"}],"plot":{"id":"5db71428-e6ac-43c9-9f60-e212fe565dca","subtype":"Figure","type":"Plot"}},"id":"38e75e64-419a-4232-b8ef-7e0bbf004f25","type":"Legend"},{"attributes":{"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"aee4b8d8-e454-49af-9de0-36e311615a47","type":"Line"},{"attributes":{"children":[{"id":"3d8cea66-eec7-4f5e-bd12-246b06207e44","type":"ToolbarBox"},{"id":"f06bda53-9ee3-4720-a413-6cedaf3c5a48","type":"Column"}]},"id":"96f08819-7695-4447-9677-3818752101f1","type":"Column"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"50d96e49-0713-4b3c-9b43-49a7ea96c7cc","type":"Line"},{"attributes":{"data_source":{"id":"2d133071-420c-4dd3-9e0d-802ff92a4700","type":"ColumnDataSource"},"glyph":{"id":"aee4b8d8-e454-49af-9de0-36e311615a47","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"50d96e49-0713-4b3c-9b43-49a7ea96c7cc","type":"Line"},"selection_glyph":null},"id":"f6ea966e-deca-48a0-8c2b-1b01853a54e4","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608,608]}},"id":"df7dea0c-df28-4040-9aef-c71decec7af0","type":"ColumnDataSource"},{"attributes":{"data_source":{"id":"d0000ea0-0ca5-457f-9256-2e2f59b041de","type":"ColumnDataSource"},"glyph":{"id":"ee2bbd78-8eab-434c-a64d-65609b95a287","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"07f033c9-6e1d-4ebd-9032-f70a5e4501c9","type":"Line"},"selection_glyph":null},"id":"bddb7bad-e12c-44f7-957d-e7f2a3ae77d0","type":"GlyphRenderer"},{"attributes":{"label":{"value":"Total fits files"},"renderers":[{"id":"2220f817-c9f0-436a-9870-48937a96dc9f","type":"GlyphRenderer"}]},"id":"d3aab170-cfcc-46d9-9ec5-f4873f50ae31","type":"LegendItem"},{"attributes":{"label":{"value":"rateints fits files"},"renderers":[{"id":"122c4a3a-74db-4c47-ac70-b32015b9a1d7","type":"GlyphRenderer"}]},"id":"4b84a15e-33b0-462f-8867-58db605e8fcf","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395,2395]}},"id":"1804755b-53e1-407e-bcad-f3c185212ec1","type":"ColumnDataSource"},{"attributes":{"fill_color":{"value":"orange"},"line_color":{"value":"orange"},"x":{"field":"x"},"y":{"field":"y"}},"id":"7917eda0-37f2-4a20-aeff-cb8a3e36149e","type":"Asterisk"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"fe5e77dc-052e-427a-9d2b-9ad18f8c5c55","type":"AdaptiveTicker"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"469b0cc1-3bbf-4940-9936-33499374a1b4","type":"Line"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c45e1401-f8d4-4e4d-85c7-6f8626dd1cc9","type":"Asterisk"},{"attributes":{"data_source":{"id":"752e82bc-d0db-45be-80e3-976caeabfe08","type":"ColumnDataSource"},"glyph":{"id":"ba433c33-83be-4faf-8d63-45788e0a70fd","type":"Square"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"c84b4251-117e-42f6-be42-875d40cc490b","type":"Square"},"selection_glyph":null},"id":"00b34c30-92d1-4360-af90-cb20df645ff4","type":"GlyphRenderer"},{"attributes":{"fill_alpha":{"value":0.1},"fill_color":{"value":"#1f77b4"},"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c84b4251-117e-42f6-be42-875d40cc490b","type":"Square"},{"attributes":{"fill_color":{"value":"blue"},"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"ba433c33-83be-4faf-8d63-45788e0a70fd","type":"Square"},{"attributes":{"data_source":{"id":"780defa9-5161-4103-a451-69f9a095d8f6","type":"ColumnDataSource"},"glyph":{"id":"7917eda0-37f2-4a20-aeff-cb8a3e36149e","type":"Asterisk"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"c45e1401-f8d4-4e4d-85c7-6f8626dd1cc9","type":"Asterisk"},"selection_glyph":null},"id":"2742f0df-eaff-4d7e-86be-19a7a71e427f","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":["2018-05-31T16:22:31.064827","2018-05-31T16:23:34.875007","2018-06-25T14:36:01.228092","2018-06-25T14:56:10.766647","2018-06-26T01:00:14.555477","2018-06-27T01:00:22.052019","2018-06-28T01:00:21.513147","2018-06-29T01:00:22.476578","2018-06-30T01:00:24.224710","2018-07-01T01:00:25.511597","2018-07-02T01:00:24.422766","2018-07-03T01:00:23.460390","2018-07-04T01:00:28.309859","2018-07-05T01:00:54.879811","2018-07-06T01:00:26.537881","2018-07-07T01:00:26.895856","2018-07-08T01:00:29.161379","2018-07-09T01:00:28.473588","2018-07-10T01:00:27.613517","2018-07-11T01:00:16.129835","2018-07-12T01:02:27.080409","2018-07-13T01:00:19.554408","2018-07-14T01:00:22.178614","2018-07-15T01:00:38.036625","2018-07-16T01:01:26.903659"],"y":[851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851]}},"id":"752e82bc-d0db-45be-80e3-976caeabfe08","type":"ColumnDataSource"},{"attributes":{},"id":"b2359f7e-9340-4191-a6aa-1419f20d9063","type":"DatetimeTickFormatter"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"069095e7-27c3-4654-8428-e847a13e1545","type":"AdaptiveTicker"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":[1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276]}},"id":"f228f770-227b-4dcc-984d-1abbceb3ab80","type":"ColumnDataSource"},{"attributes":{"data_source":{"id":"f228f770-227b-4dcc-984d-1abbceb3ab80","type":"ColumnDataSource"},"glyph":{"id":"d5daa592-e46c-4186-935b-2302962424c0","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"e1ccd822-a2a5-44c4-b7dd-2aa591be0188","type":"Line"},"selection_glyph":null},"id":"122c4a3a-74db-4c47-ac70-b32015b9a1d7","type":"GlyphRenderer"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"e1ccd822-a2a5-44c4-b7dd-2aa591be0188","type":"Line"},{"attributes":{"data_source":{"id":"ff5788ef-f90e-4f33-aac6-9dc510b0240b","type":"ColumnDataSource"},"glyph":{"id":"93dc5af9-6558-4b81-82c2-17bed6df3ea5","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"4c770ba7-1f35-4ad8-af2d-b81fb90f33d4","type":"Line"},"selection_glyph":null},"id":"2220f817-c9f0-436a-9870-48937a96dc9f","type":"GlyphRenderer"},{"attributes":{"line_color":{"value":"orange"},"x":{"field":"x"},"y":{"field":"y"}},"id":"d5daa592-e46c-4186-935b-2302962424c0","type":"Line"},{"attributes":{},"id":"cd14b243-1dfc-4e51-8db4-dcd9a3985887","type":"BasicTickFormatter"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUA=","dtype":"float64","shape":[25]}}},"id":"ff5788ef-f90e-4f33-aac6-9dc510b0240b","type":"ColumnDataSource"},{"attributes":{"plot":null,"text":"Total File Sizes by Type"},"id":"1fe3f910-35d5-4171-94ad-44fbcfbd970e","type":"Title"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"b9c3308f-cb11-4b8f-a6b9-790a4b8de085","type":"PanTool"},{"id":"2f0e3e43-48c1-498f-9bac-5ae028797ed6","type":"BoxZoomTool"},{"id":"c3d9134c-9736-4883-b3de-6f9fbb21b65c","type":"ResetTool"},{"id":"9b91db84-0759-4f80-8b78-5c28d23a3a76","type":"SaveTool"}]},"id":"c18634ea-cb96-4962-bde1-a0f11fcaabb2","type":"Toolbar"},{"attributes":{"line_color":{"value":"red"},"x":{"field":"x"},"y":{"field":"y"}},"id":"ee2bbd78-8eab-434c-a64d-65609b95a287","type":"Line"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"c05f0913-cc0b-4a9c-a653-a24218cfe673","type":"Line"},{"attributes":{"label":{"value":"i2d fits files"},"renderers":[{"id":"a709dd5a-3ccb-4402-a7a4-207db94831c6","type":"GlyphRenderer"}]},"id":"d8cd6315-dee8-47ac-a8d4-8741d447397a","type":"LegendItem"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUAAAIjERKCJQAAAiMREoIlAAACIxESgiUA=","dtype":"float64","shape":[25]}}},"id":"60fae463-96e0-4499-aa29-18809270b8f7","type":"ColumnDataSource"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"07f033c9-6e1d-4ebd-9032-f70a5e4501c9","type":"Line"},{"attributes":{"data_source":{"id":"c9a1abc1-ed56-40e3-97fc-cb539891ac3f","type":"ColumnDataSource"},"glyph":{"id":"89331a95-a58d-4b07-8af2-ff66fdb9071c","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"469b0cc1-3bbf-4940-9936-33499374a1b4","type":"Line"},"selection_glyph":null},"id":"400ba1e2-7c47-449e-a5e7-7f315638c83c","type":"GlyphRenderer"},{"attributes":{"line_color":{"value":"green"},"x":{"field":"x"},"y":{"field":"y"}},"id":"89331a95-a58d-4b07-8af2-ff66fdb9071c","type":"Line"},{"attributes":{"data_source":{"id":"c27fe8be-eebe-4e81-a24d-4e61f84420ed","type":"ColumnDataSource"},"glyph":{"id":"3f57063e-a316-43ce-8036-1829c503bd01","type":"Line"},"hover_glyph":null,"muted_glyph":null,"nonselection_glyph":{"id":"c05f0913-cc0b-4a9c-a653-a24218cfe673","type":"Line"},"selection_glyph":null},"id":"25952b66-5b1a-4140-b020-9991de572bad","type":"GlyphRenderer"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkAAAADFTsY2QAAAAMVOxjZAAAAAxU7GNkA=","dtype":"float64","shape":[25]}}},"id":"c27fe8be-eebe-4e81-a24d-4e61f84420ed","type":"ColumnDataSource"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"O43ZH3A7dkIdsG0vcDt2QnnBlPd1Q3ZCWurgHndDdkKit3WvmUN2Qk5AChfsQ3ZCWpKofD5EdkI/yaTikER2QlwL0kjjRHZCjXnirjVFdkJCbF4UiEV2Qj1G4nnaRXZCvl3R4CxGdkL6/A1Nf0Z2Qhme4qvRRnZCsv24ESRHdkIQlgZ4dkd2QmiZm93IR3ZCRtglQxtIdkJcHRimbUh2QouG0CvASHZChyZuchJJdkLTKdLYZEl2QgBKcUK3SXZCi3oftAlKdkI=","dtype":"float64","shape":[25]},"y":{"__ndarray__":"AACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUAAAKB/zRtlQAAAoH/NG2VAAACgf80bZUA=","dtype":"float64","shape":[25]}}},"id":"d0000ea0-0ca5-457f-9256-2e2f59b041de","type":"ColumnDataSource"},{"attributes":{},"id":"6227ebb1-f485-46c4-840b-55d6d2e7301a","type":"ToolEvents"},{"attributes":{"plot":null,"text":"System stats"},"id":"d3ba7f42-6fd6-4517-8035-9487b8d743d6","type":"Title"},{"attributes":{"below":[{"id":"39cd38b6-a3a2-4f45-87be-bfc5a4594331","type":"DatetimeAxis"}],"left":[{"id":"897265b9-a8a5-4847-be9b-7014127bfdd9","type":"LinearAxis"}],"renderers":[{"id":"39cd38b6-a3a2-4f45-87be-bfc5a4594331","type":"DatetimeAxis"},{"id":"c5d7b825-7dc4-4c95-a88c-c6d500f94595","type":"Grid"},{"id":"897265b9-a8a5-4847-be9b-7014127bfdd9","type":"LinearAxis"},{"id":"03912cf7-ceeb-48cf-9fc5-60a6b5db6ba9","type":"Grid"},{"id":"c7f5d9b9-5039-47df-bcd2-2733ae077aea","type":"BoxAnnotation"},{"id":"f60d1b3b-e505-4985-9da5-16f8592de673","type":"GlyphRenderer"},{"id":"917f7296-eab9-4ff6-936c-655cbca1ba6f","type":"GlyphRenderer"}],"title":{"id":"a7e6fe59-e3b5-4ee5-95c0-972cbb6ee11a","type":"Title"},"tool_events":{"id":"569f6ac8-0faf-42af-8378-dafb5f299964","type":"ToolEvents"},"toolbar":{"id":"2a71acb8-3393-4b80-8cc7-e7a364034f52","type":"Toolbar"},"toolbar_location":null,"x_range":{"id":"1b71728c-821c-48c7-b8a4-eebbbe0fb07c","type":"DataRange1d"},"y_range":{"id":"946901ca-a7cc-4b26-9a74-0a32b50e3580","type":"DataRange1d"}},"id":"9508cd1a-44a6-4d36-a835-a71a60401ff7","subtype":"Figure","type":"Plot"}],"root_ids":["96f08819-7695-4447-9677-3818752101f1"]},"title":"Bokeh Application","version":"1.2.0"}}; var render_items = [{"docid":"34902372-cbe5-4439-a46d-64324ed09090","elementid":"83dc4a9b-d22e-4e1a-8e9e-e8886f385b5e","modelid":"96f08819-7695-4447-9677-3818752101f1"}]; Bokeh.embed.embed_items(docs_json, render_items); diff --git a/jwql/website/apps/jwql/templates/miri_data_trending.html b/jwql/website/apps/jwql/templates/miri_data_trending.html index 06637cbd5..b1d8ce752 100644 --- a/jwql/website/apps/jwql/templates/miri_data_trending.html +++ b/jwql/website/apps/jwql/templates/miri_data_trending.html @@ -42,8 +42,8 @@

How it works

Bokeh Scatter Plots - - + + @@ -52,9 +52,9 @@

How it works

- - - + + +
{{ dashboard[1] | safe }} diff --git a/jwql/website/apps/jwql/templates/nirspec_data_trending.html b/jwql/website/apps/jwql/templates/nirspec_data_trending.html index 24fae4b84..4fef007d7 100644 --- a/jwql/website/apps/jwql/templates/nirspec_data_trending.html +++ b/jwql/website/apps/jwql/templates/nirspec_data_trending.html @@ -37,7 +37,7 @@

How it works

in case these would appear.
In total there are 7 different tabs: 1) Power 2) Reference Voltages 3) Temperatures 4) MSA and MCE 5) FPA and FPE 6) CAA Lamps and 7) Filter and Grating Wheel. Each of these tabs has its own specific set of plots. One can hover over the data points and detailed - statistics will appear. Also, there are various zoom and pan tools implemented allowing the user to manipulate the graphs. + statistics will appear. Also, there are various zoom and pan tools implemented allowing the user to manipulate the graphs. Curves can be activated and muted by clicking on the legend.
In the future, a cron job referring to the EDB will populate the database over time.
@@ -49,8 +49,8 @@

How it works

Bokeh Scatter Plots - - + + From 19f71cefd8dba060f44e7a4fc9b50fd237f3b8db Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Wed, 12 Jun 2019 10:12:44 -0400 Subject: [PATCH 23/86] Try to fix jenkins --- jwql/tests/test_plotting.py | 2 +- jwql/website/apps/jwql/templates/nirspec_data_trending.html | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jwql/tests/test_plotting.py b/jwql/tests/test_plotting.py index 4d142fcdb..c10826f6f 100755 --- a/jwql/tests/test_plotting.py +++ b/jwql/tests/test_plotting.py @@ -60,7 +60,7 @@ def test_bokeh_version(): all_web_html_files = glob.glob(template_paths) for file in all_web_html_files: - with open(file) as f: + with open(file, 'r+', encoding="utf-8") as f: content = f.read() # Find all of the times "bokeh-#.#.#' appears in a template diff --git a/jwql/website/apps/jwql/templates/nirspec_data_trending.html b/jwql/website/apps/jwql/templates/nirspec_data_trending.html index 4fef007d7..62bdda5a8 100644 --- a/jwql/website/apps/jwql/templates/nirspec_data_trending.html +++ b/jwql/website/apps/jwql/templates/nirspec_data_trending.html @@ -59,9 +59,9 @@

How it works

- - - + + +
{{ dashboard[1] | safe }} From 946d045f827cffd14577423e9f36d73f8cdba7f6 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Wed, 12 Jun 2019 11:20:03 -0400 Subject: [PATCH 24/86] Removed some whitespace per @pep8speaks --- jwql/tests/test_plotting.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jwql/tests/test_plotting.py b/jwql/tests/test_plotting.py index c10826f6f..1228a405a 100755 --- a/jwql/tests/test_plotting.py +++ b/jwql/tests/test_plotting.py @@ -35,7 +35,7 @@ def test_bar_chart(): """Make sure some dummy data generates a ``bokeh`` plot""" - + # Make a toy dataframe data = DataFrame({'meow': {'foo': 12, 'bar': 23, 'baz': 2}, 'mix': {'foo': 45, 'bar': 31, 'baz': 23}, From c00b298587354a6e5328aac074b515f319bfd336 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 17 Jun 2019 15:46:14 -0400 Subject: [PATCH 25/86] Update psycopg2 from 2.8.2 to 2.8.3 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 985d2fded..8d25a6898 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,7 @@ matplotlib==3.1.0 numpy==1.16.4 numpydoc==0.9.1 pandas==0.24.2 -psycopg2==2.8.2 +psycopg2==2.8.3 pysiaf==0.2.5 python-dateutil==2.8.0 pytest==4.6.2 From ee561e943b148d39677492c39d4e588505d35db0 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 17 Jun 2019 15:46:20 -0400 Subject: [PATCH 26/86] Update pysiaf from 0.2.5 to 0.3.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8d25a6898..d7e639357 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,7 +14,7 @@ numpy==1.16.4 numpydoc==0.9.1 pandas==0.24.2 psycopg2==2.8.3 -pysiaf==0.2.5 +pysiaf==0.3.0 python-dateutil==2.8.0 pytest==4.6.2 sphinx==2.1.1 From e290fc7d98a4c6289ff01abafd9c2a7799e33dfc Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 17 Jun 2019 15:46:21 -0400 Subject: [PATCH 27/86] Update pytest from 4.6.2 to 4.6.3 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d7e639357..0a07267d7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ pandas==0.24.2 psycopg2==2.8.3 pysiaf==0.3.0 python-dateutil==2.8.0 -pytest==4.6.2 +pytest==4.6.3 sphinx==2.1.1 sphinx-automodapi==0.11 sqlalchemy==1.3.4 From 6f468969e5111efba37bd0c00a47ae72a1bea7f1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 17 Jun 2019 15:46:22 -0400 Subject: [PATCH 28/86] Update sqlalchemy from 1.3.4 to 1.3.5 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0a07267d7..437ca444e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,6 +19,6 @@ python-dateutil==2.8.0 pytest==4.6.3 sphinx==2.1.1 sphinx-automodapi==0.11 -sqlalchemy==1.3.4 +sqlalchemy==1.3.5 stsci_rtd_theme==0.0.2 pytest-cov=2.6.0 From 0ca5be3420db6df69ded5c7bee2f4167c9692af6 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 17 Jun 2019 17:13:37 -0400 Subject: [PATCH 29/86] Update with 6/17/19 dependencies --- environment_python_3_6.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/environment_python_3_6.yml b/environment_python_3_6.yml index 1f0623de1..6f8e1b4c4 100644 --- a/environment_python_3_6.yml +++ b/environment_python_3_6.yml @@ -20,17 +20,17 @@ dependencies: - psycopg2=2.7.5 - python=3.6.4 - python-dateutil=2.7.5 -- pytest=4.5.0 +- pytest=4.6.2 - pytest-cov=2.6.1 - pytest-html=1.19.0 - sphinx=2.1.0 - sphinx_rtd_theme=0.1.9 -- sqlalchemy=1.3.3 +- sqlalchemy=1.3.4 - stsci_rtd_theme=0.0.2 - twine=1.13.0 - pip: - authlib==0.10 - codecov==2.0.15 - jwedb>=0.0.3 - - pysiaf==0.2.5 + - pysiaf==0.3.0 - sphinx-automodapi==0.10 From 92ee1a6ce9c8dbea6bc7f975e96d10f9d4a7efd9 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Tue, 18 Jun 2019 16:22:59 -0400 Subject: [PATCH 30/86] Slight tweak to assert statements to better handle partial data --- jwql/tests/test_api_views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jwql/tests/test_api_views.py b/jwql/tests/test_api_views.py index 7686f08da..5c97becee 100644 --- a/jwql/tests/test_api_views.py +++ b/jwql/tests/test_api_views.py @@ -107,7 +107,7 @@ def test_api_views(url): try: data = json.loads(url.read().decode()) + assert len(data[data_type]) > 0 except (http.client.IncompleteRead) as e: data = e.partial - - assert len(data[data_type]) > 0 + assert len(data) > 0 From 0f06f2bbddd82aaf63339a8a94b3e753739d69ad Mon Sep 17 00:00:00 2001 From: cracraft Date: Fri, 21 Jun 2019 10:09:17 -0400 Subject: [PATCH 31/86] removed unique date definition in database --- jwql/database/database_interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jwql/database/database_interface.py b/jwql/database/database_interface.py index abd212675..5aa9b73fe 100644 --- a/jwql/database/database_interface.py +++ b/jwql/database/database_interface.py @@ -252,7 +252,7 @@ class CentralStore(base): # Define the columns id = Column(Integer, primary_key=True, nullable=False) - date = Column(DateTime, unique=True, nullable=False) + date = Column(DateTime, nullable=False) area = Column(String(), nullable=False) size = Column(Float, nullable=False) used = Column(Float, nullable=False) From 8625a9c9d88edf17586a9f5f47c2fc70fbbd0128 Mon Sep 17 00:00:00 2001 From: Bryan Hilbert Date: Fri, 21 Jun 2019 11:20:24 -0400 Subject: [PATCH 32/86] Increase width of footer object containing jwql version number --- jwql/website/apps/jwql/static/css/jwql.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jwql/website/apps/jwql/static/css/jwql.css b/jwql/website/apps/jwql/static/css/jwql.css index b801c8358..4efa95f4a 100644 --- a/jwql/website/apps/jwql/static/css/jwql.css +++ b/jwql/website/apps/jwql/static/css/jwql.css @@ -482,7 +482,7 @@ display : inline; /*Format the version identifier text in bottom corner*/ #version-div { float: right; - width: 120px; + width: 180px; text-align: right; color: white; font-size: 12px From efa92ed87747bfd0bc22ef2d8990bd45f9c5475d Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Fri, 21 Jun 2019 13:52:14 -0400 Subject: [PATCH 33/86] Updates needed to get django version 2.2 working --- environment_python_3_6.yml | 3 ++- jwql/website/apps/jwql/views.py | 2 +- jwql/website/jwql_proj/settings.py | 17 +++++++++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/environment_python_3_6.yml b/environment_python_3_6.yml index 6f8e1b4c4..0d5dd3e03 100644 --- a/environment_python_3_6.yml +++ b/environment_python_3_6.yml @@ -7,7 +7,7 @@ dependencies: - astroquery=0.3.9 - bokeh=1.2.0 - crds>=7.2.7 -- django=2.1.7 +- django=2.2.1 - inflection=0.3.1 - ipython=7.5.0 - jinja2=2.10 @@ -26,6 +26,7 @@ dependencies: - sphinx=2.1.0 - sphinx_rtd_theme=0.1.9 - sqlalchemy=1.3.4 +- sqlparse=0.3.0 - stsci_rtd_theme=0.0.2 - twine=1.13.0 - pip: diff --git a/jwql/website/apps/jwql/views.py b/jwql/website/apps/jwql/views.py index 4d743db7e..990e05a9e 100644 --- a/jwql/website/apps/jwql/views.py +++ b/jwql/website/apps/jwql/views.py @@ -383,7 +383,7 @@ def instrument(request, inst): return render(request, template, context) -def not_found(request): +def not_found(request, *kwargs): """Generate a ``not_found`` page Parameters diff --git a/jwql/website/jwql_proj/settings.py b/jwql/website/jwql_proj/settings.py index b7d8d112c..9498b8fb9 100644 --- a/jwql/website/jwql_proj/settings.py +++ b/jwql/website/jwql_proj/settings.py @@ -73,9 +73,22 @@ 'OPTIONS': { 'environment': 'jwql.website.jwql_proj.jinja2.environment', 'extensions': ['jwql.website.jwql_proj.jinja2.DjangoNow'], - 'context_processors': ['jwql.website.apps.jwql.context_processors.base_context'], + 'context_processors': [ + 'jwql.website.apps.jwql.context_processors.base_context', + ], }, - } + }, + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages' + ], + }, + }, ] WSGI_APPLICATION = 'jwql.website.jwql_proj.wsgi.application' From 31ac42537b1f25dab66ce24f6060c0553a501f65 Mon Sep 17 00:00:00 2001 From: cracraft Date: Fri, 21 Jun 2019 15:25:16 -0400 Subject: [PATCH 34/86] testing, no real change --- jwql/jwql_monitors/monitor_filesystem.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jwql/jwql_monitors/monitor_filesystem.py b/jwql/jwql_monitors/monitor_filesystem.py index 84ec332d5..34e7e136a 100755 --- a/jwql/jwql_monitors/monitor_filesystem.py +++ b/jwql/jwql_monitors/monitor_filesystem.py @@ -165,7 +165,7 @@ def get_area_stats(central_storage_dict): arealist = ['logs', 'outputs', 'test', 'preview_images', 'thumbnails', 'all'] counteddirs = [] - sum = 0 # to be used to count 'all' + sums = 0 # to be used to count 'all' for area in arealist: used = 0 @@ -204,7 +204,7 @@ def get_area_stats(central_storage_dict): if exists: filesize = os.path.getsize(file_path) used += filesize - sum += filesize + sums += filesize use = used / (1024 ** 4) central_storage_dict[area]['used'] = use print(area, total, use, free) From c7a31e64b35183f89fb52f2907ff4aad4215f6a2 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 24 Jun 2019 12:44:45 -0400 Subject: [PATCH 35/86] Added try/except around processing of new files since some of them may not exist in current filesystem --- jwql/instrument_monitors/common_monitors/dark_monitor.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/jwql/instrument_monitors/common_monitors/dark_monitor.py b/jwql/instrument_monitors/common_monitors/dark_monitor.py index 8786e05fb..ab2e31a70 100755 --- a/jwql/instrument_monitors/common_monitors/dark_monitor.py +++ b/jwql/instrument_monitors/common_monitors/dark_monitor.py @@ -735,7 +735,13 @@ def run(self): .format(self.instrument, self.aperture)) # Get full paths to the files - new_filenames = [filesystem_path(file_entry['filename']) for file_entry in new_entries] + new_filenames = [] + for file_entry in new_entries: + try: + new_filenames.append(filesystem_path(file_entry['filename'])) + except FileNotFoundError: + logging.warning('\t\tUnable to locate {} in filesystem. Not including in processing.' + .format(file_entry['filename'])) # Set up directories for the copied data ensure_dir_exists(os.path.join(self.output_dir, 'data')) From ea4885ffbf6844318d0a33b7239e4a1787645bbb Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 24 Jun 2019 12:57:17 -0400 Subject: [PATCH 36/86] minor changes to appease @pep8speaks --- jwql/instrument_monitors/common_monitors/dark_monitor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jwql/instrument_monitors/common_monitors/dark_monitor.py b/jwql/instrument_monitors/common_monitors/dark_monitor.py index ab2e31a70..3cd4fcb61 100755 --- a/jwql/instrument_monitors/common_monitors/dark_monitor.py +++ b/jwql/instrument_monitors/common_monitors/dark_monitor.py @@ -953,7 +953,7 @@ def stats_by_amp(self, image, amps): degrees_of_freedom = len(hist) - 3. total_pix = np.sum(hist[positive]) p_i = gauss_fit[positive] / total_pix - gaussian_chi_squared[key] = (np.sum((hist[positive] - (total_pix*p_i)**2) / (total_pix*p_i)) + gaussian_chi_squared[key] = (np.sum((hist[positive] - (total_pix * p_i) ** 2) / (total_pix * p_i)) / degrees_of_freedom) # Double Gaussian fit only for full frame data (and only for @@ -967,7 +967,7 @@ def stats_by_amp(self, image, amps): double_gauss_fit = calculations.double_gaussian(bin_centers, *double_gauss_params) degrees_of_freedom = len(bin_centers) - 6. dp_i = double_gauss_fit[positive] / total_pix - double_gaussian_chi_squared[key] = np.sum((hist[positive] - (total_pix*dp_i)**2) / (total_pix*dp_i)) / degrees_of_freedom + double_gaussian_chi_squared[key] = np.sum((hist[positive] - (total_pix * dp_i) ** 2) / (total_pix * dp_i)) / degrees_of_freedom else: double_gaussian_params[key] = [[0., 0.] for i in range(6)] From 7936df6837006ab5e5185e4ffc3bc06dea0017e5 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 24 Jun 2019 14:38:18 -0400 Subject: [PATCH 37/86] Updated README to include pip install instructions --- README.md | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 81cbbc4b5..b338979ef 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,23 @@ Official API documentation can be found on [ReadTheDocs](https://jwql.readthedoc The `jwql` application is currently under heavy development. The `1.0` release is expected in 2019. Currently, a development version of the web application can be found at [https://dljwql.stsci.edu](https://dljwql.stsci.edu). -## Installation +## Installation for Users + +To install `jwql`, simply use `pip`: + +``` +pip install jwql +``` + +The section below describes a more detailed installation for users that wish to contribute to the `jwql` repository. + +## Installation for Contributors Getting `jwql` up and running on your own computer requires four steps, detailed below: 1. Cloning the GitHub repository -1. Installing the `conda`environment -1. Installing the python package -1. Setting up the configuration file +2. Installing the `conda`environment +3. Installing the python package +4. Setting up the configuration file ### Prerequisites @@ -64,16 +74,16 @@ Following the download of the `jwql` repository, contributors can then install t conda update conda ``` -Next, activate the `base` environment: +Next, activate the `base` or `root` environment (depending on your version of `conda`): ``` -source activate base +source activate base/root ``` Lastly, create the `jwql` environment with either Python 3.5 or 3.6, via the `environment_python_3_5.yml` or `environment_python_3_6.yml` file, respectively. We recommend installing with the 3.6 version: ``` -conda env create -f environment_python_3_6.yml +conda env create -f environment_python_3_6.yml --name jwql-3.6 ``` ### Package Installation @@ -135,8 +145,8 @@ Any questions about the `jwql` project or its software can be directed to `jwql@ - Bryan Hilbert (INS) [@bilhbert4](https://github.com/bhilbert4) - Graham Kanarek (INS) [@gkanarek](https://github.com/gkanarek) - Catherine Martlin (INS) [@catherine-martlin](https://github.com/catherine-martlin) -- Sara Ogaz (OED) [@SaOgaz](https://github.com/SaOgaz) - Johannes Sahlmann (INS) [@Johannes-Sahlmann](https://github.com/johannes-sahlmann) +- Ben Sunnquist (INS) [@bsunnquist](https://github.com/bsunnquist) ## Acknowledgments: - Faith Abney (DMD) @@ -177,6 +187,7 @@ Any questions about the `jwql` project or its software can be directed to `jwql@ - Prem Mishra (ITSD) - Don Mueller (ITSD) - Maria Antonia Nieto-Santisteban (SEITO) +- Sara Ogaz (DMD) [@SaOgaz](https://github.com/SaOgaz) - Brian O'Sullivan (INS) - Joe Pollizzi (JWSTMO) - Lee Quick (DMD) From 11af8426d8edde84c749a2727e9167adf793503d Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 24 Jun 2019 15:11:07 -0400 Subject: [PATCH 38/86] Added option for pip install -e --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b338979ef..ee492cd89 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,17 @@ conda env create -f environment_python_3_6.yml --name jwql-3.6 ### Package Installation -Next, you need to install the `jwql` package. While still in the `jwql/` directory, run the following command to set up the package: +Next, you need to install the `jwql` package under development mode. This can be accomplished either by running the `setup.py` script, or `pip install` with the `-e` option: ``` python setup.py develop ``` + +or + +``` +pip install -e . +``` The package should now appear if you run `conda list jwql`. ### Configuration File From 65325a0d031f0aca8c05f30e35f2493c34c7d6bf Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Jun 2019 15:48:33 -0400 Subject: [PATCH 39/86] Update sphinx from 2.1.1 to 2.1.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 437ca444e..34be43dd9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ psycopg2==2.8.3 pysiaf==0.3.0 python-dateutil==2.8.0 pytest==4.6.3 -sphinx==2.1.1 +sphinx==2.1.2 sphinx-automodapi==0.11 sqlalchemy==1.3.5 stsci_rtd_theme==0.0.2 From cc728b32e626e1e91bef06fd14919a8ae20d1a86 Mon Sep 17 00:00:00 2001 From: Bryan Hilbert Date: Tue, 25 Jun 2019 14:49:07 -0400 Subject: [PATCH 40/86] Fix guass_peak typo in column names --- .../monitor_table_definitions/miri/miri_dark_dark_current.txt | 2 +- .../nircam/nircam_dark_dark_current.txt | 2 +- .../niriss/niriss_dark_dark_current.txt | 2 +- .../nirspec/nirspec_dark_dark_current.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jwql/database/monitor_table_definitions/miri/miri_dark_dark_current.txt b/jwql/database/monitor_table_definitions/miri/miri_dark_dark_current.txt index cdd2d681d..bfed0e993 100644 --- a/jwql/database/monitor_table_definitions/miri/miri_dark_dark_current.txt +++ b/jwql/database/monitor_table_definitions/miri/miri_dark_dark_current.txt @@ -4,7 +4,7 @@ MEAN, float STDEV, float SOURCE_FILES, string_array_1d GAUSS_AMPLITUDE, float_array_1d -GUASS_PEAK, float_array_1d +GAUSS_PEAK, float_array_1d GAUSS_WIDTH, float_array_1d GAUSS_CHISQ, float DOUBLE_GAUSS_AMPLITUDE1, float_array_1d diff --git a/jwql/database/monitor_table_definitions/nircam/nircam_dark_dark_current.txt b/jwql/database/monitor_table_definitions/nircam/nircam_dark_dark_current.txt index cdd2d681d..bfed0e993 100644 --- a/jwql/database/monitor_table_definitions/nircam/nircam_dark_dark_current.txt +++ b/jwql/database/monitor_table_definitions/nircam/nircam_dark_dark_current.txt @@ -4,7 +4,7 @@ MEAN, float STDEV, float SOURCE_FILES, string_array_1d GAUSS_AMPLITUDE, float_array_1d -GUASS_PEAK, float_array_1d +GAUSS_PEAK, float_array_1d GAUSS_WIDTH, float_array_1d GAUSS_CHISQ, float DOUBLE_GAUSS_AMPLITUDE1, float_array_1d diff --git a/jwql/database/monitor_table_definitions/niriss/niriss_dark_dark_current.txt b/jwql/database/monitor_table_definitions/niriss/niriss_dark_dark_current.txt index cdd2d681d..bfed0e993 100644 --- a/jwql/database/monitor_table_definitions/niriss/niriss_dark_dark_current.txt +++ b/jwql/database/monitor_table_definitions/niriss/niriss_dark_dark_current.txt @@ -4,7 +4,7 @@ MEAN, float STDEV, float SOURCE_FILES, string_array_1d GAUSS_AMPLITUDE, float_array_1d -GUASS_PEAK, float_array_1d +GAUSS_PEAK, float_array_1d GAUSS_WIDTH, float_array_1d GAUSS_CHISQ, float DOUBLE_GAUSS_AMPLITUDE1, float_array_1d diff --git a/jwql/database/monitor_table_definitions/nirspec/nirspec_dark_dark_current.txt b/jwql/database/monitor_table_definitions/nirspec/nirspec_dark_dark_current.txt index cdd2d681d..bfed0e993 100644 --- a/jwql/database/monitor_table_definitions/nirspec/nirspec_dark_dark_current.txt +++ b/jwql/database/monitor_table_definitions/nirspec/nirspec_dark_dark_current.txt @@ -4,7 +4,7 @@ MEAN, float STDEV, float SOURCE_FILES, string_array_1d GAUSS_AMPLITUDE, float_array_1d -GUASS_PEAK, float_array_1d +GAUSS_PEAK, float_array_1d GAUSS_WIDTH, float_array_1d GAUSS_CHISQ, float DOUBLE_GAUSS_AMPLITUDE1, float_array_1d From b56fef3670d1dc8a8138f89b213e7377e5965dd0 Mon Sep 17 00:00:00 2001 From: Bryan Hilbert Date: Tue, 25 Jun 2019 14:51:51 -0400 Subject: [PATCH 41/86] Make fix for FGS as well --- .../monitor_table_definitions/fgs/fgs_dark_dark_current.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jwql/database/monitor_table_definitions/fgs/fgs_dark_dark_current.txt b/jwql/database/monitor_table_definitions/fgs/fgs_dark_dark_current.txt index cdd2d681d..bfed0e993 100644 --- a/jwql/database/monitor_table_definitions/fgs/fgs_dark_dark_current.txt +++ b/jwql/database/monitor_table_definitions/fgs/fgs_dark_dark_current.txt @@ -4,7 +4,7 @@ MEAN, float STDEV, float SOURCE_FILES, string_array_1d GAUSS_AMPLITUDE, float_array_1d -GUASS_PEAK, float_array_1d +GAUSS_PEAK, float_array_1d GAUSS_WIDTH, float_array_1d GAUSS_CHISQ, float DOUBLE_GAUSS_AMPLITUDE1, float_array_1d From 562aefbef043072733a7236cbf76befdfca1d492 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 27 Jun 2019 11:19:48 -0400 Subject: [PATCH 42/86] Updated about page to conform to accessibility guidelines --- jwql/website/apps/jwql/static/css/jwql.css | 8 ++++++++ jwql/website/apps/jwql/templates/about.html | 9 +++++++-- jwql/website/apps/jwql/templates/base.html | 5 +++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/jwql/website/apps/jwql/static/css/jwql.css b/jwql/website/apps/jwql/static/css/jwql.css index 4efa95f4a..1ab06b023 100644 --- a/jwql/website/apps/jwql/static/css/jwql.css +++ b/jwql/website/apps/jwql/static/css/jwql.css @@ -488,6 +488,14 @@ display : inline; font-size: 12px } +a { + text-decoration: underline; +} + +nav a { + text-decoration: none; +} + body { padding-top: 8rem; } diff --git a/jwql/website/apps/jwql/templates/about.html b/jwql/website/apps/jwql/templates/about.html index a046d9901..30ad318df 100644 --- a/jwql/website/apps/jwql/templates/about.html +++ b/jwql/website/apps/jwql/templates/about.html @@ -9,7 +9,7 @@ {% block content %}
-

+
The JWQL logo


About the project

@@ -18,7 +18,12 @@

About the project

The project consists of the following components:

-

+
+ MAST Cache, MAST API, JWQL Repo, VM, Web App, Automation +

The JWQL application is currently under heavy development. The 1.0 release is expected in 2019.

diff --git a/jwql/website/apps/jwql/templates/base.html b/jwql/website/apps/jwql/templates/base.html index fe1cf0aa8..d6db62b54 100644 --- a/jwql/website/apps/jwql/templates/base.html +++ b/jwql/website/apps/jwql/templates/base.html @@ -33,6 +33,9 @@ + + Jump to main content +
+
+ {% block content %} {% endblock %} From cf58c6d159fb1f8760586fb14ad9adc861f8bf92 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 27 Jun 2019 12:06:38 -0400 Subject: [PATCH 43/86] Modified view_image template to ahdere to accessibility guidelines --- jwql/website/apps/jwql/static/css/jwql.css | 9 +++----- .../apps/jwql/templates/view_image.html | 23 +++++++++++-------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/jwql/website/apps/jwql/static/css/jwql.css b/jwql/website/apps/jwql/static/css/jwql.css index 1ab06b023..bbb3196d3 100644 --- a/jwql/website/apps/jwql/static/css/jwql.css +++ b/jwql/website/apps/jwql/static/css/jwql.css @@ -2,12 +2,6 @@ list-style: none; } -.anomaly_form { - position: absolute; - top: 50%; - transform: translateY(-50%); -} - .APT_parameters { width: 20% } @@ -37,6 +31,7 @@ border-color: #c85108 !important; color: white !important; border-radius: 0px; + text-decoration: none; } /*Make outline buttons and highlighted normal buttons white*/ @@ -46,12 +41,14 @@ border-color: #c85108 !important ; color: #c85108 !important; border-radius: 0px; + text-decoration: none; } /*Stop them from glowing blue*/ .btn:focus, .btn.focus, .btn:active:focus, .btn.active:focus, .btn:active, .btn.active, .show > .btn.dropdown-toggle:focus { box-shadow: none !important; + text-decoration: none; } [class*="col-"] { diff --git a/jwql/website/apps/jwql/templates/view_image.html b/jwql/website/apps/jwql/templates/view_image.html index 8362ab77a..a6b0d77b8 100644 --- a/jwql/website/apps/jwql/templates/view_image.html +++ b/jwql/website/apps/jwql/templates/view_image.html @@ -43,30 +43,35 @@

{{ file_root }}

-
+ -
+
Submit Anomaly
{% if form.errors %} - {% for field in form %} - {% for error in field.errors %} -
- {{ error|escape }} -
+
+ {% for field in form %} + {% for error in field.errors %} +
+ {{ error|escape }} +
+ {% endfor %} {% endfor %} - {% endfor %} +
{% endif %} From 9792088d297f8f7fd97abf7d0d3fe9b685907e0f Mon Sep 17 00:00:00 2001 From: "Catherine A. Martlin" Date: Thu, 27 Jun 2019 12:49:51 -0400 Subject: [PATCH 44/86] Updating the home page to accessibility guidelines --- jwql/website/apps/jwql/templates/home.html | 51 ++++++++++++---------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/jwql/website/apps/jwql/templates/home.html b/jwql/website/apps/jwql/templates/home.html index d9aa89183..62bc98cba 100644 --- a/jwql/website/apps/jwql/templates/home.html +++ b/jwql/website/apps/jwql/templates/home.html @@ -24,7 +24,10 @@

Welcome to the JWQL application.

- +  Logo link to {{ inst }}
{{ inst }}
@@ -49,30 +52,32 @@

Find a JWST Proposal or File

- - {% if form.errors %} - {% for field in form %} - {% for error in field.errors %} -
- {{ error|escape }} -
+
+ + {% if form.errors %} + {% for field in form %} + {% for error in field.errors %} +
+ {{ error|escape }} +
+ {% endfor %} {% endfor %} + {% endif %} + + + {{ csrf_input }} + + + {% for field in form %} +
+ {{ field }} + {% if field.help_text %} +

{{ field.help_text|safe }}

+ {% endif %} +
{% endfor %} - {% endif %} - - - {{ csrf_input }} - - - {% for field in form %} -
- {{ field }} - {% if field.help_text %} -

{{ field.help_text|safe }}

- {% endif %} -
- {% endfor %} - + +
From 951e93fb0ceb1d891ad1b51f673f274880cd89d1 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 27 Jun 2019 16:03:43 -0400 Subject: [PATCH 45/86] Updated engineering_database template to conform to accessibility guidelines --- .../jwql/templates/engineering_database.html | 141 ++++++++---------- 1 file changed, 64 insertions(+), 77 deletions(-) diff --git a/jwql/website/apps/jwql/templates/engineering_database.html b/jwql/website/apps/jwql/templates/engineering_database.html index c2bbc5a2a..f557308a3 100644 --- a/jwql/website/apps/jwql/templates/engineering_database.html +++ b/jwql/website/apps/jwql/templates/engineering_database.html @@ -9,78 +9,69 @@ {% block content %}
-

Explore mnemonics in the DMS Engineering Database

-
+

Explore mnemonics in the DMS Engineering Database


- -
- This page allows interactive exploration of mnemonics stored in the Engineering Database (EDB) powered by MAST.
- - Its use requires access privileges to the EDB (see here) - Functionality is built on top of the module astroquery.mast. - Example programmatic code for EDB queries is available in this notebook. -
-
+

+ This page allows interactive exploration of mnemonics stored in the Engineering Database (EDB) powered by MAST. Its use requires access privileges to the EDB (see instructions page). Functionality is built on top of the astroquery.mast module. Example programmatic code for EDB queries is available in this Jupyter notebook. +


Search for an EDB mnemonic

-
+
-
- Submit a mnemonic identifier: -

- - -
- Description and details of menemonic from EDB: -

- -
    - {% for key, value in edb_components['mnemonic_name_search_result'].items() %} -
- {% endfor %} - -
{{ key }} : {{ value }}
+ +
+
+ Description and details of menemonic from EDB: + +
    + {% for key, value in edb_components['mnemonic_name_search_result'].items() %} +
+ {% endfor %} + +
{{ key }} : {{ value }}
+
-
-
+

Query for records of an EDB mnemonic

- Submit a mnemonic identifier with a time range to view the corresponding EDB records. + Submit a mnemonic identifier with a time range to view the corresponding EDB records:
-

@@ -136,11 +128,7 @@

Explore the EDB mnemonic inventory

- - Fill one or several fields below and a table of matching inventory elements will be returned. For the complete list, leave all fields blank.
- The search is case insensitive and fields are combined with simple AND logic. -
- + Fill one or several of the following fields and a table of matching inventory elements will be returned. For the complete list, leave all fields blank. The search is case insensitive and fields are combined with simple AND logic.
@@ -162,10 +150,12 @@

Explore the EDB mnemonic inventory

{% for field in edb_components['mnemonic_exploration_form'] %}
- {{ field }} - {% if field.help_text %} -

{{ field.help_text|safe }}

- {% endif %} +
+ {{ field }} + {% if field.help_text %} +

{{ field.help_text|safe }}

+ {% endif %} +
{% endfor %} @@ -174,24 +164,21 @@

Explore the EDB mnemonic inventory

{% if edb_components['mnemonic_exploration_result'] == 'empty' %} - - Query returned zero matches. Please refine and repeat. -
+ Query returned zero matches. Please refine and repeat. +
{% endif %} {% if edb_components['mnemonic_exploration_result'] %} {% if edb_components['mnemonic_exploration_result'] != 'empty' %} - - Query returned {{ edb_components['mnemonic_exploration_result'].n_rows }} matching rows - in the EDB inventory containing {{ edb_components['mnemonic_exploration_result'].meta['paging']['rows']}} mnemonics. + Query returned {{ edb_components['mnemonic_exploration_result'].n_rows }} matching rows in the EDB inventory containing {{ edb_components['mnemonic_exploration_result'].meta['paging']['rows']}} mnemonics. Download table -
-
-
+
+
+

{% autoescape off %} {{ edb_components['mnemonic_exploration_result'].html_file_content }} {% endautoescape %} -
+
{% endif %} {% endif %} From 8ce681921df5ed8ce09ecf2976908e59516af206 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 27 Jun 2019 16:23:54 -0400 Subject: [PATCH 46/86] Updated 404 templates to conform to accessibility guidelines --- jwql/website/apps/jwql/templates/404_space.html | 2 +- jwql/website/apps/jwql/templates/404_spacecat.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jwql/website/apps/jwql/templates/404_space.html b/jwql/website/apps/jwql/templates/404_space.html index 1f1aa2ad9..a638f6e8f 100644 --- a/jwql/website/apps/jwql/templates/404_space.html +++ b/jwql/website/apps/jwql/templates/404_space.html @@ -19,7 +19,7 @@ diff --git a/jwql/website/apps/jwql/templates/404_spacecat.html b/jwql/website/apps/jwql/templates/404_spacecat.html index da4585539..5675ff0b1 100644 --- a/jwql/website/apps/jwql/templates/404_spacecat.html +++ b/jwql/website/apps/jwql/templates/404_spacecat.html @@ -19,7 +19,7 @@ From bde7fe9b91f6c24ddc256c2912715e4a76f13ba7 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 27 Jun 2019 16:27:49 -0400 Subject: [PATCH 47/86] Updated view_header template to conform to accessibility guidelines --- jwql/website/apps/jwql/templates/view_header.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jwql/website/apps/jwql/templates/view_header.html b/jwql/website/apps/jwql/templates/view_header.html index ba15018e2..f0625bf14 100644 --- a/jwql/website/apps/jwql/templates/view_header.html +++ b/jwql/website/apps/jwql/templates/view_header.html @@ -2,14 +2,14 @@ {% block preamble %} - View {{ inst }} Image - JWQL + View {{ inst }} Image (Header) - JWQL {% endblock %} {% block content %}
-
{{ file }}
+

{{ file }}

View Image From 2eb250be0f5a14f14d8e747d8e66f078a52cd42b Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 27 Jun 2019 16:45:22 -0400 Subject: [PATCH 48/86] Updated archive template to conform to accessibility guidelines --- jwql/website/apps/jwql/static/js/jwql.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jwql/website/apps/jwql/static/js/jwql.js b/jwql/website/apps/jwql/static/js/jwql.js index e47556877..a15f03a7b 100644 --- a/jwql/website/apps/jwql/static/js/jwql.js +++ b/jwql/website/apps/jwql/static/js/jwql.js @@ -331,7 +331,8 @@ function update_archive_page(inst, base_url) { // Build div content content = '

From e7355147d5eff29f7f35cdd3207fd8564b7d543e Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Fri, 28 Jun 2019 09:48:27 -0400 Subject: [PATCH 50/86] A few bug fixes to get database interactivity working --- jwql/database/database_interface.py | 2 +- jwql/jwql_monitors/monitor_filesystem.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/jwql/database/database_interface.py b/jwql/database/database_interface.py index abd212675..5aa9b73fe 100644 --- a/jwql/database/database_interface.py +++ b/jwql/database/database_interface.py @@ -252,7 +252,7 @@ class CentralStore(base): # Define the columns id = Column(Integer, primary_key=True, nullable=False) - date = Column(DateTime, unique=True, nullable=False) + date = Column(DateTime, nullable=False) area = Column(String(), nullable=False) size = Column(Float, nullable=False) used = Column(Float, nullable=False) diff --git a/jwql/jwql_monitors/monitor_filesystem.py b/jwql/jwql_monitors/monitor_filesystem.py index 84ec332d5..1bd4fffb3 100755 --- a/jwql/jwql_monitors/monitor_filesystem.py +++ b/jwql/jwql_monitors/monitor_filesystem.py @@ -404,8 +404,7 @@ def plot_central_store_dirs(): for area, color in zip(arealist, colors): # Query for used sizes - results = session.query(CentralStore.date, getattr(CentralStore))\ - .filter(CentralStore.used == used) + results = session.query(CentralStore.date, CentralStore.used) if area == 'all': results = results.all() From d8e86759cb5fe73b4284ecc228785e472f376473 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Fri, 28 Jun 2019 11:43:44 -0400 Subject: [PATCH 51/86] Fix navbar collapse --- jwql/website/apps/jwql/static/css/jwql.css | 44 +++---- jwql/website/apps/jwql/templates/base.html | 126 ++++++++++++++++----- 2 files changed, 118 insertions(+), 52 deletions(-) diff --git a/jwql/website/apps/jwql/static/css/jwql.css b/jwql/website/apps/jwql/static/css/jwql.css index 1ab06b023..85f2b37d0 100644 --- a/jwql/website/apps/jwql/static/css/jwql.css +++ b/jwql/website/apps/jwql/static/css/jwql.css @@ -67,6 +67,13 @@ margin-right: 2%; } +/* Show the dropdown menu on hover */ +/* DO NOT how the dropdown menu on hover if the navbar is collapsed */ +@media only screen and (min-width: 1200px) { +li.dropdown:hover .dropdown-menu { + display: block; +} + /* Make disabled dropdown items grey and unclickable */ .disabled-dropdown { color: #bec4d4 !important; @@ -76,8 +83,7 @@ /*Define dropdown menu colors*/ .dropdown-item:hover{ - color: #c85108; - background-color: #2d353c; + background-color: black; } .dropdown-menu { @@ -293,12 +299,19 @@ display : inline; height: 100%; } +/* Change color of dropdown links on hover */ +li:hover .nav-link, .navbar-brand:hover { + color: #fff !important; +} + /* Define navbar color*/ .navbar { background-color: black; } -.navbar-brand { - color: white; + +/*Define navbar font color and case*/ +.nav-link { + color: #bec4d4 !important; text-transform: uppercase; } @@ -308,12 +321,6 @@ display : inline; padding-right:10px; } -/*Define navbar font color*/ -.nav-link, .nav-link.disabled { - color: #bec4d4; - text-transform: uppercase; -} - /* Get rid of padding around GitHub logo */ #github-link { padding-bottom: 0px; @@ -322,11 +329,14 @@ display : inline; /* Set username to be orange */ #oauth_user { + text-transform: uppercase; color: #c85108; + padding-right: 1rem; } #oauth_user:hover { color: white; + text-decoration: none; } .plot-container { @@ -488,11 +498,13 @@ display : inline; font-size: 12px } +/*Add underline for links*/ a { text-decoration: underline; } -nav a { +/*Don't add underline for navbar and button links*/ +nav a, .btn { text-decoration: none; } @@ -514,16 +526,6 @@ h1 { letter-spacing: 0.05em; } -/* Change color of dropdown links on hover */ -li:hover .nav-link, .navbar-brand:hover { - color: #fff; -} - -/* Show the dropdown menu on hover */ -li.dropdown:hover .dropdown-menu { - display: block; -} - ul.no-bullets { list-style: none; padding-left:10px; diff --git a/jwql/website/apps/jwql/templates/base.html b/jwql/website/apps/jwql/templates/base.html index d6db62b54..4e274a24a 100644 --- a/jwql/website/apps/jwql/templates/base.html +++ b/jwql/website/apps/jwql/templates/base.html @@ -37,32 +37,74 @@ Jump to main content -
diff --git a/jwql/website/apps/jwql/templates/miri_data_trending.html b/jwql/website/apps/jwql/templates/miri_data_trending.html index b1d8ce752..f90f86d3b 100644 --- a/jwql/website/apps/jwql/templates/miri_data_trending.html +++ b/jwql/website/apps/jwql/templates/miri_data_trending.html @@ -7,14 +7,14 @@ {% block preamble %} - Webpage Title - JWQL + MIRI Mnemonic Trending - JWQL {% endblock %} {% block content %} -
+
-
-

How it works

+

+

How it works

The MIRI data-trending dashboard is prepared for instrument engineers to keep tracking the trend of relevant parameters. A software behind processes a daily chunk of data and calculates average and deviation of all engineering values that correspond to specific @@ -36,9 +42,10 @@

How it works



-
+


+
Bokeh Scatter Plots @@ -47,9 +54,9 @@

How it works

-
- {{ dashboard[0] | safe }} -
+
+ {{ dashboard[0] | safe }} +
diff --git a/jwql/website/apps/jwql/templates/nirspec_data_trending.html b/jwql/website/apps/jwql/templates/nirspec_data_trending.html index 62bdda5a8..0c6097c5a 100644 --- a/jwql/website/apps/jwql/templates/nirspec_data_trending.html +++ b/jwql/website/apps/jwql/templates/nirspec_data_trending.html @@ -7,14 +7,14 @@ {% block preamble %} - Webpage Title - JWQL + NIRSpec Mnemonic Trending - JWQL {% endblock %} {% block content %} -
+
-
-

How it works

+

+

How it works

The NIRSpec data-trending dashboard is a web based application that allows engineers and general users to keep track of a subset of key NIRSpec performance parameters (“mnemonics”) such as voltages, currents, sensor signals and temperatures. In total 200+ mnemonics are tracked for NIRSpec. This telemetry data is retrieved from the engineering data base (EDB) on the Mikulski Archive for Space Telescopes @@ -43,9 +49,10 @@

How it works



-
+


+
Bokeh Scatter Plots @@ -54,9 +61,9 @@

How it works

-
- {{ dashboard[0] | safe }} -
+
+ {{ dashboard[0] | safe }} +
From 5c58822beca908b343b92d4df2390bb56d586b7b Mon Sep 17 00:00:00 2001 From: cracraft Date: Mon, 1 Jul 2019 08:57:08 -0400 Subject: [PATCH 53/86] Reduced redundant counting, fixed database query --- jwql/jwql_monitors/monitor_filesystem.py | 58 +++++++++++++++--------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/jwql/jwql_monitors/monitor_filesystem.py b/jwql/jwql_monitors/monitor_filesystem.py index 34e7e136a..4146c4974 100755 --- a/jwql/jwql_monitors/monitor_filesystem.py +++ b/jwql/jwql_monitors/monitor_filesystem.py @@ -124,7 +124,7 @@ def gather_statistics(general_results_dict, instrument_results_dict): def get_global_filesystem_stats(general_results_dict): """Gathers ``used`` and ``available`` ``df``-style stats on the - entire filesystem. + entire filesystem. (Not just directory titled filesystem.) Parameters ---------- @@ -178,10 +178,12 @@ def get_area_stats(central_storage_dict): else: fullpath = os.path.join(CENTRAL, area) - print(area, fullpath) + #print(area, fullpath) + + logging.info('Searching directory {}'.format(fullpath)) # record current area as being counted counteddirs.append(fullpath) - print(counteddirs) + #print(counteddirs) # to get df stats, use -k to get 1024 byte blocks command = "df -k {}".format(fullpath) @@ -196,18 +198,36 @@ def get_area_stats(central_storage_dict): # do an os.walk on each directory to count up used space - for dirpath, _, files in os.walk(fullpath): - for filename in files: - file_path = os.path.join(dirpath, filename) - # Check if file_path exists, if so, add to used space - exists = os.path.isfile(file_path) - if exists: - filesize = os.path.getsize(file_path) - used += filesize - sums += filesize - use = used / (1024 ** 4) + ### modifying here + if area == 'all': + # get listing of subdirectories + subdirs = [f.path for f in os.scandir(fullpath) if f.is_dir()] + for onedir in subdirs: + if onedir not in counteddirs: + #print(onedir) + logging.info('Searching directory {}'.format(onedir)) + for dirpath, _, files in os.walk(onedir): + for filename in files: + file_path = os.path.join(dirpath, filename) + # Check if file_path exists, if so, add to used space + exists = os.path.isfile(file_path) + if exists: + filesize = os.path.getsize(file_path) + sums += filesize + use = sums / (1024 **4) + else: + for dirpath, _, files in os.walk(fullpath): + for filename in files: + file_path = os.path.join(dirpath, filename) + # Check if file_path exists, if so, add to used space + exists = os.path.isfile(file_path) + if exists: + filesize = os.path.getsize(file_path) + used += filesize + sums += filesize + use = used / (1024 ** 4) central_storage_dict[area]['used'] = use - print(area, total, use, free) + #print(area, total, use, free) logging.info('Finished searching central storage system') return central_storage_dict @@ -404,13 +424,7 @@ def plot_central_store_dirs(): for area, color in zip(arealist, colors): # Query for used sizes - results = session.query(CentralStore.date, getattr(CentralStore))\ - .filter(CentralStore.used == used) - - if area == 'all': - results = results.all() - else: - results = results.filter(CentralStore.area == area).all() + results = session.query(CentralStore.date, CentralStore.used).filter(CentralStore.area == area) # Group by date if results: @@ -422,6 +436,8 @@ def plot_central_store_dirs(): dates = list(results_dict.keys()) values = list(results_dict.values()) + #print(dates, values) + # Plot the results plot.line(dates, values, legend='{} files'.format(area), line_color=color) plot.circle(dates, values, color=color) From 083fbaad213d9497760d5a8236263392de1c88d1 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Mon, 1 Jul 2019 15:53:16 -0400 Subject: [PATCH 54/86] Specify test location? --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 84bf708e9..0c4a5dd89 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -26,7 +26,7 @@ withCredentials([ "python setup.py sdist bdist_wheel"] bc.test_cmds = [ - "pytest -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", + "pytest .jwql/tests/ -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", "sed -i 's/file=\"[^\"]*\"//g;s/line=\"[^\"]*\"//g;s/skips=\"[^\"]*\"//g' results.xml", "codecov --token=${codecov_token}", "mkdir -v reports", From 5cd2c4898552e93130fa4ad74449b093eec01eb9 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Mon, 1 Jul 2019 16:00:26 -0400 Subject: [PATCH 55/86] =?UTF-8?q?=F0=9F=A4=A6=F0=9F=8F=BD=E2=80=8D?= =?UTF-8?q?=E2=99=80=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0c4a5dd89..15ab0e982 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -26,7 +26,7 @@ withCredentials([ "python setup.py sdist bdist_wheel"] bc.test_cmds = [ - "pytest .jwql/tests/ -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", + "pytest ./jwql/tests/ -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", "sed -i 's/file=\"[^\"]*\"//g;s/line=\"[^\"]*\"//g;s/skips=\"[^\"]*\"//g' results.xml", "codecov --token=${codecov_token}", "mkdir -v reports", From bbe5305fbbb4b3b417798d40fa6d18bde29d6b03 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Mon, 1 Jul 2019 16:10:27 -0400 Subject: [PATCH 56/86] Debug --- Jenkinsfile | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 15ab0e982..feae3dd15 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,19 +19,9 @@ withCredentials([ bc.name = "debug-${os}-${env_py}" bc.conda_packages = ["python=${python_ver}"] - bc.build_cmds = [ - "conda env update --file=environment${env_py}.yml", - "pip install codecov pytest-cov", - "python setup.py install", - "python setup.py sdist bdist_wheel"] - - bc.test_cmds = [ - "pytest ./jwql/tests/ -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", - "sed -i 's/file=\"[^\"]*\"//g;s/line=\"[^\"]*\"//g;s/skips=\"[^\"]*\"//g' results.xml", - "codecov --token=${codecov_token}", - "mkdir -v reports", - "mv -v coverage.xml reports/coverage.xml", - "twine upload -u '${pypi_username}' -p '${pypi_password}' --repository-url https://upload.pypi.org/legacy/ --skip-existing dist/*"] + bc.build_cmds = ["echo ~", + "hostname"] + matrix += bc } From 3034890ee7148de60d12750485594daec1fc5f2e Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Mon, 1 Jul 2019 16:21:08 -0400 Subject: [PATCH 57/86] Redefine ON_JENKINS --- Jenkinsfile | 16 +++++++++++++--- jwql/database/database_interface.py | 4 +++- jwql/tests/test_api_views.py | 2 +- jwql/tests/test_database_interface.py | 2 +- jwql/tests/test_edb.py | 2 +- jwql/tests/test_loading_times.py | 2 +- jwql/tests/test_logging_functions.py | 2 +- jwql/tests/test_permissions.py | 2 +- jwql/tests/test_pipeline_tools.py | 2 +- jwql/tests/test_preview_image.py | 2 +- jwql/tests/test_utils.py | 2 +- 11 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index feae3dd15..15ab0e982 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,9 +19,19 @@ withCredentials([ bc.name = "debug-${os}-${env_py}" bc.conda_packages = ["python=${python_ver}"] - bc.build_cmds = ["echo ~", - "hostname"] - + bc.build_cmds = [ + "conda env update --file=environment${env_py}.yml", + "pip install codecov pytest-cov", + "python setup.py install", + "python setup.py sdist bdist_wheel"] + + bc.test_cmds = [ + "pytest ./jwql/tests/ -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", + "sed -i 's/file=\"[^\"]*\"//g;s/line=\"[^\"]*\"//g;s/skips=\"[^\"]*\"//g' results.xml", + "codecov --token=${codecov_token}", + "mkdir -v reports", + "mv -v coverage.xml reports/coverage.xml", + "twine upload -u '${pypi_username}' -p '${pypi_password}' --repository-url https://upload.pypi.org/legacy/ --skip-existing dist/*"] matrix += bc } diff --git a/jwql/database/database_interface.py b/jwql/database/database_interface.py index b76a2c3b6..2ad0d3091 100644 --- a/jwql/database/database_interface.py +++ b/jwql/database/database_interface.py @@ -82,6 +82,8 @@ from jwql.utils.constants import ANOMALIES, FILE_SUFFIX_TYPES, JWST_INSTRUMENT_NAMES from jwql.utils.utils import get_config +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') + # Monkey patch Query with data_frame method @property @@ -136,7 +138,7 @@ def load_connection(connection_string): return session, base, engine, meta # Import a global session. If running from readthedocs or Jenkins, pass a dummy connection string -if 'build' and 'project' in socket.gethostname() or os.path.expanduser('~') == '/home/jenkins': +if ['build' and 'project' in socket.gethostname()] or ON_JENKINS: dummy_connection_string = 'postgresql+psycopg2://account:password@hostname:0000/db_name' session, base, engine, meta = load_connection(dummy_connection_string) else: diff --git a/jwql/tests/test_api_views.py b/jwql/tests/test_api_views.py index 5c97becee..6092a4d22 100644 --- a/jwql/tests/test_api_views.py +++ b/jwql/tests/test_api_views.py @@ -29,7 +29,7 @@ from jwql.utils.constants import JWST_INSTRUMENT_NAMES # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') # Determine if the local server is running try: diff --git a/jwql/tests/test_database_interface.py b/jwql/tests/test_database_interface.py index 1b898f76c..91a838067 100755 --- a/jwql/tests/test_database_interface.py +++ b/jwql/tests/test_database_interface.py @@ -29,7 +29,7 @@ from jwql.utils.utils import get_config # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') diff --git a/jwql/tests/test_edb.py b/jwql/tests/test_edb.py index bc2fff119..b451add73 100644 --- a/jwql/tests/test_edb.py +++ b/jwql/tests/test_edb.py @@ -24,7 +24,7 @@ import pytest # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.mark.skipif(ON_JENKINS, reason='Requires access to central storage.') diff --git a/jwql/tests/test_loading_times.py b/jwql/tests/test_loading_times.py index 501028133..a8fd15e6b 100644 --- a/jwql/tests/test_loading_times.py +++ b/jwql/tests/test_loading_times.py @@ -29,7 +29,7 @@ TIME_CONSTRAINT = 30 # seconds # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') urls = [] diff --git a/jwql/tests/test_logging_functions.py b/jwql/tests/test_logging_functions.py index 83eb62bc2..9ab5b0134 100644 --- a/jwql/tests/test_logging_functions.py +++ b/jwql/tests/test_logging_functions.py @@ -28,7 +28,7 @@ from jwql.utils.utils import get_config # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @log_fail diff --git a/jwql/tests/test_permissions.py b/jwql/tests/test_permissions.py index 01f67de64..e472a893a 100755 --- a/jwql/tests/test_permissions.py +++ b/jwql/tests/test_permissions.py @@ -30,7 +30,7 @@ TEST_DIRECTORY = os.path.join(os.environ['HOME'], 'permission_test') # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.fixture(scope="module") diff --git a/jwql/tests/test_pipeline_tools.py b/jwql/tests/test_pipeline_tools.py index cb3653841..95a97ab34 100644 --- a/jwql/tests/test_pipeline_tools.py +++ b/jwql/tests/test_pipeline_tools.py @@ -27,7 +27,7 @@ from jwql.utils.utils import get_config # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.mark.skipif(ON_JENKINS, reason='Requires access to central storage.') diff --git a/jwql/tests/test_preview_image.py b/jwql/tests/test_preview_image.py index 5b465995f..532f502e9 100644 --- a/jwql/tests/test_preview_image.py +++ b/jwql/tests/test_preview_image.py @@ -34,7 +34,7 @@ TEST_DIRECTORY = os.path.join(os.environ['HOME'], 'preview_image_test') # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.fixture(scope="module") diff --git a/jwql/tests/test_utils.py b/jwql/tests/test_utils.py index 94a33572f..06f07062b 100644 --- a/jwql/tests/test_utils.py +++ b/jwql/tests/test_utils.py @@ -25,7 +25,7 @@ from jwql.utils.utils import copy_files, get_config, filename_parser, filesystem_path # Determine if tests are being run on jenkins -ON_JENKINS = os.path.expanduser('~') == '/home/jenkins' +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') FILENAME_PARSER_TEST_DATA = [ From 6baf6cc046148377fc4d9d5563aa015dec6ccc7c Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Mon, 1 Jul 2019 16:25:57 -0400 Subject: [PATCH 58/86] Sorry @pep8speaks --- jwql/database/database_interface.py | 14 ++++++++++---- jwql/tests/test_api_views.py | 2 +- jwql/tests/test_database_interface.py | 25 +++++++++++++++++-------- jwql/tests/test_edb.py | 2 +- jwql/tests/test_loading_times.py | 2 +- jwql/tests/test_logging_functions.py | 2 +- jwql/tests/test_permissions.py | 2 +- jwql/tests/test_pipeline_tools.py | 2 +- jwql/tests/test_preview_image.py | 2 +- jwql/tests/test_utils.py | 2 +- 10 files changed, 35 insertions(+), 20 deletions(-) diff --git a/jwql/database/database_interface.py b/jwql/database/database_interface.py index 2ad0d3091..041f08a44 100644 --- a/jwql/database/database_interface.py +++ b/jwql/database/database_interface.py @@ -82,7 +82,7 @@ from jwql.utils.constants import ANOMALIES, FILE_SUFFIX_TYPES, JWST_INSTRUMENT_NAMES from jwql.utils.utils import get_config -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') # Monkey patch Query with data_frame method @@ -92,6 +92,7 @@ def data_frame(self): return pd.read_sql(self.statement, self.session.bind) + Query.data_frame = data_frame @@ -137,6 +138,7 @@ def load_connection(connection_string): return session, base, engine, meta + # Import a global session. If running from readthedocs or Jenkins, pass a dummy connection string if ['build' and 'project' in socket.gethostname()] or ON_JENKINS: dummy_connection_string = 'postgresql+psycopg2://account:password@hostname:0000/db_name' @@ -169,7 +171,8 @@ class FilesystemInstrument(base): # Name the table __tablename__ = 'filesystem_instrument' - __table_args__ = (UniqueConstraint('date', 'instrument', 'filetype', name='filesystem_instrument_uc'),) + __table_args__ = (UniqueConstraint('date', 'instrument', 'filetype', + name='filesystem_instrument_uc'),) # Define the columns id = Column(Integer, primary_key=True, nullable=False) @@ -294,7 +297,8 @@ def get_monitor_columns(data_dict, table_name): # Create a new column if dtype in list(data_type_dict.keys()): if array: - data_dict[column_name.lower()] = Column(ARRAY(data_type_dict[dtype], dimensions=dimension)) + data_dict[column_name.lower()] = Column(ARRAY(data_type_dict[dtype], + dimensions=dimension)) else: data_dict[column_name.lower()] = Column(data_type_dict[dtype]) else: @@ -347,7 +351,9 @@ class : obj # Columns specific to all monitor ORMs data_dict['id'] = Column(Integer, primary_key=True, nullable=False) data_dict['entry_date'] = Column(DateTime, unique=True, nullable=False, default=datetime.now()) - data_dict['__table_args__'] = (UniqueConstraint('id', 'entry_date', name='{}_uc'.format(data_dict['__tablename__'])),) + data_dict['__table_args__'] = ( + UniqueConstraint('id', 'entry_date', name='{}_uc'.format(data_dict['__tablename__'])), + ) # Get monitor-specific columns data_dict = get_monitor_columns(data_dict, data_dict['__tablename__']) diff --git a/jwql/tests/test_api_views.py b/jwql/tests/test_api_views.py index 6092a4d22..25f93f62f 100644 --- a/jwql/tests/test_api_views.py +++ b/jwql/tests/test_api_views.py @@ -29,7 +29,7 @@ from jwql.utils.constants import JWST_INSTRUMENT_NAMES # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') # Determine if the local server is running try: diff --git a/jwql/tests/test_database_interface.py b/jwql/tests/test_database_interface.py index 91a838067..92cef4527 100755 --- a/jwql/tests/test_database_interface.py +++ b/jwql/tests/test_database_interface.py @@ -29,7 +29,7 @@ from jwql.utils.utils import get_config # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') @@ -64,7 +64,8 @@ def test_anomaly_orm_factory(): TestAnomalyTable = di.anomaly_orm_factory('test_anomaly_table') table_attributes = TestAnomalyTable.__dict__.keys() - assert str(TestAnomalyTable) == "".format(test_table_name) + assert str(TestAnomalyTable) == ""\ + .format(test_table_name) for anomaly in ANOMALIES: assert anomaly in table_attributes @@ -75,13 +76,19 @@ def test_anomaly_records(): """Test to see that new records can be entered""" # Add some data - random_rootname = ''.join(random.SystemRandom().choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(10)) - di.session.add(di.Anomaly(rootname=random_rootname, flag_date=datetime.datetime.today(), user='test', ghost=True)) + random_rootname = ''.join(random.SystemRandom().choice(string.ascii_lowercase + + string.ascii_uppercase + + string.digits) for _ in range(10)) + di.session.add(di.Anomaly(rootname=random_rootname, + flag_date=datetime.datetime.today(), + user='test', ghost=True)) di.session.commit() # Test the ghosts column - ghosts = di.session.query(di.Anomaly).filter(di.Anomaly.rootname == random_rootname).filter(di.Anomaly.ghost == "True") - assert ghosts.data_frame.iloc[0]['ghost'] == True + ghosts = di.session.query(di.Anomaly)\ + .filter(di.Anomaly.rootname == random_rootname)\ + .filter(di.Anomaly.ghost == "True") + assert ghosts.data_frame.iloc[0]['ghost'] is True @pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') @@ -103,7 +110,8 @@ def test_monitor_orm_factory(): test_table_name = 'instrument_test_monitor_table' # Create temporary table definitions file - test_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'database', 'monitor_table_definitions', 'instrument') + test_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), + 'database', 'monitor_table_definitions', 'instrument') test_filename = os.path.join(test_dir, '{}.txt'.format(test_table_name)) if not os.path.isdir(test_dir): os.mkdir(test_dir) @@ -115,7 +123,8 @@ def test_monitor_orm_factory(): table_attributes = TestMonitorTable.__dict__.keys() # Ensure the ORM exists and contains appropriate columns - assert str(TestMonitorTable) == "".format(test_table_name) + assert str(TestMonitorTable) == ""\ + .format(test_table_name) for column in ['id', 'entry_date', 'test_column']: assert column in table_attributes diff --git a/jwql/tests/test_edb.py b/jwql/tests/test_edb.py index b451add73..9b13ad44d 100644 --- a/jwql/tests/test_edb.py +++ b/jwql/tests/test_edb.py @@ -24,7 +24,7 @@ import pytest # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.mark.skipif(ON_JENKINS, reason='Requires access to central storage.') diff --git a/jwql/tests/test_loading_times.py b/jwql/tests/test_loading_times.py index a8fd15e6b..d0ec02fe9 100644 --- a/jwql/tests/test_loading_times.py +++ b/jwql/tests/test_loading_times.py @@ -29,7 +29,7 @@ TIME_CONSTRAINT = 30 # seconds # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') urls = [] diff --git a/jwql/tests/test_logging_functions.py b/jwql/tests/test_logging_functions.py index 9ab5b0134..f523d244a 100644 --- a/jwql/tests/test_logging_functions.py +++ b/jwql/tests/test_logging_functions.py @@ -28,7 +28,7 @@ from jwql.utils.utils import get_config # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @log_fail diff --git a/jwql/tests/test_permissions.py b/jwql/tests/test_permissions.py index e472a893a..753b867ca 100755 --- a/jwql/tests/test_permissions.py +++ b/jwql/tests/test_permissions.py @@ -30,7 +30,7 @@ TEST_DIRECTORY = os.path.join(os.environ['HOME'], 'permission_test') # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.fixture(scope="module") diff --git a/jwql/tests/test_pipeline_tools.py b/jwql/tests/test_pipeline_tools.py index 95a97ab34..b0ad381e0 100644 --- a/jwql/tests/test_pipeline_tools.py +++ b/jwql/tests/test_pipeline_tools.py @@ -27,7 +27,7 @@ from jwql.utils.utils import get_config # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.mark.skipif(ON_JENKINS, reason='Requires access to central storage.') diff --git a/jwql/tests/test_preview_image.py b/jwql/tests/test_preview_image.py index 532f502e9..2af6637a5 100644 --- a/jwql/tests/test_preview_image.py +++ b/jwql/tests/test_preview_image.py @@ -34,7 +34,7 @@ TEST_DIRECTORY = os.path.join(os.environ['HOME'], 'preview_image_test') # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @pytest.fixture(scope="module") diff --git a/jwql/tests/test_utils.py b/jwql/tests/test_utils.py index 06f07062b..591a4f63b 100644 --- a/jwql/tests/test_utils.py +++ b/jwql/tests/test_utils.py @@ -25,7 +25,7 @@ from jwql.utils.utils import copy_files, get_config, filename_parser, filesystem_path # Determine if tests are being run on jenkins -ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') FILENAME_PARSER_TEST_DATA = [ From afca89dc189ed9ea5f4d30b529713444564558e0 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Mon, 1 Jul 2019 16:34:00 -0400 Subject: [PATCH 59/86] Use ON_JENKINS in all cases --- jwql/tests/test_dark_monitor.py | 4 +++- jwql/tests/test_database_interface.py | 6 +++--- jwql/tests/test_instrument_properties.py | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/jwql/tests/test_dark_monitor.py b/jwql/tests/test_dark_monitor.py index a30b62f00..270580e14 100644 --- a/jwql/tests/test_dark_monitor.py +++ b/jwql/tests/test_dark_monitor.py @@ -26,6 +26,8 @@ from jwql.instrument_monitors.common_monitors import dark_monitor from jwql.utils.utils import get_config +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') + def test_find_hot_dead_pixels(): """Test hot and dead pixel searches""" @@ -52,7 +54,7 @@ def test_find_hot_dead_pixels(): assert np.all(dead[1] == np.array([6, 3])) -@pytest.mark.skipif(os.path.expanduser('~') == '/home/jenkins', +@pytest.mark.skipif(ON_JENKINS, reason='Requires access to central storage.') def test_get_metadata(): """Test retrieval of metadata from input file""" diff --git a/jwql/tests/test_database_interface.py b/jwql/tests/test_database_interface.py index 92cef4527..9530ca497 100755 --- a/jwql/tests/test_database_interface.py +++ b/jwql/tests/test_database_interface.py @@ -76,9 +76,9 @@ def test_anomaly_records(): """Test to see that new records can be entered""" # Add some data - random_rootname = ''.join(random.SystemRandom().choice(string.ascii_lowercase + - string.ascii_uppercase + - string.digits) for _ in range(10)) + random_rootname = ''.join(random.SystemRandom().choice(string.ascii_lowercase + + string.ascii_uppercase + + string.digits) for _ in range(10)) di.session.add(di.Anomaly(rootname=random_rootname, flag_date=datetime.datetime.today(), user='test', ghost=True)) diff --git a/jwql/tests/test_instrument_properties.py b/jwql/tests/test_instrument_properties.py index 5e9af4784..7f18e6cbd 100644 --- a/jwql/tests/test_instrument_properties.py +++ b/jwql/tests/test_instrument_properties.py @@ -25,8 +25,10 @@ from jwql.utils import instrument_properties from jwql.utils.utils import get_config +ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') -@pytest.mark.skipif(os.path.expanduser('~') == '/home/jenkins', + +@pytest.mark.skipif(ON_JENKINS, reason='Requires access to central storage.') def test_amplifier_info(): """Test that the correct number of amplifiers are found for a given From 03b042d96a1f025e9027e8c9c0d475012aa7bd7c Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Mon, 1 Jul 2019 16:46:55 -0400 Subject: [PATCH 60/86] Fix local tests --- jwql/database/database_interface.py | 2 +- jwql/tests/test_database_interface.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jwql/database/database_interface.py b/jwql/database/database_interface.py index 041f08a44..a61532de7 100644 --- a/jwql/database/database_interface.py +++ b/jwql/database/database_interface.py @@ -140,7 +140,7 @@ def load_connection(connection_string): # Import a global session. If running from readthedocs or Jenkins, pass a dummy connection string -if ['build' and 'project' in socket.gethostname()] or ON_JENKINS: +if 'build' and 'project' in socket.gethostname() or ON_JENKINS: dummy_connection_string = 'postgresql+psycopg2://account:password@hostname:0000/db_name' session, base, engine, meta = load_connection(dummy_connection_string) else: diff --git a/jwql/tests/test_database_interface.py b/jwql/tests/test_database_interface.py index 9530ca497..898af27fb 100755 --- a/jwql/tests/test_database_interface.py +++ b/jwql/tests/test_database_interface.py @@ -76,9 +76,9 @@ def test_anomaly_records(): """Test to see that new records can be entered""" # Add some data - random_rootname = ''.join(random.SystemRandom().choice(string.ascii_lowercase - + string.ascii_uppercase - + string.digits) for _ in range(10)) + random_rootname = ''.join(random.SystemRandom().choice(string.ascii_lowercase + \ + string.ascii_uppercase + \ + string.digits) for _ in range(10)) di.session.add(di.Anomaly(rootname=random_rootname, flag_date=datetime.datetime.today(), user='test', ghost=True)) @@ -88,7 +88,7 @@ def test_anomaly_records(): ghosts = di.session.query(di.Anomaly)\ .filter(di.Anomaly.rootname == random_rootname)\ .filter(di.Anomaly.ghost == "True") - assert ghosts.data_frame.iloc[0]['ghost'] is True + assert ghosts.data_frame.iloc[0]['ghost'] == True @pytest.mark.skipif(ON_JENKINS, reason='Requires access to development database server.') From 6b3a16e986a26308ce50a1685144b87836482137 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 1 Jul 2019 18:38:19 -0400 Subject: [PATCH 61/86] Update django from 2.2.2 to 2.2.3 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 34be43dd9..2f8013cba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ astropy>=3.0 astroquery==0.3.9 authlib==0.11 bokeh==1.2.0 -django==2.2.2 +django==2.2.3 inflection==0.3.1 ipython==7.5.0 jinja2==2.10.1 From 467655b07578c9de14bc545de5431cf4dbba6101 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 1 Jul 2019 18:38:20 -0400 Subject: [PATCH 62/86] Update ipython from 7.5.0 to 7.6.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2f8013cba..53ce05108 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ authlib==0.11 bokeh==1.2.0 django==2.2.3 inflection==0.3.1 -ipython==7.5.0 +ipython==7.6.0 jinja2==2.10.1 jwedb>=0.0.3 jwst==0.0.0 From 62e02449d576fc2c3c18e607bea5626603284f87 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 1 Jul 2019 18:38:21 -0400 Subject: [PATCH 63/86] Update pytest from 4.6.3 to 5.0.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 53ce05108..b1f744e26 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ pandas==0.24.2 psycopg2==2.8.3 pysiaf==0.3.0 python-dateutil==2.8.0 -pytest==4.6.3 +pytest==5.0.0 sphinx==2.1.2 sphinx-automodapi==0.11 sqlalchemy==1.3.5 From 1f55e7b537fca87579722848d13668e1c0a1dfba Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 1 Jul 2019 21:09:59 -0400 Subject: [PATCH 64/86] Updated ipython dependency --- environment_python_3_6.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment_python_3_6.yml b/environment_python_3_6.yml index 0d5dd3e03..6339af390 100644 --- a/environment_python_3_6.yml +++ b/environment_python_3_6.yml @@ -9,7 +9,7 @@ dependencies: - crds>=7.2.7 - django=2.2.1 - inflection=0.3.1 -- ipython=7.5.0 +- ipython=7.6.0 - jinja2=2.10 - jwst=0.13.1 - matplotlib=3.0.2 From e4b009b310ec5608a3134f0b1951d72a0f795cca Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Tue, 2 Jul 2019 09:45:34 -0400 Subject: [PATCH 65/86] Rearranged some code so that the processing only kicks off if there are enough actual files present in the filesystem --- .../common_monitors/dark_monitor.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/jwql/instrument_monitors/common_monitors/dark_monitor.py b/jwql/instrument_monitors/common_monitors/dark_monitor.py index 3cd4fcb61..b6b3b06e4 100755 --- a/jwql/instrument_monitors/common_monitors/dark_monitor.py +++ b/jwql/instrument_monitors/common_monitors/dark_monitor.py @@ -728,21 +728,21 @@ def run(self): new_entries = mast_query_darks(instrument, aperture, self.query_start, self.query_end) logging.info('\tAperture: {}, new entries: {}'.format(self.aperture, len(new_entries))) + # Get full paths to the files that actually exist in filesystem + new_filenames = [] + for file_entry in new_entries: + try: + new_filenames.append(filesystem_path(file_entry['filename'])) + except FileNotFoundError: + logging.warning('\t\tUnable to locate {} in filesystem. Not including in processing.' + .format(file_entry['filename'])) + # Check to see if there are enough new files to meet the monitor's signal-to-noise requirements - if len(new_entries) >= file_count_threshold: + if len(new_filenames) >= file_count_threshold: logging.info('\tSufficient new dark files found for {}, {} to run the dark monitor.' .format(self.instrument, self.aperture)) - # Get full paths to the files - new_filenames = [] - for file_entry in new_entries: - try: - new_filenames.append(filesystem_path(file_entry['filename'])) - except FileNotFoundError: - logging.warning('\t\tUnable to locate {} in filesystem. Not including in processing.' - .format(file_entry['filename'])) - # Set up directories for the copied data ensure_dir_exists(os.path.join(self.output_dir, 'data')) self.data_dir = os.path.join(self.output_dir, From 892355edd9c70300376e41127173b86084a94e93 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Tue, 2 Jul 2019 15:33:47 -0400 Subject: [PATCH 66/86] Add accessibility guidelines markdown page for the style guide --- style_guide/README.md | 7 +++- style_guide/accessibility_guidelines.md | 51 +++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 style_guide/accessibility_guidelines.md diff --git a/style_guide/README.md b/style_guide/README.md index f1bdf8523..f8d01a676 100644 --- a/style_guide/README.md +++ b/style_guide/README.md @@ -69,7 +69,7 @@ Additionally, developers of this project should be mindful of application securi `jwql`-Specific Logging Standards --------------------------------- -`jwql` employs standards for logging monitoring scripts. See the [`logging guide`](https://github.com/spacetelescope/jwql/tree/develop/logging_guide) for further details. +`jwql` employs standards for logging monitoring scripts. See the [`logging guide`](https://github.com/spacetelescope/jwql/blob/develop/style_guide/logging_guide.md) for further details. `jwql`-Specific Variable Value/Type Standards @@ -82,6 +82,11 @@ To the extent possible, `jwql` shall define frequently-used variable types/value - **Program/proposal identifiers**: JWST program IDs shall be stored and referred to internally as integers and parsed to strings only when needed. For example, the inputs `"001144"` and `"1144"` shall both be converted to an integer variable with value `1144`. +Accessibility in Development +---------------------------- +`jwql` strives to create web pages and code that are as accessibile as possible for all users. See the [`accessibility guidelines`](https://github.com/spacetelescope/jwql/blob/develop/style_guide/accessibility_guidelines.md) page for further details. + + Tools and Library Recommendations --------------------------------- diff --git a/style_guide/accessibility_guidelines.md b/style_guide/accessibility_guidelines.md new file mode 100644 index 000000000..03651605e --- /dev/null +++ b/style_guide/accessibility_guidelines.md @@ -0,0 +1,51 @@ +Guidelines for Accessible Development +===================================== + +This document serves as a guide for developing accessible web pages and code within the `jwql` project. Any contribution to the `jwql` code repository should be checked against these guidelines to ensure it meets all applicable standards. Any violations of these guidelines should be fixed before the code is committed to the `master` or `develop` branches. + + +`jwql`-specific Guidelines +-------------------------- + +We have compiled below those WCAG 2.1 guidelines (see the "Resources" section below for more detail about WCAG) that are most directly applicable to the JWQL web app. + +Every contribution to the web application must include the following features: + +- Images and Plots + - Write descriptive `alt` and `title` attributes in `` tags + - Use color schemes that are still meaningful to individuals with color blindness (see note below about Color Oracle) + - When plotting data, use both colors AND symbols to distinguish datasets + - Avoid using images of text +- Text + - Ensure sure headers are in order (i.e. `

` before `

`, `

` before `

`, etc.) and do not skip (i.e. `

` comes after `

`, not `

`) + - Don't write explicit navigation instructions involving placement or direction (e.g. "in the upper right corner") + - Differentiate links from normal text (different color and/or underline) + - Describe the link purpose in link text (e.g. avoid using "here" as link text) +- Forms + - Use `
` tags to group related form fields + - Describe form field values in/next to form, and/or provide default values +- Formatting + - Ensure the page is still readable and functional when the text size is doubled + - Ensure users can navigate through page with just the keyboard and not get trapped + - Ensure you can see where you are when tabbing through page (e.g. buttons and links are highlighted when in focus) + - Add a link before the navigation bar to allow users to jump to main content without tabbing through every `` item + - Add informative page titles + +Please note that this list is not exhaustive; other guidelines listed by WCAG or 508 may also apply to particular web pages and features and should be implemented as appropriate. + + +Resources +--------- + +The above guidelines are taken from the following guides and checklists that compile important components of an accessible web site: + +- [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/WAI/standards-guidelines/wcag/) - aims to provide a "single shared standard for web content accessibility that meets the needs of individuals, organizations, and governments internationally" and "explain how to make web content more accessible to people with disabilities." +- [Section 508 Standards](https://www.section508.gov/create) - the US Access Board's "accessibility requirements for information and communication technology (ICT) covered by Section 508 of the Rehabilitation Act and Section 255 of the Communications Act." + +We especially recommend consulting WebAIM's [WCAG 2 Checklist](https://webaim.org/standards/wcag/checklist) for accessible design. [WebAIM](https://webaim.org/) is a site with many resources for designing accessible web applications that includes guidelines and examples. + +In order to test how accessible your web page is, we recommend using the following resources: +- [Color Oracle](https://colororacle.org/) - free color-blindness simulator that alters the computer screen to demonstrate different varieties of color-blindness. +- [ChromeVox](https://chrome.google.com/webstore/detail/chromevox/kgejglhpjiefppelpmljglcjbhoiplfn?hl=en) - screen reader extension for Google Chrome browsers that allows users to explore web pages using only the keyboard. + +*STScI Internal Only:* For more resources on web accessibility, check out OPO's Innerspace page on [Accessibility and 508 Compliance](https://innerspace.stsci.edu/display/A5C/Accessibility+and+508+Compliance). From e9d60942f7d356167f5d1f8742e62b10e8dd02b5 Mon Sep 17 00:00:00 2001 From: "Catherine A. Martlin" Date: Wed, 3 Jul 2019 15:18:22 -0400 Subject: [PATCH 67/86] Fixed a typo --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a8b804c75..489806794 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,4 +21,4 @@ sphinx==2.1.0 sphinx-automodapi==0.11 sqlalchemy==1.3.4 stsci_rtd_theme==0.0.2 -pytest-cov=2.6.0 +pytest-cov==2.6.0 From a0658dfd501437213aebf4b6fa79553e2c9a9536 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Thu, 11 Jul 2019 10:13:48 -0400 Subject: [PATCH 68/86] Add comments and make tabs 4 spaces --- Jenkinsfile | 115 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 84 insertions(+), 31 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 15ab0e982..44d1185ff 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,41 +1,94 @@ -// Obtain files from source control system. +// JWQL Jenkinsfile +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// +// Authors: +// -------- +// - Matthew Bourque +// - Lauren Chambers +// - Joshua Alexander +// - Sara Ogaz +// - Matt Rendina +// +// Notes: +// ------ +// - More info here: https://github.com/spacetelescope/jenkinsfile_ci_examples +// - Syntax defined here: https://github.com/spacetelescope/jenkins_shared_ci_utils +// +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// +// scm_checkout() does the following: +// 1. Disables pipeline execution if [skip ci] or [ci skip] is present in the +// commit message, letting users exclude individual commits from CI +// 2. Clones the Git repository +// 3. Creates a local cache of the repository to avoid commit drift between tasks +// (i.e. Each stage is guaranteed to receive the same source code regardless of +// commits taking place after the pipeline has started.) if (utils.scm_checkout()) return -matrix_os = ["linux-stable"] +// Establish OS and Python version variables for the matrix +matrix_os = ["linux-stable"] // (Note that Jenkins can only be run with Linux, not MacOSX/Windows) matrix_python = ["3.5", "3.6"] + +// Set up the matrix of builds matrix = [] +// Define IDs that live on the Jenkins server (here, for CodeCov and PyPI) withCredentials([ - string(credentialsId: 'jwql-codecov', variable: 'codecov_token'), - usernamePassword(credentialsId:'jwql-pypi', usernameVariable: 'pypi_username', passwordVariable: 'pypi_password')]) + string(credentialsId: 'jwql-codecov', variable: 'codecov_token'), + usernamePassword(credentialsId:'jwql-pypi', usernameVariable: 'pypi_username', passwordVariable: 'pypi_password')]) +// Iterate over the above variables to define the build matrix. { - for (os in matrix_os) { - for (python_ver in matrix_python) { - - env_py = "_python_${python_ver}".replace(".", "_") - bc = new BuildConfig() - bc.nodetype = os - bc.name = "debug-${os}-${env_py}" - bc.conda_packages = ["python=${python_ver}"] - - bc.build_cmds = [ - "conda env update --file=environment${env_py}.yml", - "pip install codecov pytest-cov", - "python setup.py install", - "python setup.py sdist bdist_wheel"] - - bc.test_cmds = [ - "pytest ./jwql/tests/ -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", - "sed -i 's/file=\"[^\"]*\"//g;s/line=\"[^\"]*\"//g;s/skips=\"[^\"]*\"//g' results.xml", - "codecov --token=${codecov_token}", - "mkdir -v reports", - "mv -v coverage.xml reports/coverage.xml", - "twine upload -u '${pypi_username}' -p '${pypi_password}' --repository-url https://upload.pypi.org/legacy/ --skip-existing dist/*"] - - matrix += bc + for (os in matrix_os) { + for (python_ver in matrix_python) { + // Define each build configuration, copying and overriding values as necessary. + + // Define a string variable to reflect the python version of this build + env_py = "_python_${python_ver}".replace(".", "_") + + // Create a new build configuration + bc = new BuildConfig() + + // Define the OS (only "linux-stable" used here) + bc.nodetype = os + + // Give the build configuration a name. This string becomes the + // stage header on Jenkins' UI. Keep it short! + bc.name = "debug-${os}-${env_py}" + + // (Required) Define what packages to include in the base conda environment. + // This specification also tells Jenkins to spin up a new conda environment for + // your build, rather than using the default environment. + bc.conda_packages = ["python=${python_ver}"] + + // Execute a series of commands to set up the build, including + // any packages that have to be installed with pip + bc.build_cmds = [ + "conda env update --file=environment${env_py}.yml", // Update env from file + "pip install codecov pytest-cov", // Install additional packages + "python setup.py install", // Install JWQL package + "python setup.py sdist bdist_wheel" // Build JWQL pacakge wheel for PyPI + ] + + // Execute a series of test commands + bc.test_cmds = [ + // Run pytest + "pytest ./jwql/tests/ -s --junitxml=results.xml --cov=./jwql/ --cov-report=xml:coverage.xml", + // Add a truly magical command that makes Jenkins work for Python 3.5 + "sed -i 's/file=\"[^\"]*\"//g;s/line=\"[^\"]*\"//g;s/skips=\"[^\"]*\"//g' results.xml", + // Define CodeCov token + "codecov --token=${codecov_token}", + // Move the CodeCov report to a different dir to not confuse Jenkins about results.xml + "mkdir -v reports", + "mv -v coverage.xml reports/coverage.xml", + // Update the package wheel to PYPI + "twine upload -u '${pypi_username}' -p '${pypi_password}' --repository-url https://upload.pypi.org/legacy/ --skip-existing dist/*"] + + // Add the build to the matrix + matrix += bc + } } - } - utils.run(matrix) -} \ No newline at end of file + // Submit the build configurations and execute them in parallel + utils.run(matrix) +} From c60761653905c0fc44b4dce0f665f99b126a9967 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Thu, 11 Jul 2019 10:58:59 -0400 Subject: [PATCH 69/86] Put bokeh_version into context processor; remove bokeh imports outside of base.html --- jwql/website/apps/jwql/context_processors.py | 3 ++ jwql/website/apps/jwql/templates/base.html | 8 +++- .../apps/jwql/templates/dashboard.html | 3 +- .../jwql/templates/engineering_database.html | 3 +- .../templates/filesystem_monitor_full.html | 48 ------------------- .../jwql/templates/miri_data_trending.html | 6 --- .../jwql/templates/nirspec_data_trending.html | 6 --- 7 files changed, 11 insertions(+), 66 deletions(-) delete mode 100755 jwql/website/apps/jwql/templates/filesystem_monitor_full.html diff --git a/jwql/website/apps/jwql/context_processors.py b/jwql/website/apps/jwql/context_processors.py index 9cadcbea7..65c40d0db 100644 --- a/jwql/website/apps/jwql/context_processors.py +++ b/jwql/website/apps/jwql/context_processors.py @@ -23,6 +23,8 @@ As such, it will automatically be executed upon each request. """ +import bokeh + import jwql from jwql.utils.constants import JWST_INSTRUMENT_NAMES, MONITORS @@ -50,5 +52,6 @@ def base_context(request, user): context['tools'] = MONITORS context['user'] = user context['version'] = jwql.__version__ + context['bokeh_version'] = bokeh.__version__ return context diff --git a/jwql/website/apps/jwql/templates/base.html b/jwql/website/apps/jwql/templates/base.html index fe1cf0aa8..e5aa8da62 100644 --- a/jwql/website/apps/jwql/templates/base.html +++ b/jwql/website/apps/jwql/templates/base.html @@ -18,12 +18,16 @@ + + + - - + + + {% block preamble %} diff --git a/jwql/website/apps/jwql/templates/dashboard.html b/jwql/website/apps/jwql/templates/dashboard.html index 2aea6bb50..1f343331a 100644 --- a/jwql/website/apps/jwql/templates/dashboard.html +++ b/jwql/website/apps/jwql/templates/dashboard.html @@ -4,8 +4,7 @@ Dashboard - JWQL - - + {% for monitor_name, plots in dashboard_components.items() %} {% for plot_name, components in plots.items() %} {{ components[1] | safe}} diff --git a/jwql/website/apps/jwql/templates/engineering_database.html b/jwql/website/apps/jwql/templates/engineering_database.html index c2bbc5a2a..a71842f8d 100644 --- a/jwql/website/apps/jwql/templates/engineering_database.html +++ b/jwql/website/apps/jwql/templates/engineering_database.html @@ -117,8 +117,7 @@

Query for records of an EDB mnemonic

Query returned {{ edb_components['mnemonic_query_result'].meta['paging']['rows'] }} records: Download data

- - + {{ edb_components['mnemonic_query_result_plot'][1] | safe}} {{ edb_components['mnemonic_query_result_plot'][0] | safe }} diff --git a/jwql/website/apps/jwql/templates/filesystem_monitor_full.html b/jwql/website/apps/jwql/templates/filesystem_monitor_full.html deleted file mode 100755 index f8a0cfa52..000000000 --- a/jwql/website/apps/jwql/templates/filesystem_monitor_full.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - Bokeh Plot - - - - - - - - - -
-
-
- - - - \ No newline at end of file diff --git a/jwql/website/apps/jwql/templates/miri_data_trending.html b/jwql/website/apps/jwql/templates/miri_data_trending.html index b1d8ce752..adf4db43e 100644 --- a/jwql/website/apps/jwql/templates/miri_data_trending.html +++ b/jwql/website/apps/jwql/templates/miri_data_trending.html @@ -42,8 +42,6 @@

How it works

Bokeh Scatter Plots - - @@ -52,10 +50,6 @@

How it works

- - - -
{{ dashboard[1] | safe }}
diff --git a/jwql/website/apps/jwql/templates/nirspec_data_trending.html b/jwql/website/apps/jwql/templates/nirspec_data_trending.html index 62bdda5a8..a899eaaf2 100644 --- a/jwql/website/apps/jwql/templates/nirspec_data_trending.html +++ b/jwql/website/apps/jwql/templates/nirspec_data_trending.html @@ -49,8 +49,6 @@

How it works

Bokeh Scatter Plots - - @@ -59,10 +57,6 @@

How it works

- - - -
{{ dashboard[1] | safe }}
From 176575b486a3a4bb0865855d319caf93fcc50ef9 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Thu, 11 Jul 2019 12:24:18 -0400 Subject: [PATCH 70/86] Rename "check_config()" to "check_config_for_key()" --- jwql/utils/credentials.py | 4 ++-- jwql/utils/utils.py | 2 +- jwql/website/apps/jwql/data_containers.py | 4 ++-- jwql/website/apps/jwql/oauth.py | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jwql/utils/credentials.py b/jwql/utils/credentials.py index d307d27d4..3677cf429 100644 --- a/jwql/utils/credentials.py +++ b/jwql/utils/credentials.py @@ -20,7 +20,7 @@ from astroquery.mast import Mast -from jwql.utils.utils import get_config, check_config +from jwql.utils.utils import get_config, check_config_for_key def get_mast_token(request=None): @@ -48,7 +48,7 @@ def get_mast_token(request=None): return token try: # check if token is available via config file - check_config('mast_token') + check_config_for_key('mast_token') token = get_config()['mast_token'] print('Authenticated with config.json MAST token.') return token diff --git a/jwql/utils/utils.py b/jwql/utils/utils.py index fdb48dd7b..72f94deb1 100644 --- a/jwql/utils/utils.py +++ b/jwql/utils/utils.py @@ -400,7 +400,7 @@ def get_config(): return settings -def check_config(key): +def check_config_for_key(key): """Check that the config.json file contains the specified key and that the entry is not empty diff --git a/jwql/website/apps/jwql/data_containers.py b/jwql/website/apps/jwql/data_containers.py index 039bf07ba..05750df9e 100644 --- a/jwql/website/apps/jwql/data_containers.py +++ b/jwql/website/apps/jwql/data_containers.py @@ -34,8 +34,8 @@ # astroquery.mast import that depends on value of auth_mast # this import has to be made before any other import of astroquery.mast -from jwql.utils.utils import get_config, filename_parser, check_config -check_config('auth_mast') +from jwql.utils.utils import get_config, filename_parser, check_config_for_key +check_config_for_key('auth_mast') auth_mast = get_config()['auth_mast'] mast_flavour = '.'.join(auth_mast.split('.')[1:]) from astropy import config diff --git a/jwql/website/apps/jwql/oauth.py b/jwql/website/apps/jwql/oauth.py index 086334e73..70167c088 100644 --- a/jwql/website/apps/jwql/oauth.py +++ b/jwql/website/apps/jwql/oauth.py @@ -46,7 +46,7 @@ def login(request): import jwql from jwql.utils.constants import MONITORS -from jwql.utils.utils import get_base_url, get_config, check_config +from jwql.utils.utils import get_base_url, get_config, check_config_for_key PREV_PAGE = '/' @@ -64,7 +64,7 @@ def register_oauth(): # Get configuration parameters for key in ['client_id', 'client_secret', 'auth_mast']: - check_config(key) + check_config_for_key(key) client_id = get_config()['client_id'] client_secret = get_config()['client_secret'] auth_mast = get_config()['auth_mast'] @@ -168,7 +168,7 @@ def user_info(request, **kwargs): # If user is authenticated, return user credentials if cookie is not None: - check_config('auth_mast') + check_config_for_key('auth_mast') # Note: for now, this must be the development version auth_mast = get_config()['auth_mast'] From 5506e765e0e9ce485e27952b1053be56f111ce77 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Thu, 11 Jul 2019 12:24:55 -0400 Subject: [PATCH 71/86] Add _validate_config() to make sure the file has all needed entries; add wrappers around error msgs --- jwql/utils/utils.py | 80 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/jwql/utils/utils.py b/jwql/utils/utils.py index 72f94deb1..4c51c9f02 100644 --- a/jwql/utils/utils.py +++ b/jwql/utils/utils.py @@ -36,6 +36,8 @@ import re import shutil +import jsonschema + from jwql.utils import permissions from jwql.utils.constants import FILE_SUFFIX_TYPES, JWST_INSTRUMENT_NAMES_SHORTHAND @@ -387,6 +389,7 @@ def get_config(): """ config_file_location = os.path.join(__location__, 'config.json') + # Make sure the file exists if not os.path.isfile(config_file_location): raise FileNotFoundError('The JWQL package requires a configuration file (config.json) ' 'to be placed within the jwql/utils directory. ' @@ -394,8 +397,18 @@ def get_config(): '(https://github.com/spacetelescope/jwql/wiki/' 'Config-file) for more information.') - with open(config_file_location, 'r') as config_file: - settings = json.load(config_file) + with open(config_file_location, 'r') as config_file_object: + try: + # Load it with JSON + settings = json.load(config_file_object) + except json.JSONDecodeError as e: + # Raise a more helpful error if there is a formatting problem + raise ValueError('Incorrectly formatted config.json file. ' + 'Please fix JSON formatting: {}' + .format(e)) + + # Ensure the file has all the needed entries with expected data types + _validate_config(settings) return settings @@ -426,6 +439,69 @@ def check_config_for_key(key): ) +def _validate_config(config_file_dict): + """Check that the config.json file contains all the needed entries with + expected data types + + Parameters + ------- + config_file_dict : dict + The configuration JSON file loaded as a dictionary + + Notes + ----- + See here for more information on JSON schemas: + https://json-schema.org/learn/getting-started-step-by-step.html + """ + # Define the schema for config.json + schema = { + "type": "object", # Must be a JSON object + "properties": { # List all the possible entries and their types + "connection_string": {"type": "string"}, + "database": {"type": "object", + "properties": { + "engine": {"type": "string"}, + "name": {"type": "string"}, + "user": {"type": "string"}, + "password": {"type": "string"}, + "host": {"type": "string"}, + "port": {"type": "string"} + }, + "required": ['engine', 'name', 'user', 'password', 'host', 'port'] + }, + "filesystem": {"type": "string"}, + "preview_image_filesystem": {"type": "string"}, + "thumbnail_filesystem": {"type": "string"}, + "outputs": {"type": "string"}, + "jwql_dir": {"type": "string"}, + "admin_account": {"type": "string"}, + "log_dir": {"type": "string"}, + "test_dir": {"type": "string"}, + "test_data": {"type": "string"}, + "setup_file": {"type": "string"}, + "auth_mast": {"type": "string"}, + "client_id": {"type": "string"}, + "client_secret": {"type": "string"}, + "mast_token": {"type": "string"}, + }, + # List which entries are needed (all of them) + "required" : ["connection_string", "database", "filesystem", + "preview_image_filesystem", "thumbnail_filesystem", + "outputs", "jwql_dir", "admin_account", "log_dir", + "test_dir", "test_data", "setup_file", "auth_mast", + "client_id", "client_secret", "mast_token"] + } + + # Test that the provided config file dict matches the schema + try: + jsonschema.validate(instance=config_file_dict, schema=schema) + except jsonschema.ValidationError as e: + raise jsonschema.ValidationError( + 'Provided config.json does not match the required JSON schema: {}' + .format(e.message) + ) + + def initialize_instrument_monitor(module): """Configures a log file for the instrument monitor run and captures the start time of the monitor From 382033762c27a059c58aa6dfa1064a9ec36aa5d0 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Thu, 11 Jul 2019 12:25:16 -0400 Subject: [PATCH 72/86] Add jsonschema package to env & req files --- environment_python_3_5.yml | 1 + environment_python_3_6.yml | 1 + requirements.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/environment_python_3_5.yml b/environment_python_3_5.yml index 00b67909d..0baf3d237 100644 --- a/environment_python_3_5.yml +++ b/environment_python_3_5.yml @@ -11,6 +11,7 @@ dependencies: - inflection=0.3.1 - ipython=6.5.0 - jinja2=2.10 +- jsonschema>=2.6.0 - jwst=0.13.0 - matplotlib=3.0.0 - numpy=1.15.2 diff --git a/environment_python_3_6.yml b/environment_python_3_6.yml index 6339af390..99b7d668e 100644 --- a/environment_python_3_6.yml +++ b/environment_python_3_6.yml @@ -11,6 +11,7 @@ dependencies: - inflection=0.3.1 - ipython=7.6.0 - jinja2=2.10 +- jsonschema>=3.0.1 - jwst=0.13.1 - matplotlib=3.0.2 - numpy=1.16.4 diff --git a/requirements.txt b/requirements.txt index b1f744e26..8c0fe4eee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,6 +7,7 @@ django==2.2.3 inflection==0.3.1 ipython==7.6.0 jinja2==2.10.1 +jsonschema==3.0.1 jwedb>=0.0.3 jwst==0.0.0 matplotlib==3.1.0 From 2902d1f6d2f4685b94383fc0a9968e285e8d99a9 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Thu, 11 Jul 2019 12:31:55 -0400 Subject: [PATCH 73/86] Add a test --- jwql/tests/test_utils.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/jwql/tests/test_utils.py b/jwql/tests/test_utils.py index 591a4f63b..35e9b4f00 100644 --- a/jwql/tests/test_utils.py +++ b/jwql/tests/test_utils.py @@ -22,7 +22,8 @@ from pathlib import Path import pytest -from jwql.utils.utils import copy_files, get_config, filename_parser, filesystem_path +from jwql.utils.utils import copy_files, get_config, filename_parser, \ + filesystem_path, _validate_config # Determine if tests are being run on jenkins ON_JENKINS = '/home/jenkins' in os.path.expanduser('~') @@ -344,3 +345,15 @@ def test_filesystem_path(): location = os.path.join(get_config()['filesystem'], 'jw96003', filename) assert check == location + + +def test_bad_validate_config(): + """Test that an incorrect dictionary is rejected by the config validator. + """ + # Make sure a bad config raises an error + bad_config_dict = {"just": "one_key"} + + with pytest.raises(Exception) as excinfo: + _validate_config(bad_config_dict)) + assert 'Provided config.json does not match the required JSON schema' in \ + str(excinfo.value) From db1b67494c63cf6fc61ba7742e8b3a5304bf3945 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Thu, 11 Jul 2019 12:40:23 -0400 Subject: [PATCH 74/86] Add test case for good (but empty) config dict --- jwql/tests/test_utils.py | 41 +++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/jwql/tests/test_utils.py b/jwql/tests/test_utils.py index 35e9b4f00..41977f0c4 100644 --- a/jwql/tests/test_utils.py +++ b/jwql/tests/test_utils.py @@ -347,13 +347,44 @@ def test_filesystem_path(): assert check == location -def test_bad_validate_config(): - """Test that an incorrect dictionary is rejected by the config validator. +def test_validate_config(): + """Test that the config validator works. """ # Make sure a bad config raises an error bad_config_dict = {"just": "one_key"} with pytest.raises(Exception) as excinfo: - _validate_config(bad_config_dict)) - assert 'Provided config.json does not match the required JSON schema' in \ - str(excinfo.value) + _validate_config(bad_config_dict) + assert 'Provided config.json does not match the required JSON schema' \ + in str(excinfo.value), \ + 'Failed to reject incorrect JSON dict.' + + # Make sure a good config does not! + good_config_dict = { + "connection_string": "", + "database": { + "engine": "", + "name": "", + "user": "", + "password": "", + "host": "", + "port": "" + }, + "filesystem": "", + "preview_image_filesystem": "", + "thumbnail_filesystem": "", + "outputs": "", + "jwql_dir": "", + "admin_account": "", + "log_dir": "", + "test_dir": "", + "test_data": "", + "setup_file": "", + "auth_mast": "", + "client_id": "", + "client_secret": "", + "mast_token": "" + } + + is_valid = _validate_config(good_config_dict) + assert is_valid is None, 'Failed to validate correct JSON dict' From 5369c9b20c3d7d5d0072a803cb0a27f261fac309 Mon Sep 17 00:00:00 2001 From: Lauren Chambers Date: Fri, 12 Jul 2019 10:59:24 -0400 Subject: [PATCH 75/86] PEP8 & review changes --- jwql/tests/test_utils.py | 3 +-- jwql/utils/utils.py | 44 ++++++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/jwql/tests/test_utils.py b/jwql/tests/test_utils.py index 41977f0c4..1446dbdc8 100644 --- a/jwql/tests/test_utils.py +++ b/jwql/tests/test_utils.py @@ -348,8 +348,7 @@ def test_filesystem_path(): def test_validate_config(): - """Test that the config validator works. - """ + """Test that the config validator works.""" # Make sure a bad config raises an error bad_config_dict = {"just": "one_key"} diff --git a/jwql/utils/utils.py b/jwql/utils/utils.py index 4c51c9f02..3ef082e1a 100644 --- a/jwql/utils/utils.py +++ b/jwql/utils/utils.py @@ -404,8 +404,7 @@ def get_config(): except json.JSONDecodeError as e: # Raise a more helpful error if there is a formatting problem raise ValueError('Incorrectly formatted config.json file. ' - 'Please fix JSON formatting: {}' - .format(e)) + 'Please fix JSON formatting: {}'.format(e)) # Ensure the file has all the needed entries with expected data types _validate_config(settings) @@ -444,7 +443,7 @@ def _validate_config(config_file_dict): expected data types Parameters - ------- + ---------- config_file_dict : dict The configuration JSON file loaded as a dictionary @@ -456,19 +455,20 @@ def _validate_config(config_file_dict): # Define the schema for config.json schema = { "type": "object", # Must be a JSON object - "properties": { # List all the possible entries and their types + "properties": { # List all the possible entries and their types "connection_string": {"type": "string"}, - "database": {"type": "object", - "properties": { - "engine": {"type": "string"}, - "name": {"type": "string"}, - "user": {"type": "string"}, - "password": {"type": "string"}, - "host": {"type": "string"}, - "port": {"type": "string"} - }, - "required": ['engine', 'name', 'user', 'password', 'host', 'port'] - }, + "database": { + "type": "object", + "properties": { + "engine": {"type": "string"}, + "name": {"type": "string"}, + "user": {"type": "string"}, + "password": {"type": "string"}, + "host": {"type": "string"}, + "port": {"type": "string"} + }, + "required": ['engine', 'name', 'user', 'password', 'host', 'port'] + }, "filesystem": {"type": "string"}, "preview_image_filesystem": {"type": "string"}, "thumbnail_filesystem": {"type": "string"}, @@ -485,11 +485,11 @@ def _validate_config(config_file_dict): "mast_token": {"type": "string"}, }, # List which entries are needed (all of them) - "required" : ["connection_string", "database", "filesystem", - "preview_image_filesystem", "thumbnail_filesystem", - "outputs", "jwql_dir", "admin_account", "log_dir", - "test_dir", "test_data", "setup_file", "auth_mast", - "client_id", "client_secret", "mast_token"] + "required": ["connection_string", "database", "filesystem", + "preview_image_filesystem", "thumbnail_filesystem", + "outputs", "jwql_dir", "admin_account", "log_dir", + "test_dir", "test_data", "setup_file", "auth_mast", + "client_id", "client_secret", "mast_token"] } # Test that the provided config file dict matches the schema @@ -497,8 +497,8 @@ def _validate_config(config_file_dict): jsonschema.validate(instance=config_file_dict, schema=schema) except jsonschema.ValidationError as e: raise jsonschema.ValidationError( - 'Provided config.json does not match the required JSON schema: {}' - .format(e.message) + 'Provided config.json does not match the ' + \ + 'required JSON schema: {}'.format(e.message) ) From d9969f73a03e3dd98f08156cc8fae793c7538ace Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 15 Jul 2019 11:02:49 -0400 Subject: [PATCH 76/86] Added Jacob Matuskey to list of acknowledgements --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee492cd89..94f46dd14 100644 --- a/README.md +++ b/README.md @@ -188,6 +188,7 @@ Any questions about the `jwql` project or its software can be directed to `jwql@ - Karen Levay (DMD) - Crystal Mannfolk (SCOPE) [@cmannfolk](https://github.com/cmannfolk) - Greg Masci (ITSD) +- Jacob Matuskey (DMD) [@jmatuskey](https://github.com/jmatuskey) - Margaret Meixner (INS) - Christain Mesh (DMD) [@cam72cam](https://github.com/cam72cam) - Prem Mishra (ITSD) From 0d1b721333b775871d3584bda83f72d0d82359ee Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 15 Jul 2019 16:14:01 -0400 Subject: [PATCH 77/86] Minor change to style guide title --- style_guide/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/style_guide/README.md b/style_guide/README.md index f1bdf8523..4aa6fc5bb 100644 --- a/style_guide/README.md +++ b/style_guide/README.md @@ -1,5 +1,5 @@ -Python Code Style Guide for `jwql` -================================= +`jwql` Style Guide +================== This document serves as a style guide for all `jwql` software development. Any requested contribution to the `jwql` code repository should be checked against this guide, and any violation of the guide should be fixed before the code is committed to the `master` or `develop` branch. Please refer to the accompanying [`example.py`](https://github.com/spacetelescope/jwql/blob/master/style_guide/example.py) script for a example code that abides by this style guide. From b412dc25114fd72f118c19b399b0c83cfc703bbc Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Jul 2019 15:50:04 -0400 Subject: [PATCH 78/86] Update ipython from 7.6.0 to 7.6.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8c0fe4eee..c66521bf9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ authlib==0.11 bokeh==1.2.0 django==2.2.3 inflection==0.3.1 -ipython==7.6.0 +ipython==7.6.1 jinja2==2.10.1 jsonschema==3.0.1 jwedb>=0.0.3 From 03c830a10a497ceac5d83383ca774c6dd2b8ebbc Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Jul 2019 15:50:05 -0400 Subject: [PATCH 79/86] Update matplotlib from 3.1.0 to 3.1.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c66521bf9..7711c30e3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ jinja2==2.10.1 jsonschema==3.0.1 jwedb>=0.0.3 jwst==0.0.0 -matplotlib==3.1.0 +matplotlib==3.1.1 numpy==1.16.4 numpydoc==0.9.1 pandas==0.24.2 From 198a030d1763a1f9f9bb0fcea61f301ca400085a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Jul 2019 15:50:06 -0400 Subject: [PATCH 80/86] Update pandas from 0.24.2 to 0.25.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7711c30e3..aa681a805 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,7 @@ jwst==0.0.0 matplotlib==3.1.1 numpy==1.16.4 numpydoc==0.9.1 -pandas==0.24.2 +pandas==0.25.0 psycopg2==2.8.3 pysiaf==0.3.0 python-dateutil==2.8.0 From aaf78deaecc235e805eb738840f8f314f648db39 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Jul 2019 15:50:08 -0400 Subject: [PATCH 81/86] Update pysiaf from 0.3.0 to 0.3.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index aa681a805..af5a64bab 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,7 +15,7 @@ numpy==1.16.4 numpydoc==0.9.1 pandas==0.25.0 psycopg2==2.8.3 -pysiaf==0.3.0 +pysiaf==0.3.1 python-dateutil==2.8.0 pytest==5.0.0 sphinx==2.1.2 From a97ecc77bd43aede86bded6be21b07216dba672b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Jul 2019 15:50:09 -0400 Subject: [PATCH 82/86] Update pytest from 5.0.0 to 5.0.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index af5a64bab..5cc421ca7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ pandas==0.25.0 psycopg2==2.8.3 pysiaf==0.3.1 python-dateutil==2.8.0 -pytest==5.0.0 +pytest==5.0.1 sphinx==2.1.2 sphinx-automodapi==0.11 sqlalchemy==1.3.5 From 97d862e93ac73de4214a7de889be2e0bf34634c8 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Jul 2019 15:50:10 -0400 Subject: [PATCH 83/86] Update sqlalchemy from 1.3.5 to 1.3.6 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5cc421ca7..e8f14841a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,6 +20,6 @@ python-dateutil==2.8.0 pytest==5.0.1 sphinx==2.1.2 sphinx-automodapi==0.11 -sqlalchemy==1.3.5 +sqlalchemy==1.3.6 stsci_rtd_theme==0.0.2 pytest-cov=2.6.0 From 3e2455e8d0ea5f55e4289a825d6aff71e7e7c23c Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Mon, 22 Jul 2019 16:17:08 -0400 Subject: [PATCH 84/86] Updates from pyup dependency updates --- environment_python_3_6.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/environment_python_3_6.yml b/environment_python_3_6.yml index 99b7d668e..3788dacf8 100644 --- a/environment_python_3_6.yml +++ b/environment_python_3_6.yml @@ -9,11 +9,11 @@ dependencies: - crds>=7.2.7 - django=2.2.1 - inflection=0.3.1 -- ipython=7.6.0 +- ipython=7.6.1 - jinja2=2.10 - jsonschema>=3.0.1 - jwst=0.13.1 -- matplotlib=3.0.2 +- matplotlib=3.1.0 - numpy=1.16.4 - numpydoc=0.9.0 - pandas=0.24.2 @@ -21,12 +21,12 @@ dependencies: - psycopg2=2.7.5 - python=3.6.4 - python-dateutil=2.7.5 -- pytest=4.6.2 +- pytest=5.0.1 - pytest-cov=2.6.1 - pytest-html=1.19.0 - sphinx=2.1.0 - sphinx_rtd_theme=0.1.9 -- sqlalchemy=1.3.4 +- sqlalchemy=1.3.5 - sqlparse=0.3.0 - stsci_rtd_theme=0.0.2 - twine=1.13.0 @@ -34,5 +34,5 @@ dependencies: - authlib==0.10 - codecov==2.0.15 - jwedb>=0.0.3 - - pysiaf==0.3.0 + - pysiaf==0.3.1 - sphinx-automodapi==0.10 From 25c2a3f116bbc63e3bd280a14e2bd92d6ecb4954 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Tue, 23 Jul 2019 08:53:59 -0400 Subject: [PATCH 85/86] Minor edits based on flake8 suggestions --- jwql/jwql_monitors/monitor_filesystem.py | 27 +++++------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/jwql/jwql_monitors/monitor_filesystem.py b/jwql/jwql_monitors/monitor_filesystem.py index 4146c4974..34a7c4885 100755 --- a/jwql/jwql_monitors/monitor_filesystem.py +++ b/jwql/jwql_monitors/monitor_filesystem.py @@ -1,10 +1,9 @@ #! /usr/bin/env python -""" -This module monitors and gather statistics of the filesystem that hosts -data for the ``jwql`` application. This will answer questions such as -the total number of files, how much disk space is being used, and then -plot these values over time. +"""This module monitors and gather statistics of the filesystem and +central storage area that hosts data for the ``jwql`` application. +This will answer questions such as the total number of files, how much +disk space is being used, and then plot these values over time. Authors ------- @@ -39,7 +38,6 @@ import datetime import itertools import logging -import psutil import os import subprocess @@ -80,7 +78,6 @@ def gather_statistics(general_results_dict, instrument_results_dict): A dictionary for the ``filesystem_general`` database table instrument_results_dict : dict A dictionary for the ``filesystem_instrument`` database table - """ logging.info('Searching filesystem...') @@ -178,12 +175,8 @@ def get_area_stats(central_storage_dict): else: fullpath = os.path.join(CENTRAL, area) - #print(area, fullpath) - logging.info('Searching directory {}'.format(fullpath)) - # record current area as being counted counteddirs.append(fullpath) - #print(counteddirs) # to get df stats, use -k to get 1024 byte blocks command = "df -k {}".format(fullpath) @@ -197,14 +190,11 @@ def get_area_stats(central_storage_dict): central_storage_dict[area]['available'] = free # do an os.walk on each directory to count up used space - - ### modifying here if area == 'all': # get listing of subdirectories subdirs = [f.path for f in os.scandir(fullpath) if f.is_dir()] for onedir in subdirs: if onedir not in counteddirs: - #print(onedir) logging.info('Searching directory {}'.format(onedir)) for dirpath, _, files in os.walk(onedir): for filename in files: @@ -214,7 +204,7 @@ def get_area_stats(central_storage_dict): if exists: filesize = os.path.getsize(file_path) sums += filesize - use = sums / (1024 **4) + use = sums / (1024 ** 4) else: for dirpath, _, files in os.walk(fullpath): for filename in files: @@ -227,7 +217,6 @@ def get_area_stats(central_storage_dict): sums += filesize use = used / (1024 ** 4) central_storage_dict[area]['used'] = use - #print(area, total, use, free) logging.info('Finished searching central storage system') return central_storage_dict @@ -436,8 +425,6 @@ def plot_central_store_dirs(): dates = list(results_dict.keys()) values = list(results_dict.values()) - #print(dates, values) - # Plot the results plot.line(dates, values, legend='{} files'.format(area), line_color=color) plot.circle(dates, values, color=color) @@ -550,14 +537,11 @@ def update_database(general_results_dict, instrument_results_dict, central_stora new_record['filetype'] = filetype new_record['count'] = instrument_results_dict[instrument][filetype]['count'] new_record['size'] = instrument_results_dict[instrument][filetype]['size'] - engine.execute(FilesystemInstrument.__table__.insert(), new_record) session.commit() # Add data to central_storage table - arealist = ['logs', 'outputs', 'test', 'preview_images', 'thumbnails', 'all'] - for area in arealist: new_record = {} new_record['date'] = central_storage_dict['date'] @@ -565,7 +549,6 @@ def update_database(general_results_dict, instrument_results_dict, central_stora new_record['size'] = central_storage_dict[area]['size'] new_record['used'] = central_storage_dict[area]['used'] new_record['available'] = central_storage_dict[area]['available'] - engine.execute(CentralStore.__table__.insert(), new_record) session.commit() From ea3d6245e38022317dbf54c04c8c9f13297b0c07 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Tue, 23 Jul 2019 11:38:36 -0400 Subject: [PATCH 86/86] Updated version number and changelog for 0.21.0 release --- CHANGES.rst | 42 ++++++++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 6996c881f..507a7ae40 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,45 @@ +0.21.0 (2019-07-23) +=================== + +New Features +------------ + +Project & API Documentation +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Updated ``README`` to include instructions on package installation via ``pip``. + +Web Application +~~~~~~~~~~~~~~~ + +- Updated all webpages to conform to Web Application Accessibility Guidelines. +- Upgraded to ``django`` version 2.2. +- ``bokeh`` is now imported in ``base`` template so that the version being used is consistent across all HTML templates. + +``jwql`` Repository +~~~~~~~~~~~~~~~~~~~ + +- The ``jwql`` package is now available on PyPI (https://pypi.org/project/jwql/) and installable via ``pip``. +- Updated Jenkins configuration file to include in-line comments and descriptions. +- Added ``utils`` function to validate the ``config.json`` file during import of ``jwql`` package. +- Added support for monitoring contents of the ``jwql`` central storage area in the filesystem monitor. + + +Bug Fixes +--------- + +Web Application +~~~~~~~~~~~~~~~ + +- Fixed position error of JWQL version display in footer. + +``jwql`` Repository +~~~~~~~~~~~~~~~~~~~ + +- Fixed spelling error in dark monitor database column names. +- Fixed dark monitor to avoid processing files that are not in the filesystem. + + 0.20.0 (2019-06-05) =================== diff --git a/setup.py b/setup.py index ac3dba14b..9ca1beafc 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup from setuptools import find_packages -VERSION = '0.20.0' +VERSION = '0.21.0' AUTHORS = 'Matthew Bourque, Lauren Chambers, Misty Cracraft, Joe Filippazzo, Bryan Hilbert, ' AUTHORS += 'Graham Kanarek, Catherine Martlin, Johannes Sahlmann'