144 lines
4.6 KiB
Python
Executable File
144 lines
4.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import datetime
|
|
|
|
import pandas as pd
|
|
from matplotlib import pyplot as plt
|
|
import matplotlib.dates as md
|
|
from screeninfo import get_monitors
|
|
from screeninfo.common import ScreenInfoError
|
|
|
|
SHOW_DEPLOYMENTS = True
|
|
FILTER_DEPLOYMENTS = True
|
|
|
|
plt.rcParams["figure.autolayout"] = True
|
|
plt.rcParams['figure.figsize'] = (16, 10)
|
|
|
|
data_frame = pd.read_csv("data.csv", delimiter=';')
|
|
|
|
# Filter rows, so that only the following will be kept:
|
|
# First and last rows,
|
|
# rows which have a different temperature than the one before,
|
|
# and rows which have a different temperature than the one after.
|
|
#
|
|
# Basically: If the temperatures don't change for a few rows, keep only the first
|
|
# and last of that run
|
|
last_row = None
|
|
timestamps_to_keep = []
|
|
for row in data_frame.iterrows():
|
|
# row is actually a tuple with index at 0 and the row data at 1. We care only about the row data
|
|
row = row[1]
|
|
# First row: Always keep it
|
|
if last_row is None:
|
|
last_row = row
|
|
timestamps_to_keep.append(row['timestamp'])
|
|
continue
|
|
# Any temp changed?
|
|
keep_row = (last_row['tempWarmSide1C'] != row['tempWarmSide1C'] or
|
|
last_row['tempWarmSide2C'] != row['tempWarmSide2C'] or
|
|
last_row['tempCoolSide1C'] != row['tempCoolSide1C'] or
|
|
last_row['tempCoolSide2C'] != row['tempCoolSide2C'])
|
|
# Keep this and the previous row
|
|
if keep_row:
|
|
timestamps_to_keep.append(last_row['timestamp'])
|
|
timestamps_to_keep.append(row['timestamp'])
|
|
last_row = row
|
|
# Always keep the last row
|
|
timestamps_to_keep.append(data_frame.iloc[-1:]['timestamp'])
|
|
# Filter rows by the timestamps we just saved
|
|
data_frame = data_frame[data_frame.timestamp.isin(timestamps_to_keep)]
|
|
|
|
# Subplot, to move legend next to plot
|
|
# 1 row, 1 col, index: 1
|
|
plt.subplot(1, 1, 1)
|
|
|
|
# Rotate long date text
|
|
plt.xticks(rotation=25)
|
|
|
|
|
|
# pyplot doesn't like timestamps
|
|
# convert them to "date-numbers" and format
|
|
datenums = md.date2num([datetime.datetime.fromtimestamp(ts) for ts in data_frame.timestamp])
|
|
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
|
|
ax = plt.gca()
|
|
ax.xaxis.set_major_formatter(xfmt)
|
|
ax.set_ylabel('Temperature [°C]')
|
|
|
|
# Data
|
|
plt.plot(datenums, data_frame.tempWarmSide1C, label='Warm 1', color='orange', marker='x')
|
|
for i, j in zip(datenums, data_frame.tempWarmSide1C):
|
|
ax.annotate(str(round(j, 2)), xy=(i, j), rotation=45)
|
|
|
|
plt.plot(datenums, data_frame.tempWarmSide2C, label='Warm 2', color='orangered', marker='x')
|
|
for i, j in zip(datenums, data_frame.tempWarmSide2C):
|
|
ax.annotate(str(round(j, 2)), xy=(i, j-30), rotation=300)
|
|
|
|
plt.plot(datenums, data_frame.tempCoolSide1C, label='Cool 1', color='blue', marker='x')
|
|
for i, j in zip(datenums, data_frame.tempCoolSide1C):
|
|
ax.annotate(str(round(j, 2)), xy=(i, j), rotation=45)
|
|
|
|
plt.plot(datenums, data_frame.tempCoolSide2C, label='Cool 2', color='navy', marker='x')
|
|
for i, j in zip(datenums, data_frame.tempCoolSide2C):
|
|
ax.annotate(str(round(j, 2)), xy=(i, j-30), rotation=300)
|
|
|
|
plt.axhline(y=-223, color='darkblue', linestyle=':', label='Operating temperature')
|
|
plt.ylim(ymin=-273.15)
|
|
|
|
launch_date = datetime.datetime.fromisoformat('2021-12-25T12:20+00:00')
|
|
deployment_names = [
|
|
'Sunshield Pallet',
|
|
'DTA Deployment',
|
|
'Sunshield Covers Release',
|
|
'Sunshield Mid-Boom',
|
|
'Sunshield Layer Tensioning Ongoing',
|
|
'Sunshield Tensioning Complete',
|
|
'Secondary Mirror Deployment',
|
|
'Aft Deployed Instrument Radiator',
|
|
'Port Primary Mirror Wing',
|
|
'WEBB IS FULLY DEPLOYED!',
|
|
'Individual Mirror Segment Movements',
|
|
'L2 Insertion Burn',
|
|
'WEBB IS ORBITING L2'
|
|
]
|
|
|
|
# deployment dates, based on "+ X days"
|
|
deployment_dates = [md.date2num(launch_date + datetime.timedelta(days=x)) for x in [
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
26,
|
|
29.5]
|
|
]
|
|
|
|
latest_available_temp_date = max(datenums)
|
|
earliest_available_temp_date = min(datenums)
|
|
|
|
deployments_data = zip(deployment_names, deployment_dates)
|
|
filtered_deployments_data = (filter(lambda tup:
|
|
tup[1] >= earliest_available_temp_date and
|
|
tup[1] <= latest_available_temp_date, deployments_data)
|
|
if FILTER_DEPLOYMENTS else deployments_data)
|
|
|
|
max_temp = max(max(data_frame.tempWarmSide1C), max(data_frame.tempWarmSide2C))
|
|
|
|
if SHOW_DEPLOYMENTS:
|
|
for label, date in filtered_deployments_data:
|
|
plt.axvline(x=date, color='gray', linestyle=':')
|
|
plt.text(x=date, y=max_temp+30, s=label, rotation=25)
|
|
|
|
plt.legend(bbox_to_anchor=(1, 1), loc="upper left")
|
|
|
|
try:
|
|
get_monitors()
|
|
plt.show()
|
|
except ScreenInfoError:
|
|
plt.savefig("jwst_tempertature.png", dpi=300)
|