data_read.py 2.18 KiB
import numpy as np
import astropy.constants as c
class PSPStatData:
def __init__(self, filename, sim_data):
raw_data = np.loadtxt(filename, skiprows=1)
# Correct for maximum distance of simulation data
co_index = np.where(raw_data[:, 0] >= sim_data.dist[-1])[0][0]
raw_data = raw_data[:co_index]
# Positional data
self.dist = raw_data[:, 0]
# Create sub-classes which contain necessary stat data
self.vr = StatDataSplit(raw_data, 1)
self.np = StatDataSplit(raw_data, 6)
self.T = StatDataSplit(raw_data, 11)
class StatDataSplit:
"""DOC"""
def __init__(self, raw_data_array, first_index):
self.mean = raw_data_array[:, first_index]
self.stddev = raw_data_array[:, first_index + 1]
self.median = raw_data_array[:, first_index + 2]
self.q1 = raw_data_array[:, first_index + 3]
self.q3 = raw_data_array[:, first_index + 4]
class SimMeshData:
def __init__(self, filename):
# Get first valid index
index = skip_nan_simdata(filename)
# Handle simulation mesh data (skip rows integer is 1 more than index)
raw_data = np.loadtxt(filename, skiprows=index + 1, delimiter=",")
# Find out if any other indices correspond to nan-values in
# distance and remove them
more_nan = np.where(np.isnan(raw_data[:, 8]))[0]
raw_data = np.delete(raw_data, more_nan, axis=0)
# Assign necessary values
self.dist = raw_data[:, 8] / c.R_sun.value
self.vr = cart_to_rad_vel(raw_data) * 1e-3
self.np = simrho_to_rho(raw_data)
self.T = 10 ** raw_data[:, 3]
def skip_nan_simdata(filename):
"""DOC"""
# First always skipped because of header
raw_data = np.loadtxt(filename, skiprows=1, delimiter=",")
# Find first valid primary index
first_value = 0
while True:
if np.isnan(raw_data[first_value][0]):
first_value += 1
else:
return first_value
def cart_to_rad_vel(raw_data):
"""DOCSTRING"""
vx = raw_data[:, 12]
vy = raw_data[:, 13]
vz = raw_data[:, 14]
theta = raw_data[:, 9]
phi = raw_data[:, 10]
vr = vx * np.sin(theta) * np.cos(phi) + \
vy * np.sin(theta) * np.sin(phi) + \
vz * np.cos(theta)
return vr
def simrho_to_rho(raw_data):
"""DOCSTRING"""
lrho = raw_data[:, 6]
rho = 10 ** lrho / c.m_p.value * 1e-6
return rho