CLUSTER_Python_Programme/Bachelorthesis/PARTICLE_FLUX_ORBIT.py
lisa c54d1b4b80 PARTICLE_FLUX_ORBIT.py
This code generates a plot of electron flux, ion flux, trajectory, and radial distance from Earth for ONE spacecraft over a specified time interval. To do this, it reads in an .npy file and accepts the desired time interval as input.
2026-06-04 16:17:36 +02:00

132 lines
No EOL
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()