103 lines
3.1 KiB
Python
Executable File
103 lines
3.1 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
|
|
|
|
SHOW_DEPLOYMENTS = True
|
|
FILTER_DEPLOYMENTS = True
|
|
|
|
plt.rcParams["figure.autolayout"] = True
|
|
|
|
data_frame = pd.read_csv("data.csv", delimiter=';')
|
|
|
|
# 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), rotation=45)
|
|
|
|
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), rotation=45)
|
|
|
|
plt.axhline(y=-223, color='darkblue', linestyle=':', label='Operating temperature')
|
|
|
|
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")
|
|
plt.show()
|