Skip to content
Snippets Groups Projects
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