#!/usr/bin/env python
'''Defines function for reading the MASTER catalog files.
'''
import numpy as np
from .population import Population
[docs]def master_catalog(
input_file,
mjd0 = 54952.0,
sort=True,
propagator = None,
propagator_options = {},
propagator_args = {},
):
'''Return the master catalog specified in the input file as a population instance. The catalog only contains the master sampling objects and not an actual realization of the population using the factor.
The format of the input master files is:
0. ID
1. Factor
2. Mass [kg]
3. Diameter [m]
4. m/A [kg/m2]
5. a [km]
6. e
7. i [deg]
8. RAAN [deg]
9. AoP [deg]
10. M [deg]
:param str input_file: Path to the input MASTER file.
:param bool sort: If :code:`True` sort according to diameters in descending order.
:param float mjd0: The epoch of the catalog file in Modified Julian Days.
:param PropagatorBase propagator: Propagator class pointer used for :class:`space_object.SpaceObject`.
:param dict propagator_options: Propagator initialization keyword arguments.
:return: Master catalog
:rtype: population.Population
'''
master_raw = np.genfromtxt(input_file);
i = [0,5,6,7,8,9,10]
var = ['oid', 'a', 'e', 'i', 'raan', 'aop', 'mu0']
master = Population(
fields = ['oid', 'a', 'e', 'i', 'aop', 'raan', 'mu0', 'mjd0', 'A', 'm', 'd', 'C_D', 'C_R', 'Factor', 'MASTER-ID'],
dtypes = ['int'] + ['float64']*13 + ['int'],
space_object_fields = ['A', 'm', 'd', 'C_D', 'C_R'],
state_fields = ['a', 'e', 'i', 'aop', 'raan', 'mu0'],
epoch_field = {'field': 'mjd0', 'format': 'mjd', 'scale': 'utc'},
propagator = propagator,
propagator_options = propagator_options,
propagator_args = propagator_args,
)
master.allocate(master_raw.shape[0])
for ind, key in zip(i, var):
master.data[key] = master_raw[:, ind]
master.data['a'] *= 1e3 #km to m
master.data['mjd0'] = mjd0
master.data['A'] = np.divide(master_raw[:, 2], master_raw[:, 4])
master.data['m'] = master_raw[:, 2]
master.data['d'] = master_raw[:, 3]
master.data['C_D'] = 2.3
master.data['C_R'] = 1.0
master.data['Factor'] = master_raw[:, 1]
master.data['MASTER-ID'] = master_raw[:, 0]
diams = master_raw[:, 3]
if sort:
idxs = np.argsort(diams)[::-1]
else:
idxs = np.arange(len(diams))
master.data = master.data[idxs]
return master
[docs]def master_catalog_factor(
master_base,
copy = True,
treshhold = 0.01,
seed=None,
):
'''Returns a random realization of the master population specified by the input file/population. In other words, each sampling object in the catalog is sampled a "factor" number of times with random mean anomalies to create the population.
:param str input_file: Path to the input MASTER file. Is not used if :code:`master_base` is given.
:param float mjd0: The epoch of the catalog file in Modified Julian Days. Is not used if :code:`master_base` is given.
:param population.Population master_base: A master catalog consisting only of sampling objects. This catalog will be modified and the pointer to it returned.
:param bool sort: If :code:`True` sort according to diameters in ascending order.
:param float treshhold: Diameter limit in meters below witch sampling objects are not included. Can be :code:`None` to skip filtering.
:param int seed: Random number generator seed given to :code:`numpy.random.seed` to allow for consisted generation of a random realization of the population. If seed is :code:`None` a random seed from high-entropy data is used.
:param PropagatorBase propagator: Propagator class pointer used for :class:`space_object.SpaceObject`. Is not used if :code:`master_base` is given.
:param dict propagator_options: Propagator initialization keyword arguments. Is not used if :code:`master_base` is given.
:return: Master population
:rtype: population.Population
'''
np.random.seed(seed=seed)
if copy:
master = master_base.copy()
else:
master = master_base
if treshhold is not None:
master.filter('d', lambda d: d >= treshhold)
full_objs = np.zeros((int(np.sum(np.round(master['Factor']))),master.shape[1]), dtype=np.float)
max_oid = np.max(master['oid'])
max_factor = np.floor(np.log10(np.max(master['Factor'])))
oid_extend = 10**(int(np.log10(max_oid))+max_factor+1.0)
oid_mag = 10**(int(np.log10(max_oid)))
i=0
for row in master.data:
f_int = int(np.round(row[13]))
if f_int >= 1:
ip = i+f_int
for coli, head in enumerate(master.fields):
full_objs[i:ip,coli] = row[head]
full_objs[i:ip,0] = np.array(range(i,ip), dtype=np.float)
full_objs[i:ip,6] = np.random.rand(f_int)*360.0
i=ip
master.allocate(full_objs.shape[0])
master[:,:] = full_objs
return master