Satellite Trajectories¶
This notebook tutorial shows how to retrieve or create a trajectory in a variety of methods.
- Retrieve a real trajectory through SSCWeb,
- Create a sample trajectory in GDZ spherical coordinates,
- Create a trajectory from a TLE input file,
- Read in a trajectory from a file,
- Write out a trajectory to a file.
Retrieve a real satellite trajectory through SSCWeb¶
In [1]:
Copied!
# Import function to retrieve description.
from kamodo_ccmc.flythrough import SatelliteFlythrough as SF
help(SF.SatelliteTrajectory)
# Import function to retrieve description.
from kamodo_ccmc.flythrough import SatelliteFlythrough as SF
help(SF.SatelliteTrajectory)
Help on function SatelliteTrajectory in module kamodo_ccmc.flythrough.SatelliteFlythrough: SatelliteTrajectory(dataset, start_ts, stop_ts, coord_type='GEO', verbose=False) Retrieve and return satellite trajectory from HAPI/CDAWeb Parameters: ---------- dataset: name of the satellite data set to pull trajectory from start_ts: utc timestamp for start of desired time interval stop_ts: utc timestamp for end of desired time interval coord_type: Pick from GEO, GSM, GSE, or SM verbose: Set to true to be overwhelmed with information. Coordinates are retrieved on a cartesian grid. See kamodo_ccmc.flythrough.utils.ConvertCoord for info on the coordinate systems.
C:\Users\rringuet\Anaconda3\envs\Kamodo_Jan2023\lib\site-packages\spacepy\time.py:2367: UserWarning: Leapseconds may be out of date. Use spacepy.toolbox.update(leapsecs=True) warnings.warn('Leapseconds may be out of date.'
In [2]:
Copied!
# Retrieve a real satellite trajectory.
# Typical coordinates possible through SSCWeb are GEO, GSE, SM, and GSM (all cartesian and in R_E).
from datetime import datetime, timezone
start = datetime(2015, 3, 18, 6, 26, 40).replace(tzinfo=timezone.utc)
end = datetime(2015, 3, 18, 12, 11, 40).replace(tzinfo=timezone.utc)
traj_dict, coord_type = SF.SatelliteTrajectory('grace1', start.timestamp(), end.timestamp(), coord_type='GEO')
# Show the structure of the returned dictionary and range of each coordinate.
print(traj_dict.keys(), coord_type)
for key in traj_dict.keys():
print(type(traj_dict[key]), traj_dict[key].shape, traj_dict[key].min(), traj_dict[key].max())
# Retrieve a real satellite trajectory.
# Typical coordinates possible through SSCWeb are GEO, GSE, SM, and GSM (all cartesian and in R_E).
from datetime import datetime, timezone
start = datetime(2015, 3, 18, 6, 26, 40).replace(tzinfo=timezone.utc)
end = datetime(2015, 3, 18, 12, 11, 40).replace(tzinfo=timezone.utc)
traj_dict, coord_type = SF.SatelliteTrajectory('grace1', start.timestamp(), end.timestamp(), coord_type='GEO')
# Show the structure of the returned dictionary and range of each coordinate.
print(traj_dict.keys(), coord_type)
for key in traj_dict.keys():
print(type(traj_dict[key]), traj_dict[key].shape, traj_dict[key].min(), traj_dict[key].max())
Attribute/Key names of return dictionary: dict_keys(['sat_time', 'c1', 'c2', 'c3']) dict_keys(['sat_time', 'c1', 'c2', 'c3']) GEO-car <class 'numpy.ndarray'> (345,) 1426660020.0 1426680660.0 <class 'numpy.ndarray'> (345,) -0.9270195119 1.0114874276 <class 'numpy.ndarray'> (345,) -1.0605838293 1.0499913722 <class 'numpy.ndarray'> (345,) -1.0639983632 1.0598825872
Create a sample trajectory¶
In [3]:
Copied!
# Another way to get a trajectory is via the SampleTrajectory flythrough function
help(SF.SampleTrajectory)
# Another way to get a trajectory is via the SampleTrajectory flythrough function
help(SF.SampleTrajectory)
Help on function SampleTrajectory in module kamodo_ccmc.flythrough.SatelliteFlythrough: SampleTrajectory(start_time, stop_time, max_lat=65.0, min_lat=-65.0, lon_perorbit=363.0, max_height=450.0, min_height=400.0, p=0.01, n=2.0) Given start and stop times in timestamp form, return a test satellite trajectory. Parameters: ---------- start_time: utc timestamp in seconds for start stop_time: utc timestamp in seconds for stop max_lat: maximum latitude for sample trajectory, in degrees (default=65.) min_lat: minimum latitude for sample trajectory, in degrees (default=-65.) lon_perorbit: the degrees of longitude per about 90 minute orbit (set less than 360 for precession forward in longitude, set less than 360 for precession backwards) (default=363.) max_height: maximum starting height of orbit in km (default=450.) min_height: minimum starting height of orbit in km (default=400.) p: a rough precession variable, applied as an overall height decrease as a percentage of the min_height value: p = (default=0.01). n: the time cadence of the sample trajectory generated (default = 2 seconds) Returns a dictionary with keys: sat_time, c1, c2, and c3. sat_time is an array in UTC seconds since 1970-01-01. (c1,c2,c3) = (lon, lat, alt) in (deg,deg,km) in the 'GDZ', 'sph' coordinate system in SpacePy. See kamodo_ccmc.flythrough.utils.ConvertCoord for more info on the coordinate systems.
In [4]:
Copied!
# Create a sample trajectory.
sample_traj, sample_coord = SF.SampleTrajectory(start.timestamp(), end.timestamp(), max_height=550.,
min_height=525., p=0.05, n=30.)
# Show the structure of the returned dictionary and range of each coordinate.
print(sample_traj.keys(), sample_coord)
for key in sample_traj.keys():
print(type(sample_traj[key]), sample_traj[key].shape, sample_traj[key].min(), sample_traj[key].max())
# Create a sample trajectory.
sample_traj, sample_coord = SF.SampleTrajectory(start.timestamp(), end.timestamp(), max_height=550.,
min_height=525., p=0.05, n=30.)
# Show the structure of the returned dictionary and range of each coordinate.
print(sample_traj.keys(), sample_coord)
for key in sample_traj.keys():
print(type(sample_traj[key]), sample_traj[key].shape, sample_traj[key].min(), sample_traj[key].max())
Attribute/Key names of return dictionary: dict_keys(['sat_time', 'c1', 'c2', 'c3']) (c1,c2,c3) = (lon, lat, alt) in (deg,deg,km) in the GDZ, sph coordinate system. sat_time contains the utc timestamps. dict_keys(['sat_time', 'c1', 'c2', 'c3']) GDZ-sph <class 'numpy.ndarray'> (690,) 1426660000.0 1426680700.0 <class 'numpy.ndarray'> (690,) -180.0 179.48766328011612 <class 'numpy.ndarray'> (690,) -64.98998926658311 65.0 <class 'numpy.ndarray'> (690,) 499.26537612988614 548.3416630573417
Create a trajectory from TLEs (two-line elements)¶
In [5]:
Copied!
# TLE files can be obtained from celes-track.org and similar sites.
help(SF.TLETrajectory)
# TLE files can be obtained from celes-track.org and similar sites.
help(SF.TLETrajectory)
Help on function TLETrajectory in module kamodo_ccmc.flythrough.SatelliteFlythrough: TLETrajectory(tle_file, start_utcts, stop_utcts, time_cadence, method='forward', verbose=False) Use sgp4 to calculate a satellite trajectory given TLEs. Parameters: tle_file: The file name, including complete file path, of a file containing two-line elements. It is assumed that the file has no header and no other content. start_utcts: The UTC timestamp corresponding to the desired start time. Should be an integer. stop_utcts: The UTC timestamp corresponding to the desired stop time. Should be an integer. time_cadence: The number of seconds desired between trajectory positions. Should be an integer. method: 'forward' or 'nearest'. This keyword changes the propagation method for timestamps between TLEs, not for timestamps before the first TLE or after the last TLE. The 'forward' (default) method uses the previous TLE to propagate forward for all timestamps between the selected TLE and the next one, while the 'nearest' method finds the TLE nearest to the timestamp and propagates either forward or backward for the timestamp. If the time cadence does not evenly divide into the range of timestamps given, then the ending time value will be extended so that the entire requested range will be covered. Returns a dictionary with keys: sat_time, c1, c2, and c3. sat_time is an array in UTC seconds since 1970-01-01. (c1,c2,c3) = (x, y, z) in (km,km,km) in the 'teme', 'car' coordinate system in AstroPy. See kamodo_ccmc.flythrough.utils.ConvertCoord for more info on the coordinate systems.
In [8]:
Copied!
# How to get a trajectory from TLEs
tle_file = './Files/GRACE1_TLEs.txt'
time_cadence = 60. # seconds between propagated trajectory positions
start_utcts = datetime(2015, 3, 18, 0, 20).replace(tzinfo=timezone.utc).timestamp()
end_utcts = datetime(2015, 3, 21, 0, 0).replace(tzinfo=timezone.utc).timestamp()
tle_dict, coord_type = SF.TLETrajectory(tle_file, start_utcts, end_utcts, time_cadence)
# Show the structure of the returned dictionary and range of each coordinate.
print(tle_dict.keys(), coord_type)
for key in tle_dict.keys():
print(type(tle_dict[key]), tle_dict[key].shape, tle_dict[key].min(), tle_dict[key].max())
# How to get a trajectory from TLEs
tle_file = './Files/GRACE1_TLEs.txt'
time_cadence = 60. # seconds between propagated trajectory positions
start_utcts = datetime(2015, 3, 18, 0, 20).replace(tzinfo=timezone.utc).timestamp()
end_utcts = datetime(2015, 3, 21, 0, 0).replace(tzinfo=timezone.utc).timestamp()
tle_dict, coord_type = SF.TLETrajectory(tle_file, start_utcts, end_utcts, time_cadence)
# Show the structure of the returned dictionary and range of each coordinate.
print(tle_dict.keys(), coord_type)
for key in tle_dict.keys():
print(type(tle_dict[key]), tle_dict[key].shape, tle_dict[key].min(), tle_dict[key].max())
dict_keys(['sat_time', 'c1', 'c2', 'c3']) teme-car <class 'numpy.ndarray'> (4301,) 1426638000.0 1426896000.0 <class 'numpy.ndarray'> (4301,) -0.210969381482701 0.21127247435341875 <class 'numpy.ndarray'> (4301,) -1.042345933737127 1.0437405655036243 <class 'numpy.ndarray'> (4301,) -1.0641529578213578 1.0598925509819095
Load a trajectory from a file¶
In [9]:
Copied!
help(SF.O.SF_read)
help(SF.O.SF_read)
Help on function SF_read in module kamodo_ccmc.flythrough.SF_output: SF_read(filename) Collect input function calls into one function. filename = string with complete filepath. The file extension must be one of 'nc'for a netCDF4 file, 'csv' for a comma separated file, or 'txt' for a tab separated file. Output: a nested dictionary containing the metadata, data, and units.
In [10]:
Copied!
file_data = SF.O.SF_read('./Files/RealFlightExample_GITM.txt')
coord_sys = file_data['metadata']['coord_type'] + '-' + file_data['metadata']['coord_grid']
# Show the structure of the returned dictionary.
print(file_data.keys(), coord_sys)
for key in file_data.keys():
print(file_data[key].keys())
file_data = SF.O.SF_read('./Files/RealFlightExample_GITM.txt')
coord_sys = file_data['metadata']['coord_type'] + '-' + file_data['metadata']['coord_grid']
# Show the structure of the returned dictionary.
print(file_data.keys(), coord_sys)
for key in file_data.keys():
print(file_data[key].keys())
dict_keys(['utc_time', 'c1', 'c2', 'c3', 'net_idx', 'rho_n', 'T_e', 'T_i', 'metadata']) GEO-car dict_keys(['units', 'data']) dict_keys(['units', 'data']) dict_keys(['units', 'data']) dict_keys(['units', 'data']) dict_keys(['units', 'data']) dict_keys(['units', 'data']) dict_keys(['units', 'data']) dict_keys(['units', 'data']) dict_keys(['model_files', 'model_used', 'coord_type', 'coord_grid'])
Write a trajectory to a file¶
In [11]:
Copied!
help(SF.O.SF_write)
help(SF.O.SF_write)
Help on function SF_write in module kamodo_ccmc.flythrough.SF_output: SF_write(filename, model_filename, model_name, results_dict, results_units, coord_sys) Collect output function calls into one function. Inputs: filename = string with complete filepath. The file extension must be one of 'nc' for a netCDF4 file, 'csv' for a comma separated file, or 'txt' for a tab separated file. model_filename = A list of the model data filenames or prefixes used to generate the data. Filenames should include the full file path. model_name = A string indicating the model name. results_dict = A dictionary with variable names as keys (strings) and the time series data as the values (one array per key). results_units = A dictionary with variable names as keys (strings) and the units as the values (one value per key). coord_sys = one of 'GDZ', 'GEO', 'GSM', 'GSE', 'SM', 'GEI', 'MAG', 'SPH', or 'RLL' combined with '-sph' or '-car'. E.g. 'SM-car' or 'GDZ-sph'. Astropy coordinate systems supported. See ConvertCoord for details.
In [12]:
Copied!
# Write grace1 TLE trajectory to a new file.
tle_units = {'sat_time': 's', 'c1': 'R_E', 'c2': 'R_E', 'c3': 'R_E'}
SF.O.SF_write('./Files/GRACE1_TLEs.csv', '', '', tle_dict, tle_units, 'teme-car')
# Write grace1 TLE trajectory to a new file.
tle_units = {'sat_time': 's', 'c1': 'R_E', 'c2': 'R_E', 'c3': 'R_E'}
SF.O.SF_write('./Files/GRACE1_TLEs.csv', '', '', tle_dict, tle_units, 'teme-car')
Out[12]:
'./Files/GRACE1_TLEs.csv'