132 lines
4.9 KiB
Python
132 lines
4.9 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
# -*- coding: utf-8 -*-
|
||
|
|
"""
|
||
|
|
Created on Mon Jan 5 14:05:08 2026
|
||
|
|
|
||
|
|
@author: vieweg
|
||
|
|
|
||
|
|
reads the .npy file of the merged data and plots it
|
||
|
|
"""
|
||
|
|
|
||
|
|
import numpy as np
|
||
|
|
import matplotlib.pyplot as plt
|
||
|
|
import datetime as dt
|
||
|
|
from datetime import datetime, timedelta
|
||
|
|
import matplotlib.cm as cm
|
||
|
|
from matplotlib.cm import ScalarMappable
|
||
|
|
from matplotlib.colors import BoundaryNorm
|
||
|
|
from matplotlib.colors import ListedColormap
|
||
|
|
|
||
|
|
|
||
|
|
def load_data(file):
|
||
|
|
#load merged .npy data
|
||
|
|
all_data = np.load(file, allow_pickle=True).item()
|
||
|
|
dates = np.array([datetime.fromisoformat(str(d)) for d in all_data['dates']])
|
||
|
|
distances_loaded = all_data['distance'].astype(np.float64)
|
||
|
|
position = all_data['position'].astype(np.float64)
|
||
|
|
L_value_loaded = all_data['L_value'].astype(np.float64)
|
||
|
|
energy_pro = all_data['energy_pro'].astype(np.float64)
|
||
|
|
energy_el = all_data['energy_el'].astype(np.float64)
|
||
|
|
flux_pro = all_data['mean_flux_pro'].astype(np.float64)
|
||
|
|
flux_el = all_data['mean_flux_el'].astype(np.float64)
|
||
|
|
x_loaded, y_loaded, z_loaded = position[:,0], position[:,1], position[:,2]
|
||
|
|
|
||
|
|
return dates, distances_loaded, x_loaded, y_loaded, z_loaded, L_value_loaded, energy_pro, energy_el, flux_pro, flux_el
|
||
|
|
|
||
|
|
#Plot
|
||
|
|
def plot_data(data, start, end):
|
||
|
|
(dates, distances_loaded, x_loaded, y_loaded, z_loaded, L_value_loaded, energy_pro, energy_el, flux_pro, flux_el) = data
|
||
|
|
|
||
|
|
fig3 = plt.figure(figsize = (30,15)) #width, hight
|
||
|
|
fig3.subplots_adjust(wspace = 0, hspace = 0)
|
||
|
|
gs = fig3.add_gridspec(150,211,width_ratios = [1]*205 + [1]*6,height_ratios = [1]*150)
|
||
|
|
axts = fig3.add_subplot(gs[0:50,0:205])
|
||
|
|
axbs = fig3.add_subplot(gs[50:100,0:205], sharex = axts) # this axis shares the x axis with axds, often helpful as e.g. xlim on one panels auto adjusts the other
|
||
|
|
axds = fig3.add_subplot(gs [100:150,0:205], sharex = axts)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
axts.set_ylabel(r"$J_\text{p}$ / $(\mathrm{cm²\,s\,sr\,keV})⁻¹$", fontsize = 24)
|
||
|
|
axts.set_yscale("log")
|
||
|
|
axts.set_xlim(start, end)
|
||
|
|
#axts.set_ylim(1e-2, 1e6)
|
||
|
|
axts.tick_params(axis = 'x', bottom=True, top = True, direction='in', labelsize = 20)
|
||
|
|
axts.tick_params(axis = 'y', labelsize = 13)
|
||
|
|
axts.tick_params(labelbottom = False)
|
||
|
|
|
||
|
|
axbs.set_ylabel(r"$J_\text{e}$ / $(\mathrm{cm²\,s\,sr\,keV})⁻¹$", fontsize = 24)
|
||
|
|
axbs.set_yscale("log")
|
||
|
|
axbs.set_xlim(start, end)
|
||
|
|
|
||
|
|
axbs.tick_params(axis = 'x', bottom=True, top = True, direction = 'in', labelsize = 20)
|
||
|
|
axbs.tick_params(axis = 'y', labelsize = 13)
|
||
|
|
axbs.tick_params(labelbottom = False)
|
||
|
|
|
||
|
|
|
||
|
|
cmap = cm.jet
|
||
|
|
|
||
|
|
|
||
|
|
#HSPCT
|
||
|
|
num_chanel=len(energy_pro)
|
||
|
|
|
||
|
|
colors = cmap(np.linspace(0,1, num_chanel))
|
||
|
|
listed = ListedColormap(colors)
|
||
|
|
if num_chanel >1:
|
||
|
|
last_edge = energy_pro[-1]+(energy_pro[-1]-energy_pro[-2])
|
||
|
|
|
||
|
|
bounds = np.append(energy_pro, last_edge)
|
||
|
|
norm = BoundaryNorm(boundaries=bounds, ncolors=listed.N, extend='neither')
|
||
|
|
#legend for energy channels - no colorbar
|
||
|
|
for k in range(num_chanel):
|
||
|
|
axts.plot(dates, flux_pro[:,k], color = colors[k], label = f'{energy_pro[k]:g} keV')
|
||
|
|
sm = ScalarMappable(norm=norm, cmap=listed)
|
||
|
|
sm.set_array(None)
|
||
|
|
|
||
|
|
|
||
|
|
axts.legend(title = 'Proton Energy', fontsize = 18, title_fontsize = 20, ncol = 4)
|
||
|
|
|
||
|
|
|
||
|
|
#ESPCT - Electrons
|
||
|
|
num_chanel=len(energy_el)
|
||
|
|
colors = cmap(np.linspace(0,1, num_chanel))
|
||
|
|
listed = ListedColormap(colors)
|
||
|
|
if num_chanel >1:
|
||
|
|
last_edge = energy_el[-1]+(energy_el[-1]-energy_el[-2])
|
||
|
|
|
||
|
|
bounds = np.append(energy_el, last_edge)
|
||
|
|
norm = BoundaryNorm(boundaries=bounds, ncolors=listed.N, extend='neither')
|
||
|
|
for k in range(num_chanel):
|
||
|
|
#legend for energy channels - no colorbar
|
||
|
|
axbs.plot(dates, flux_el[:,k], color = colors[k], label = f'{energy_el[k]:g} keV')
|
||
|
|
sm = ScalarMappable(norm=norm, cmap=listed)
|
||
|
|
sm.set_array(None)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
axbs.legend(title = 'Electron Energy', fontsize = 18, title_fontsize = 20, ncol = 2)
|
||
|
|
|
||
|
|
|
||
|
|
axds.plot(dates, x_loaded, label = 'x-coordinate (GSE)')
|
||
|
|
axds.plot(dates, y_loaded, label = 'y-coordinate (GSE)')
|
||
|
|
axds.plot(dates, z_loaded, label = 'z-coordinate (GSE)')
|
||
|
|
axds.plot(dates, distances_loaded, label = 'Radial distance')
|
||
|
|
|
||
|
|
axds.legend(fontsize = 18)
|
||
|
|
axds.tick_params(axis = 'x', labelsize = 22)
|
||
|
|
|
||
|
|
axds.set_ylabel(r"Distance $\mathrm{\,/\, R_E}$", fontsize = 24)
|
||
|
|
|
||
|
|
axds.set_xlabel("Time", fontsize = 24)
|
||
|
|
axds.set_xlim(start, end)
|
||
|
|
axds.tick_params(axis = 'y', labelsize = 20)
|
||
|
|
axts.set_title('C3 RAPID Particle Flux - SC Orbit - ' + f'{start} to '+f'{end}', fontsize = 26)
|
||
|
|
|
||
|
|
#please enter a .npy file name
|
||
|
|
data = load_data('/data/hiwi2/Lisa/Cluster_Data/Data_2002/C3_merged_2002.npy')
|
||
|
|
#please enter start and end date of the wanted time interval
|
||
|
|
plot = plot_data(data, datetime(2002, 1, 1, 0, 0, 0), datetime(2002, 12, 31, 23, 59, 30))
|
||
|
|
filename = '/home/asterix/vieweg/Desktop/C3_RAPID_2002.pdf'
|
||
|
|
plt.savefig(filename)
|
||
|
|
plt.show()
|