diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9a3637a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +docs/** linguist-vendored +forecasts/** linguist-vendored +trajectories/** linguist-vendored +balloon_data/** linguist-vendored diff --git a/.gitignore b/.gitignore index a81c8ee..5c70291 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +<<<<<<< HEAD # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -136,3 +137,7 @@ dmypy.json # Cython debug symbols cython_debug/ +======= +# Ignore node_modules folder +__pycache__ +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 diff --git a/Changelog b/Changelog new file mode 100644 index 0000000..58eb4a0 --- /dev/null +++ b/Changelog @@ -0,0 +1,16 @@ +version 1.1.0 +=============================== +* Added ERA5 reanalysis functionality +* Added Documentation in readthedocs format +* Updated the netcdf lookup scheme in GFS to be significantly faster +* Added checks to see if simulation will go out of bounds or over time +* Configuration file reorganization and update + + +version 1.0.1 +=============================== +* Added predict.py and rainbow trajectory prediction for multiple float altitudes + +version 1.0.0 +=============================== +* The original EarthSHAB software diff --git a/ERA5.py b/ERA5.py new file mode 100644 index 0000000..4252af8 --- /dev/null +++ b/ERA5.py @@ -0,0 +1,514 @@ +""" +This version was edited to integrate with EarthSHAB. + +Contributing authors: Craig Motell and Michael Rodriguez of NIWC Pacific +Edited and integrated: Tristan Schuler +""" +import logging +import numpy as np +import netCDF4 +from termcolor import colored +import math +from geographiclib.geodesic import Geodesic +import sys +import os +from scipy import interpolate +from pytz import timezone +from datetime import datetime, timedelta + +import config_earth #integrate with EARTHSHAB + +class ERA5: + #def __init__(self, start_coord, end_coord, input_file, dt_sec, sim_time_hours, use_time): + def __init__(self, start_coord): #CHANGED INPUT VARIABLES + """Create a class object containing information about an ERA5. Along the way, + it checks whether it can take a subset of your model data. For example, if you have + data before or after your simulation times, you can ignore these data through saving + indexes. + + :param start_coord: starting coordinate of balloon for simulation + :type coord: dict + + .. note:: Similar to class GFS which stores NOAA GFS data from NOMAD server + + .. seealso:: GFS + + """ + + self.dt = config_earth.simulation['dt'] + self.sim_time = config_earth.simulation['sim_time'] + + try: + self.file = netCDF4.Dataset("forecasts/" + config_earth.netcdf_era5["filename"]) # Only accepting manual uploads for now + + except: + print(colored((f'Unable to locate netcdf file'),"red")) + sys.exit(1) + + self.geod = Geodesic.WGS84 + self.resolution_hr = config_earth.netcdf_era5['resolution_hr'] + self.start_coord = config_earth.simulation["start_coord"] + + self.init_with_time() + + #def init_without_time(self, start_coord, end_coord, dt_sec, sim_time_hours): # modded the number of varibales for troubleshootin + def init_with_time(self): + + ''' adds to class object containing information about an ERA5 but without any time + variables. + + Returns + ------- + ERA5 : ERA5 Class Object + Initialize class object with our NetCDF data. + + Notes + ----- + Similar to class GFS which stores NOAA GFS data from NOMAD server + + See Also + -------- + + ''' + + self.start_time = config_earth.simulation['start_time'] + self.min_alt_m = self.start_coord['alt'] + + time_arr = self.file.variables['time'] + #Convert from epoch to human readable time. Different than GFS for now. + self.time_convert = netCDF4.num2date(time_arr[:], time_arr.units, time_arr.calendar) + self.model_start_datetime = self.time_convert[0] #reanalysis should be same time as gfs predictions for now + self.model_end_datetime = self.time_convert[-1] + + # Determine Index values from netcdf4 subset + netcdf_ranges = self.file.variables['u'][0, 0, :, :] + self.determineRanges(netcdf_ranges) + + # smaller array of downloaded forecast subset + self.lat = self.file.variables['latitude'][self.lat_max_idx:self.lat_min_idx] + self.lon = self.file.variables['longitude'][self.lon_min_idx:self.lon_max_idx] + + # min/max lat/lon degree values from netcdf4 subset + self.LAT_LOW = self.file.variables['latitude'][self.lat_min_idx-1] + self.LON_LOW = self.file.variables['longitude'][self.lon_min_idx] + self.LAT_HIGH = self.file.variables['latitude'][self.lat_max_idx] + self.LON_HIGH = self.file.variables['longitude'][self.lon_max_idx-1] + + print("LAT RANGE: min:" + str(self.file.variables['latitude'][self.lat_min_idx-1]), " max: " + str(self.file.variables['latitude'][self.lat_max_idx]) + " size: " + str(self.lat_min_idx-self.lat_max_idx)) + print("LON RANGE: min:" + str(self.file.variables['longitude'][self.lon_min_idx]), " max: " + str(self.file.variables['longitude'][self.lon_max_idx-1]) + " size: " + str(self.lon_max_idx-self.lon_min_idx)) + + # Import the netcdf4 subset to speed up table lookup in this script + g = 9.80665 # gravitation constant used to convert geopotential height to height + + self.levels = self.file.variables['level'][:] + #these are typos, fix later. Should be ugrdprs0 + self.ugdrps0 = self.file.variables['u'][self.start_time_idx:self.end_time_idx+1, :, self.lat_max_idx:self.lat_min_idx, self.lon_min_idx:self.lon_max_idx] + self.vgdrps0 = self.file.variables['v'][self.start_time_idx:self.end_time_idx+1, :, self.lat_max_idx:self.lat_min_idx, self.lon_min_idx:self.lon_max_idx] + self.hgtprs = self.file.variables['z'][self.start_time_idx:self.end_time_idx+1, :, self.lat_max_idx:self.lat_min_idx, self.lon_min_idx:self.lon_max_idx] / g #what is this divide by g??? + + print() + + #Check if number of hours will fit in simulation time + desired_simulation_end_time = self.start_time + timedelta(hours=self.sim_time) + diff_time = (self.time_convert[self.end_time_idx] - self.start_time).total_seconds() #total number of seconds between 2 timestamps + + print("Sim start time: ", self.start_time) + print("NetCDF end time:", self.time_convert[self.end_time_idx]) + print("Max sim runtime:", diff_time//3600, "hours") + print("Des sim runtime:", self.sim_time, "hours") + print() + + if not desired_simulation_end_time <= self.time_convert[self.end_time_idx]: + print(colored("Desired simulation run time of " + str(self.sim_time) + + " hours is out of bounds of downloaded forecast. " + + "Check simulation start time and/or download a new forecast.", "red")) + sys.exit() + + def determineRanges(self, netcdf_ranges): + """ + Determine the dimensions of actual data. If you have columns or rows with missing data + as indicated by NaN, then this function will return your actual shape size so you can + resize your data being used. + + """ + + results = np.all(~netcdf_ranges.mask) + print(results) + if results == False: + timerange, latrange, lonrange = np.nonzero(~netcdf_ranges.mask) + + self.start_time_idx = timerange.min() + self.end_time_idx = timerange.max() + self.lat_min_idx = latrange.min() #Min/Max are switched compared to with ERA5 + self.lat_max_idx = latrange.max() + self.lon_min_idx = lonrange.min() + self.lon_max_idx = lonrange.max() + else: #This might be broken for time + self.start_time_idx = 0 + self.end_time_idx = len(self.time_convert)-1 + lati, loni = netcdf_ranges.shape + #THese are backwards??? + self.lat_min_idx = lati + self.lat_max_idx = 0 + self.lon_max_idx = loni + self.lon_min_idx = 0 + + def closestIdx(self, arr, k): + """ Given an ordered array and a value, determines the index of the closest item contained in the array. + + """ + return min(range(len(arr)), key=lambda i: abs(arr[i] - k)) + + def getNearestLatIdx(self, lat, min, max): + """ Determines the nearest latitude index (to .25 degrees), which will be integer index starting at 0 where you data is starting + + """ + # arr = np.arange(start=min, stop=max, step=self.res) + # i = self.closest(arr, lat) + i = self.closestIdx(self.lat, lat) + return i + + def getNearestLonIdx(self, lon, min, max): + """ Determines the nearest longitude (to .25 degrees) + + """ + + # lon = lon % 360 #convert from -180-180 to 0-360 + # arr = np.arange(start=min, stop=max, step=self.res) + i = self.closestIdx(self.lon, lon) + return i + + def get2NearestAltIdxs(self, h, alt_m): + """ Determines 2 nearest indexes for altitude for interpolating angles. + It does index wrap from 0 to -1, which is taken care of in `ERA5.interpolateBearing()` + + """ + h_nearest = self.closestIdx(h, alt_m) + + if alt_m > h[h_nearest]: + h_idx0 = h_nearest + h_idx1 = h_nearest +1 + else: + h_idx0 = h_nearest - 1 + h_idx1 = h_nearest + + return h_idx0, h_idx1 + + def getNearestAltbyIndex(self, int_hr_idx, lat_i, lon_i, alt_m): + """ Determines the nearest altitude based off of geo potential height of a .25 degree lat/lon area. + at a given latitude, longitude index + + """ + + i = self.closestIdx(self.hgtprs[int_hr_idx, :, lat_i, lon_i], alt_m) + + return i + + def wind_alt_Interpolate(self, alt_m, diff_time, lat_idx, lon_idx): + """ + .. warning:: This function is no longer used. Use wind_alt_Interpolate2 which does 2 different types of interpolation to choose from. + + Performs a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest + .25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time. + + .. note:: I performed a lot of clean up of this code from what Craig originally sent me. I'm not exactly sure what + about all the difference from GFS to ERA5 for this function. I will do more cleaning and variable renaming in a later version. + The results are the same right now thoug. + + Parameters + ---------- + alt_m : float + Contains current altitude of balloon object. + diff_time: ? + This parameter is calculated in two different places, need to clean up this parameter + lon_idx : integer + Closest index into longitude array + lat_idx : integer + Closest index into latitude array + + Returns: + u : float + u component wind vector + v : float + v component wind vector + + """ + + #This function is deprecated and no longer used! + + #we need to clean this up, ends up we check for the hour_index before we call this function + #diff = coord["timestamp"] - self.model_start_datetime + hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + + hgt_m = alt_m + + # First interpolate wind speeds between 2 closest time steps to match altitude estimates (hgtprs), which can change with time + v_0 = self.vgdrps0[int(hour_index), :, lat_idx, lon_idx] # Round hour index to nearest int + v_0 = self.fill_missing_data(v_0) # Fill the missing wind data if occurs at upper heights + + u_0 = self.ugdrps0[int(hour_index), :, lat_idx, lon_idx] + u_0 = self.fill_missing_data(u_0) + + xp_0 = self.hgtprs[int(hour_index), :, lat_idx, lon_idx] + xp_0 = self.fill_missing_data(xp_0) + + f = interpolate.interp1d(xp_0, u_0, assume_sorted=False, fill_value="extrapolate") + u0_pt = f(hgt_m) + f = interpolate.interp1d(xp_0, v_0, assume_sorted=False, fill_value="extrapolate") + v0_pt = f(hgt_m) + + # Next interpolate the wind velocities with respect to time. + v_1 = self.vgdrps0[int(hour_index) + 1, :, lat_idx, lon_idx] + v_1 = self.fill_missing_data(v_1) + u_1 = self.ugdrps0[int(hour_index) + 1, :, lat_idx, lon_idx] + u_1 = self.fill_missing_data(u_1) + #t_1 = self.temp0[int_hr_idx2, :, lat_idx, lon_idx] + #t_1 = self.fill_missing_data(t_1) + xp_1 = self.hgtprs[int(hour_index) +1 , :, lat_idx, lon_idx] + xp_1 = self.fill_missing_data(xp_1) + + #t1_pt = f(hgt_m) + f = interpolate.interp1d(xp_1, u_1, assume_sorted=False, fill_value="extrapolate") + u1_pt = f(hgt_m) + f = interpolate.interp1d(xp_1, v_1, assume_sorted=False, fill_value="extrapolate") + v1_pt = f(hgt_m) + + fp = [int(hour_index), int(hour_index) + 1] + u = np.interp(hour_index, fp, [u0_pt, u1_pt]) + v = np.interp(hour_index, fp, [v0_pt, v1_pt]) + + return [u, v] + + def wind_alt_Interpolate2(self, alt_m, diff_time, lat_idx, lon_idx): + """ + Performs two different types of a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest + .25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time. + + The old method performs the linear interpolation using u-v wind Components + the new method performs the linear interpolation using wind bearing and speed. + + Both are calculated in this function. The examples use the new method (bearing and wind), which should be slightly more accurate. + + Parameters + ---------- + alt_m : float + Contains current altitude of balloon object. + diff_time: ? + This parameter is calculated in two different places, need to clean up this parameter + lon_idx : integer + Closest index into longitude array + lat_idx : integer + Closest index into latitude array + + .. note:: **TODO**: Make these variable names more descriptive. Maybe make a dictionary return value instead. + + Returns: + u_new : float + u component wind vector (bearing/speed interpolation) + v_new : float + v component wind vector (bearing/speed interpolation) + u_old : float + u component wind vector (u-v component interpolation) + v_old : float + v component wind vector (u-v component interpolation) + + """ + + hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + + # First interpolate wind speeds between 2 closest time steps to match altitude estimates (hgtprs), which can change with time + + #t0 + v_0 = self.vgdrps0[int(hour_index), :, lat_idx, lon_idx] # Round hour index to nearest int + v_0 = self.fill_missing_data(v_0) # Fill the missing wind data if occurs at upper heights + + u_0 = self.ugdrps0[int(hour_index), :, lat_idx, lon_idx] + u_0 = self.fill_missing_data(u_0) + + h0 = self.hgtprs[int(hour_index), :, lat_idx, lon_idx] + h0 = self.fill_missing_data(h0) + + u0_pt = np.interp(alt_m,h0[::-1],u_0[::-1]) #reverse order for ERA5 + v0_pt = np.interp(alt_m,h0[::-1],v_0[::-1]) #reverse order for ERA5 + + bearing_t0, speed_t0 = self.interpolateBearing(h0[::-1], u_0[::-1], v_0[::-1], alt_m) + + #t1 + + v_1 = self.vgdrps0[int(hour_index) + 1, :, lat_idx, lon_idx] + v_1 = self.fill_missing_data(v_1) + + u_1 = self.ugdrps0[int(hour_index) + 1, :, lat_idx, lon_idx] + u_1 = self.fill_missing_data(u_1) + + h1 = self.hgtprs[int(hour_index) +1 , :, lat_idx, lon_idx] + h1 = self.fill_missing_data(h1) + + u1_pt = np.interp(alt_m,h1[::-1],u_1[::-1]) + v1_pt = np.interp(alt_m,h1[::-1],v_1[::-1]) + + bearing_t1, speed_t1 = self.interpolateBearing(h1[::-1], u_1[::-1], v_1[::-1], alt_m) + + #interpolate between 2 timesteps (t0, t1) + #old Method (u-v wind components linear interpolation): + fp = [int(hour_index), int(hour_index) + 1] + u_old = np.interp(hour_index, fp, [u0_pt, u1_pt]) + v_old = np.interp(hour_index, fp, [v0_pt, v1_pt]) + + #New Method (Bearing/speed linear interpolation): + bearing_interpolated, speed_interpolated = self.interpolateBearingTime(bearing_t0, speed_t0, bearing_t1, speed_t1, hour_index ) + + u_new = speed_interpolated * np.cos(np.radians(bearing_interpolated)) + v_new = speed_interpolated * np.sin(np.radians(bearing_interpolated)) + + return [u_new, v_new, u_old, v_old] + + def fill_missing_data(self, data): + """Helper function to fill in linearly interpolate and fill in missing data + + """ + + data = data.filled(np.nan) + nans, x = np.isnan(data), lambda z: z.nonzero()[0] + data[nans] = np.interp(x(nans), x(~nans), data[~nans]) + return data + + def windVectorToBearing(self, u, v): + """Helper function to conver u-v wind components to bearing and speed. + + """ + bearing = np.arctan2(v,u) + speed = np.power((np.power(u,2)+np.power(v,2)),.5) + + return [bearing, speed] + + def interpolateBearing(self, h, u, v, alt_m ): #h, bearing0, speed0, bearing1, speed1): + """Given altitude, u_velocity and v_velocity arrays as well as a desired altitude, perform a linear interpolation + between the 2 altitudes (h0 and h1) while accounting for possible 0/360degree axis crossover. + + """ + + h_idx0, h_idx1 = self.get2NearestAltIdxs(h, alt_m) + + #Check to make sure altitude isn't outside bounds of altitude array for interpolating + if h_idx0 == -1: + h_idx0 = 0 + + if h_idx1 == 0: #this one should most likely never trigger because altitude forecasts go so high. + h_idx1 = -1 + + bearing0, speed0 = self.windVectorToBearing(u[h_idx0], v[h_idx0]) + bearing1, speed1 = self.windVectorToBearing(u[h_idx1], v[h_idx1]) + + interp_dir_deg = 0 + angle1 = np.degrees(bearing0) %360 + angle2 = np.degrees(bearing1) %360 + angular_difference = abs(angle2-angle1) + + if angular_difference > 180: + if (angle2 > angle1): + angle1 += 360 + else: + angle2 += 360 + + interp_speed = np.interp(alt_m, [h[h_idx0], h[h_idx1]], [speed0, speed1]) + interp_dir_deg = np.interp(alt_m, [h[h_idx0], h[h_idx1]], [angle1, angle2]) % 360 #make sure in the range (0, 360) + + return (interp_dir_deg, interp_speed) + + def interpolateBearingTime(self, bearing0, speed0, bearing1, speed1, hour_index ): #h, bearing0, speed0, bearing1, speed1): + """Similar to `ERA5.interpolateBearing()` however bearings and speeds are already known + and linearly then interpolated with respect to time (t0 and t1) + + """ + + interp_dir_deg = 0 + angle1 = bearing0 %360 + angle2 = bearing1 %360 + angular_difference = abs(angle2-angle1) + + if angular_difference > 180: + if (angle2 > angle1): + angle1 += 360 + else: + angle2 += 360 + + fp = [int(hour_index), int(hour_index) + 1] + interp_speed = np.interp(hour_index, fp, [speed0, speed1]) + interp_dir_deg = np.interp(hour_index, fp, [angle1, angle2]) % 360 #make sure in the range (0, 360) + + return (interp_dir_deg, interp_speed) + + def getNewCoord(self, coord, dt): + """ + Determines the new coordinates of the balloon based on the effects of U and V wind components. + + Parameters + ---------- + coord : dict + Contains current position, altitude and time of balloon object. + dt : float + Integration time + + Returns: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, closest_lat, closest_lon, closest alt + + """ + + diff_time = coord["timestamp"] - self.model_start_datetime + hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + int_hr_idx = int(hour_index) + + lat_idx = self.getNearestLatIdx(coord["lat"], self.lat_max_idx, self.lat_min_idx) + lon_idx = self.getNearestLonIdx(coord["lon"], self.lon_min_idx, self.lon_max_idx) + #z = self.getNearestAltbyIndex(lat_idx, lon_idx, coord["alt_m"]) # fix this for lower and Upper + z = self.getNearestAltbyIndex(int_hr_idx, lat_idx, lon_idx, coord["alt"]) # fix this for lower and Upper + + + #for Debugging outside try catch block below. Delete when done. + #x_wind_vel, y_wind_vel, x_wind_vel_old, y_wind_vel_old = self.wind_alt_Interpolate2(coord['alt'], diff_time, lat_idx, lon_idx) + + try: + #x_wind_vel, y_wind_vel = self.wind_alt_Interpolate(coord['alt'], diff_time, lat_idx, lon_idx) # for now hour index is 0 + #x_wind_vel_old, y_wind_vel_old = None, None + x_wind_vel, y_wind_vel, x_wind_vel_old, y_wind_vel_old = self.wind_alt_Interpolate2(coord['alt'], diff_time, lat_idx, lon_idx) + if x_wind_vel == None: + return [None, None, None, None, None, None, None, None] + except: + print(colored( + "Mismatch with simulation and forecast timstamps. Check simulation start time and/or download a new forecast.", + "red")) + sys.exit(1) + + bearing = math.degrees(math.atan2(y_wind_vel, x_wind_vel)) + bearing = 90 - bearing # perform 90 degree rotation for bearing from wind data + d = math.pow((math.pow(y_wind_vel, 2) + math.pow(x_wind_vel, 2)), .5) * dt # dt multiplier + g = self.geod.Direct(coord["lat"], coord["lon"], bearing, d) + + #GFS is %360 here. The files are organized a bit differently + if g['lat2'] < self.LAT_LOW or g['lat2'] > self.LAT_HIGH or (g['lon2']) < self.LON_LOW or (g['lon2']) > self.LON_HIGH: + print(colored("WARNING: Trajectory is out of bounds of downloaded netcdf forecast", "yellow")) + + '''Changed to alt instead of alt_m''' + if coord["alt"] <= self.min_alt_m: + # Balloon should remain stationary if it's reached the minimum altitude + return [coord['lat'], coord['lon'], x_wind_vel, y_wind_vel, x_wind_vel_old, y_wind_vel_old, bearing, self.lat[lat_idx], self.lon[lon_idx], + self.hgtprs[0, z, lat_idx, lon_idx]] # hgtprs doesn't matter here so is set to 0 + else: + return [g['lat2'], g['lon2'], x_wind_vel, y_wind_vel, x_wind_vel_old, y_wind_vel_old, bearing, self.lat[lat_idx], self.lon[lon_idx], + self.hgtprs[0, z, lat_idx, lon_idx]] + + #This function is unused now after code cleanup, but leaving for now because Craig included it with the orginal code + '''CHECK THIS''' + def datetime_epoch(self, timedate_obj): + gmt = timezone('GMT') + try: + dt = timedate_obj.strftime("%Y-%m-%d %H:%M:%S") + naive_ts = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S") + except: + naive_ts = datetime.strptime(timedate_obj, "%Y-%m-%d %H:%M:%S") + + local_ts = gmt.localize(naive_ts) + epoch_ts = local_ts.timestamp() + + return int(epoch_ts) diff --git a/GFS.py b/GFS.py index 0106b6c..46de2ae 100644 --- a/GFS.py +++ b/GFS.py @@ -1,26 +1,45 @@ +<<<<<<< HEAD +======= +""" GFS extracts meteorological data from a NOAA netcdf (.nc file) data set. To speed up predicting trajectories, +saveNETCDF.py should be run before main.py. This way, the large data set doesn't need to be redownloaded each time the trajectory is run. +For now, only wind velocity is used for the simulation prediction. Atmposheric properties such as temperarature and pressure are based off of +the U.S. Standard Atmosphere tables from 1976, and the fluids library is used for these, which can be seen in radiation3.py + +""" + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import numpy as np import netCDF4 from termcolor import colored import math from geographiclib.geodesic import Geodesic +<<<<<<< HEAD +======= +import datetime +from datetime import timedelta +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import sys from backports.datetime_fromisoformat import MonkeyPatch MonkeyPatch.patch_fromisoformat() #Hacky solution for Python 3.6 to use ISO format Strings import config_earth +<<<<<<< HEAD """ GFS.py extracts meteorological data from a NOAA netcdf (.nc file) data set. To speed up predicting trajectories, saveNETCDF.py should be run before main.py. This way, the large data set doesn't need to be redownloaded each time the trajectory is run. For now, only wind velocity is used for the simulation prediction. Atmposheric properties such as temperarature and pressure are based off of the U.S. Standard Atmosphere tables from 1976, and the fluids library is used for these, which can be seen in radiation3.py """ +======= +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 class GFS: def __init__(self, centered_coord): # import variables from configuration file self.centered_coord = centered_coord self.min_alt = config_earth.simulation['min_alt'] self.start_time = config_earth.simulation['start_time'] +<<<<<<< HEAD self.hours3 = config_earth.netcdf['hours3'] self.file = netCDF4.Dataset(config_earth.netcdf["nc_file"]) # Only accepting manual uploads for now @@ -90,11 +109,117 @@ def latlonrange(self,lla): def closest(self, arr, k): """ Given an ordered array and a value, determines the index of the closest item contained in the array. +======= + self.sim_time = config_earth.simulation['sim_time'] + #self.hours3 = config_earth.netcdf_gfs['hours3'] + + self.file = netCDF4.Dataset(config_earth.netcdf_gfs["nc_file"]) # Only accepting manual uploads for now + self.gfs_time = config_earth.netcdf_gfs['nc_start'] + self.res = config_earth.netcdf_gfs['res'] + + self.geod = Geodesic.WGS84 + + time_arr = self.file.variables['time'] + + #Manually add time units, not imported with units formatted in saveNETCDF.py + self.time_convert = netCDF4.num2date(time_arr[:], units="days since 0001-01-01", has_year_zero=True) + + + #Determine Index values from netcdf4 subset + netcdf_ranges = self.file.variables['ugrdprs'][:,0,:,:] + self.determineRanges(netcdf_ranges) + + # smaller array of downloaded forecast subset + self.lat = self.file.variables['lat'][self.lat_min_idx:self.lat_max_idx] + self.lon = self.file.variables['lon'][self.lon_min_idx:self.lon_max_idx] + + # min/max lat/lon degree values from netcdf4 subset + self.LAT_LOW = self.file.variables['lat'][self.lat_min_idx] + self.LON_LOW = self.file.variables['lon'][self.lon_min_idx] + self.LAT_HIGH = self.file.variables['lat'][self.lat_max_idx] + self.LON_HIGH = self.file.variables['lon'][self.lon_max_idx] + + print("LAT RANGE: min: " + str(self.LAT_LOW), " (deg) max: " + str(self.LAT_HIGH) + " (deg) array size: " + str(self.lat_max_idx-self.lat_min_idx+1)) + print("LON RANGE: min: " + str(self.LON_LOW), " (deg) max: " + str(self.LON_HIGH) + " (deg) array size: " + str(self.lon_max_idx-self.lon_min_idx+1)) + + # Import the netcdf4 subset to speed up table lookup in this script + self.levels = self.file.variables['lev'][:] + self.ugdrps0 = self.file.variables['ugrdprs'][self.start_time_idx:self.end_time_idx+1,:,self.lat_min_idx:self.lat_max_idx,self.lon_min_idx:self.lon_max_idx] + self.vgdrps0 = self.file.variables['vgrdprs'][self.start_time_idx:self.end_time_idx+1,:,self.lat_min_idx:self.lat_max_idx,self.lon_min_idx:self.lon_max_idx] + self.hgtprs = self.file.variables['hgtprs'][self.start_time_idx:self.end_time_idx+1,:,self.lat_min_idx:self.lat_max_idx,self.lon_min_idx:self.lon_max_idx] + + #print("Data downloaded.\n\n") + print() + + #Check if number of hours will fit in simulation time + desired_simulation_end_time = self.start_time + timedelta(hours=self.sim_time) + diff_time = (self.time_convert[self.end_time_idx] - self.start_time).total_seconds() #total number of seconds between 2 timestamps + + print("Sim start time: ", self.start_time) + print("NetCDF end time:", self.time_convert[self.end_time_idx]) + print("Max sim runtime:", diff_time//3600, "hours") + print("Des sim runtime:", self.sim_time, "hours") + print() + + if not desired_simulation_end_time <= self.time_convert[self.end_time_idx]: + print(colored("Desired simulation run time of " + str(self.sim_time) + + " hours is out of bounds of downloaded forecast. " + + "Check simulation start time and/or download a new forecast.", "red")) + sys.exit() + + + def determineRanges(self,netcdf_ranges): + """ + Determine the following variable ranges (min/max) within the netcdf file: + + -time + -lat + -lon + + .. note:: the levels variable is uncessary for knowing the ranges for, because they vary from + coordinate to coordinate, and all levels in the array are always be used. + + """ + + + print(colored("Forecast Information (Parsed from netcdf file):", "blue", attrs=['bold'])) + + results = np.all(~netcdf_ranges.mask) + #Results will almost always be false, unless an entire netcdf of the world is downloaded. Or if the netcdf is downloaded via another method with lat/lon bounds + if results == False: + timerange, latrange, lonrange = np.nonzero(~netcdf_ranges.mask) + + self.start_time_idx = timerange.min() + self.end_time_idx = timerange.max() + self.lat_min_idx = latrange.min() #Min/Max are switched compared to with ERA5 + self.lat_max_idx = latrange.max() + self.lon_min_idx = lonrange.min() + self.lon_max_idx = lonrange.max() + else: #This might be broken for time + #Need to double check this for an entire world netcdf download + ''' + self.start_time_idx = 0 + self.end_time_idx = len(self.time_convert)-1 + lati, loni = netcdf_ranges.shape + self.lat_min_idx = lati + self.lat_max_idx = 0 + self.lon_max_idx = loni + self.lon_min_idx = 0 + ''' + + def closest(self, arr, k): + """ Given an ordered array and a value, determines the index of the closest item contained in the array. + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ return min(range(len(arr)), key = lambda i: abs(arr[i]-k)) def getNearestLat(self,lat,min,max): """ Determines the nearest lattitude (to .25 degrees) +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ arr = np.arange(start=min, stop=max, step=self.res) i = self.closest(arr, lat) @@ -102,6 +227,10 @@ def getNearestLat(self,lat,min,max): def getNearestLon(self,lon,min,max): """ Determines the nearest longitude (to .25 degrees) +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ lon = lon % 360 #convert from -180-180 to 0-360 @@ -111,6 +240,10 @@ def getNearestLon(self,lon,min,max): def getNearestAlt(self,hour_index,lat,lon,alt): """ Determines the nearest altitude based off of geo potential height of a .25 degree lat/lon area. +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ lat_i = self.getNearestLat(lat,self.LAT_LOW,self.LAT_HIGH) @@ -118,6 +251,7 @@ def getNearestAlt(self,hour_index,lat,lon,alt): i = self.closest(self.hgtprs[int(hour_index),:,lat_i,lon_i], alt) return i +<<<<<<< HEAD def wind_alt_Interpolate(self, coord): """Performs a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest .25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time. @@ -125,6 +259,51 @@ def wind_alt_Interpolate(self, coord): :type coord: dict :returns: [x_wind_vel, y_wind_vel] :rtype: array +======= + def get2NearestAltIdxs(self, h, alt_m): + """ Determines 2 nearest indexes for altitude for interpolating angles. + It does index wrap from 0 to -1, which is taken care of in `ERA5.interpolateBearing()` + + """ + h_nearest = self.closest(h, alt_m) + + if alt_m > h[h_nearest]: + h_idx0 = h_nearest + h_idx1 = h_nearest +1 + else: + h_idx0 = h_nearest - 1 + h_idx1 = h_nearest + + return h_idx0, h_idx1 + + def wind_alt_Interpolate(self, coord): + """ + This function performs a 2-step linear interpolation to determine horizontal wind velocity at a + 3d desired coordinate and timestamp. + + The figure below shows a visual representation of how wind data is stored in netcdf forecasts based on + lat, lon, and geopotential height. The data forms a non-uniform grid, that also changes in time. Therefore + we performs a 2-step linear interpolation to determine horizontal wind velocity at a desired 3D coordinate + and particular timestamp. + + To start, the two nearest .25 degree lat/lon areas to the desired coordinate are looked up along with the + 2 closest timestamps t0 and t1. This produces 6 arrays: u-wind, v-wind, and geopotential heights at the lower + and upper closest timestamps (t0 and t1). + + Next, the geopotential height is converted to altitude (m) for each timestamp. For the first interpolation, + the u-v wind components at the desired altitude are determined (1a and 1b) using np.interp. + + Then, once the wind speeds at matching altitudes for t0 and t1 are detemined, a second linear interpolation + is performed with respect to time (t0 and t1). + + .. image:: ../../img/netcdf-2step-interpolation.png + + :param coord: Coordinate of balloon + :type coord: dict + :returns: [u_wind_vel, v_wind_vel] + :rtype: array + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ diff = coord["timestamp"] - self.gfs_time @@ -147,6 +326,10 @@ def wind_alt_Interpolate(self, coord): # Next interpolate the wind velocities with respect to time. v_1 = self.vgdrps0[int(hour_index)+1,:,lat_i,lon_i] v_1 = self.fill_missing_data(v_1) +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 u_1 = self.ugdrps0[int(hour_index)+1,:,lat_i,lon_i] u_1 = self.fill_missing_data(u_1) @@ -158,8 +341,137 @@ def wind_alt_Interpolate(self, coord): return[u,v] +<<<<<<< HEAD def fill_missing_data(self, data): """Helper function to fill in linearly interpolate and fill in missing data +======= + def wind_alt_Interpolate2(self, coord): + + diff = coord["timestamp"] - self.gfs_time + hour_index = (diff.days*24 + diff.seconds / 3600.)/3 + + lat_i = self.getNearestLat(coord["lat"],self.LAT_LOW,self.LAT_HIGH) + lon_i = self.getNearestLon(coord["lon"],self.LON_LOW,self.LON_HIGH) + + + z_low = self.getNearestAlt(hour_index,coord["lat"],coord["lon"],coord["alt"]) #fix this for lower and Upper + + + # First interpolate wind speeds between 2 closest time steps to match altitude estimates (hgtprs), which can change with time + #t0 + v_0 = self.vgdrps0[int(hour_index),:,lat_i,lon_i] # Round hour index to nearest int + v_0 = self.fill_missing_data(v_0) # Fill the missing wind data. With netcdf4 there are always 3 missing values at the higher elevations + + u_0 = self.ugdrps0[int(hour_index),:,lat_i,lon_i] + u_0 = self.fill_missing_data(u_0) + + h0 = self.hgtprs[int(hour_index),:,lat_i,lon_i] + h0 = self.fill_missing_data(h0) + + u0 = np.interp(coord["alt"],h0,u_0) + v0 = np.interp(coord["alt"],h0,v_0) + + bearing_t0, speed_t0 = self.interpolateBearing(h0, u_0, v_0, coord["alt"]) + + #t1 + + v_1 = self.vgdrps0[int(hour_index)+1,:,lat_i,lon_i] + v_1 = self.fill_missing_data(v_1) + + u_1 = self.ugdrps0[int(hour_index)+1,:,lat_i,lon_i] + u_1 = self.fill_missing_data(u_1) + + h1 = self.hgtprs[int(hour_index)+1,:,lat_i,lon_i] + h1 = self.fill_missing_data(h1) + + u1 = np.interp(coord["alt"],h1,u_1) # Round hour index to next timestep + v1 = np.interp(coord["alt"],h1,v_1) + + bearing_t1, speed_t1 = self.interpolateBearing(h1, u_1, v_1, coord["alt"]) + + + #Old Method + u_old = np.interp(hour_index,[int(hour_index),int(hour_index)+1],[u0,u1]) + v_old = np.interp(hour_index,[int(hour_index),int(hour_index)+1],[v0,v1]) + + #New Method (Bearing/speed linear interpolation): + bearing_interpolated, speed_interpolated = self.interpolateBearingTime(bearing_t0, speed_t0, bearing_t1, speed_t1, hour_index ) + + u_new = speed_interpolated * np.cos(np.radians(bearing_interpolated)) + v_new = speed_interpolated * np.sin(np.radians(bearing_interpolated)) + + return [u_new, v_new, u_old, v_old] + + def windVectorToBearing(self, u, v): + """Helper function to conver u-v wind components to bearing and speed. + + """ + bearing = np.arctan2(v,u) + speed = np.power((np.power(u,2)+np.power(v,2)),.5) + + return [bearing, speed] + + def interpolateBearing(self, h, u, v, alt_m ): #h, bearing0, speed0, bearing1, speed1): + """Given altitude, u_velocity and v_velocity arrays as well as a desired altitude, perform a linear interpolation + between the 2 altitudes (h0 and h1) while accounting for possible 0/360degree axis crossover. + + """ + + h_idx0, h_idx1 = self.get2NearestAltIdxs(h, alt_m) + + #Check to make sure altitude isn't outside bounds of altitude array for interpolating + if h_idx0 == -1: + h_idx0 = 0 + + if h_idx1 == 0: #this one should most likely never trigger because altitude forecasts go so high. + h_idx1 = -1 + + bearing0, speed0 = self.windVectorToBearing(u[h_idx0], v[h_idx0]) + bearing1, speed1 = self.windVectorToBearing(u[h_idx1], v[h_idx1]) + + interp_dir_deg = 0 + angle1 = np.degrees(bearing0) %360 + angle2 = np.degrees(bearing1) %360 + angular_difference = abs(angle2-angle1) + + if angular_difference > 180: + if (angle2 > angle1): + angle1 += 360 + else: + angle2 += 360 + + interp_speed = np.interp(alt_m, [h[h_idx0], h[h_idx1]], [speed0, speed1]) + interp_dir_deg = np.interp(alt_m, [h[h_idx0], h[h_idx1]], [angle1, angle2]) % 360 #make sure in the range (0, 360) + + return (interp_dir_deg, interp_speed) + + def interpolateBearingTime(self, bearing0, speed0, bearing1, speed1, hour_index ): #h, bearing0, speed0, bearing1, speed1): + """Similar to `ERA5.interpolateBearing()` however bearings and speeds are already known + and linearly then interpolated with respect to time (t0 and t1) + + """ + + interp_dir_deg = 0 + angle1 = bearing0 %360 + angle2 = bearing1 %360 + angular_difference = abs(angle2-angle1) + + if angular_difference > 180: + if (angle2 > angle1): + angle1 += 360 + else: + angle2 += 360 + + fp = [int(hour_index), int(hour_index) + 1] + interp_speed = np.interp(hour_index, fp, [speed0, speed1]) + interp_dir_deg = np.interp(hour_index, fp, [angle1, angle2]) % 360 #make sure in the range (0, 360) + + return (interp_dir_deg, interp_speed) + + def fill_missing_data(self, data): + """Helper function to fill in linearly interpolate and fill in missing data + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ data = data.filled(np.nan) @@ -173,6 +485,10 @@ def getNewCoord(self, coord, dt): :type coord: dict :returns: [lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, closest_lat, closest_lon, closest alt] :rtype: array +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ diff = coord["timestamp"] - self.gfs_time @@ -182,6 +498,7 @@ def getNewCoord(self, coord, dt): j = self.getNearestLon(coord["lon"],self.LON_LOW,self.LON_HIGH) z = self.getNearestAlt(int(hour_index),coord["lat"],coord["lon"],coord["alt"]) +<<<<<<< HEAD try: x_wind_vel,y_wind_vel = self.wind_alt_Interpolate(coord) #for now hour index is 0 except: @@ -189,13 +506,38 @@ def getNewCoord(self, coord, dt): print("GFS Forecast Start time: ", self.gfs_time) print(colored("Mismatch with simulation and forecast timstamps. Check simulation start time and/or download a new forecast.", "red")) sys.exit(1) +======= + #Get wind estimate for current coordiante + + #add some error handling here? + #old option: + #x_wind_vel,y_wind_vel = self.wind_alt_Interpolate(coord) + #x_wind_vel_old, y_wind_vel_old = None, None + + x_wind_vel,y_wind_vel, x_wind_vel_old, y_wind_vel_old = self.wind_alt_Interpolate2(coord) + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 bearing = math.degrees(math.atan2(y_wind_vel,x_wind_vel)) bearing = 90 - bearing # perform 90 degree rotation for bearing from wind data d = math.pow((math.pow(y_wind_vel,2)+math.pow(x_wind_vel,2)),.5) * dt #dt multiplier g = self.geod.Direct(coord["lat"], coord["lon"], bearing, d) +<<<<<<< HEAD if coord["alt"] <= self.min_alt: # Balloon should remain stationary if it's reached the minimum altitude return [coord['lat'],coord['lon'],x_wind_vel,y_wind_vel,bearing, self.lat[i], self.lon[j], self.hgtprs[0,z,i,j]] # hgtprs doesn't matter here so is set to 0 else: return [g['lat2'],g['lon2'],x_wind_vel,y_wind_vel,bearing, self.lat[i], self.lon[j], self.hgtprs[0,z,i,j]] +======= + if g['lat2'] < self.LAT_LOW or g['lat2'] > self.LAT_HIGH or (g['lon2'] % 360) < self.LON_LOW or (g['lon2'] % 360) > self.LON_HIGH: + print(colored("WARNING: Trajectory is out of bounds of downloaded netcdf forecast", "yellow")) + + if coord["alt"] <= self.min_alt: + # Balloon should remain stationary if it's reached the minimum altitude + return [coord['lat'],coord['lon'],x_wind_vel,y_wind_vel, x_wind_vel_old, y_wind_vel_old, bearing, self.lat[i], self.lon[j], self.hgtprs[0,z,i,j]] # hgtprs doesn't matter here so is set to 0 + else: + return [g['lat2'],g['lon2'],x_wind_vel,y_wind_vel, x_wind_vel_old, y_wind_vel_old, bearing, self.lat[i], self.lon[j], self.hgtprs[0,z,i,j]] + + if g['lat2'] < self.LAT_LOW or g['lat2'] > self.LAT_HIGH or g['lon2'] < self.LON_LOW or g['lon2'] > self.LON_HIGH: + print(colored("WARNING: Trajectory is out of bounds of downloaded netcdf forecast", "yellow")) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 diff --git a/README.md b/README.md index 83d62fd..46e46b7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ +<<<<<<< HEAD ![Version](https://warehouse-camo.ingress.cmh1.psfhosted.org/233dfe54c23e0214e7101212ee41d8538f5b4884/68747470733a2f2f696d672e736869656c64732e696f2f707970692f707976657273696f6e732f646a616e676f2e737667) +======= +[![Python 3.9](https://img.shields.io/badge/python-3.9-blue.svg)](https://www.python.org/downloads/release/python-390/) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 # EarthSHAB @@ -20,6 +24,7 @@ numpy pandas termcolor backports.datetime_fromisoformat +<<<<<<< HEAD ``` ## Overview @@ -69,19 +74,55 @@ below; ensure that the trajectory stays within these bounds for accurate predict *Note: At this time, trajectories that cross the international date line or the north or south poles are unsupported. The vent dynamics are also unreliable; we need more vented flight data.* +======= +seaborn +scipy +pytz +xarray +``` + +This simulation has been tested to run on Ubuntu 20.04 and Python 3.9. Older versions of python 3 may still work, as well as newer version of Ubuntu, however they are untested. + +## Examples + +``config_earth.py`` includes adjustable parameters and default parameters for running any of the files discussed below. These parameters include balloon size, envelope material properties, deployment location, date and time, etc. + +``saveNETCDF.py`` downloads subsets of NOAA weather forecasts for offline simulation + +``main.py*``, ``predict.py``, and ``trapezoid.py`` show examples of how to produce relevant and html-based trajectory maps using the Google maps API. + +These examples can all be run with the included GFS and ERA forecasts as well as a SHAB balloon trajectory (SHAB14-V) in the required APRS.fi csv format. +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 +<<<<<<< HEAD **trapezoid.py** demonstrates how to use the GFS functionality with manual trajectories, independent of the solar balloon model. Update *GNC.float* to predict trajectories at various altitudes. The scripts can be run with the default configuration file parameters and the included example forecast, *forecasts/gfs_0p25_20210329_12.nc*. +======= +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 ## Author * **Tristan Schuler** - *U.S. Naval Research Laboratory, University of Arizona* +<<<<<<< HEAD +======= +* Additional Contributions: **Craig Motell** - *NIWC Pacific* +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 ## Acknowledgments Hat Tip to [Bovine Aerospace](https://bovineaerospace.wordpress.com/), who developed an initial solar balloon model in C++. This code was adapted from their [repo](https://github.com/tunawhiskers/balloon_trajectory). +<<<<<<< HEAD +======= + +## Citing EarthSHAB + +If EarthSHAB played an important role in your research, then please cite the following publication +where EarthSHAB was first introduced: + +[Solar Balloons - An Aerial Platform for Planetary Exploration](https://repository.arizona.edu/handle/10150/656740) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 diff --git a/balloon_data/.~lock.SHAB12V-APRS.csv# b/balloon_data/.~lock.SHAB12V-APRS.csv# new file mode 100644 index 0000000..eccde46 --- /dev/null +++ b/balloon_data/.~lock.SHAB12V-APRS.csv# @@ -0,0 +1 @@ +,schuler,robot-r2,27.09.2023 16:25,file:///home/schuler/.config/libreoffice/4; \ No newline at end of file diff --git a/balloon_data/SHAB10V-APRS.csv b/balloon_data/SHAB10V-APRS.csv new file mode 100644 index 0000000..5fcfe3a --- /dev/null +++ b/balloon_data/SHAB10V-APRS.csv @@ -0,0 +1,38 @@ +time,lasttime,lat,lng,speed,course,altitude,comment +2022-04-09 18:14:57,2022-04-09 18:14:57,32.43633,-111.06417,15,341,1107.64,002 0.00 235.00 6.12 04 14507 0 0.0 None None +2022-04-09 18:16:36,2022-04-09 18:16:36,32.4405,-111.065,13,14,1285.65,002 0.00 235.00 6.14 06 15459 0 0.0 None None +2022-04-09 18:22:22,2022-04-09 18:22:22,32.451,-111.05333,30,37,2027.22,002 0.00 235.00 6.01 07 18708 0 0.0 None None +2022-04-09 18:42:03,2022-04-09 18:46:11,32.50767,-110.9655,28,55,4101.08,002 0.00 235.00 5.77 10 30345 0 0.0 None None +2022-04-09 18:49:04,2022-04-09 18:51:23,32.51733,-110.92433,43,82,5133.14,002 0.00 235.00 5.71 08 34803 0 0.0 None None +2022-04-09 18:53:21,2022-04-09 18:53:21,32.52317,-110.8895,41,90,5732.07,003 0.00 235.00 5.61 07 37408 0 0.0 None None +2022-04-09 18:53:46,2022-04-09 18:56:37,32.52367,-110.88617,46,77,5777.48,002 -9428. 155717 5.59 10 37660 0 0.0 None None +2022-04-09 19:00:58,2022-04-09 19:03:19,32.53033,-110.82483,50,81,6613.25,002 0.00 235.00 5.54 11 42051 0 0.0 None None +2022-04-09 19:21:32,2022-04-09 19:24:13,32.55517,-110.61933,69,88,9831.93,003 0.00 235.00 5.21 07 55262 0 0.0 None None +2022-04-09 19:25:12,2022-04-09 19:25:12,32.55467,-110.5755,74,97,10465.61,002 0.00 235.00 5.08 10 57700 0 0.0 None None +2022-04-09 19:27:32,2022-04-09 19:30:03,32.55217,-110.54617,72,99,10849.05,003 0.00 235.00 5.05 08 59249 0 0.0 None None +2022-04-09 19:43:08,2022-04-09 19:45:52,32.55083,-110.2655,137,89,13143.59,002 0.00 245421 4.80 09 69561 0 0.0 None None +2022-04-09 20:22:17,2022-04-09 20:22:17,32.52217,-109.72583,52,109,17869.81,004 0.00 235.00 4.78 08 95514 0 0.0 None None +2022-04-09 20:50:35,2022-04-09 20:53:47,32.49483,-109.612,30,79,19059.75,003 0.00 235.00 5.25 07 111583 0 0.0 None None +2022-04-09 21:17:50,2022-04-09 21:17:50,32.444,-109.43883,72,111,16526.87,002 0.00 235.00 5.16 09 123421 4 +2022-04-09 21:18:35,2022-04-09 21:18:35,32.44083,-109.42883,76,108,16524.73,007 0.00 235.00 5.00 06 123741 40 0.0 None None +2022-04-09 21:41:45,2022-04-09 21:45:10,32.47617,-109.0055,106,71,14394.79,009 0.00 235.00 5.10 07 133895 60 0.0 None None +2022-04-09 22:06:41,2022-04-09 22:06:41,32.4695,-108.4925,133,87,13013.44,002 0.00 235.00 5.30 11 146811 8 +2022-04-09 22:06:50,2022-04-09 22:06:51,32.46967,-108.489,130,87,12987.22,003 0.00 235.00 5.26 08 146890 80 0.0 None None +2022-04-09 22:21:48,2022-04-09 22:21:48,32.49217,-108.17467,109,78,12220.65,002 88.10 543174 5.33 10 155434 80 0.0 None None +2022-04-09 22:33:01,2022-04-09 22:33:01,32.49733,-107.96667,107,92,11871.66,002 0.00 235.00 5.36 12 162122 1 +2022-04-09 22:52:52,2022-04-09 22:52:52,32.47267,-107.62233,96,91,11498.88,002 0.00 235.00 5.51 12 173974 100 0.0 None None +2022-04-09 23:01:16,2022-04-09 23:01:16,32.47433,-107.46633,104,77,12280.7,002 0.00 235.00 5.21 12 180334 0 0.0 None None +2022-04-09 23:22:52,2022-04-09 23:22:52,32.49117,-107.03583,81,98,15094,003 0.00 235.00 5.10 12 194546 0 0.0 0 100000 +2022-04-09 23:49:18,2022-04-09 23:49:18,32.46083,-106.7295,48,86,17892.06,002 0.00 235.00 5.30 12 211894 0 +2022-04-09 23:53:24,2022-04-09 23:55:20,32.455,-106.68917,54,101,18110.3,003 0.00 235.00 5.16 07 214563 0 0.0 0 19000 +2022-04-10 0:07:46,2022-04-10 0:07:46,32.45117,-106.61933,31,82,18716.85,002 0.00 235.00 5.41 11 223374 0 0.0 0 19000 +2022-04-10 0:12:02,2022-04-10 0:12:02,32.44667,-106.593,61,100,18002.4,002 12.80 259489 5.16 11 226884 100 0.0 100 17000 +2022-04-10 0:16:32,2022-04-10 0:16:32,32.45017,-106.54767,54,96,17228.82,002 0.00 235.00 4.92 12 229821 100 0.0 100 17000 +2022-04-10 0:19:04,2022-04-10 0:19:04,32.44867,-106.52483,48,101,17244.06,002 0.00 235.00 5.13 12 SpaceTREx SHAB-10V +2022-04-10 0:31:59,2022-04-10 0:31:59,32.4445,-106.45767,107,154,16982.54,002 0.00 235.00 5.08 12 239934 0 0.0 0 17000 +2022-04-10 0:35:00,2022-04-10 0:35:00,32.4495,-106.45217,17,51,16907.87,002 12.80 96793. 4.98 12 SpaceTREx SHAB-10V +2022-04-10 0:35:19,2022-04-10 0:35:19,32.45,-106.4515,17,49,16861.23,003 8.20 8022.0 5.03 08 SpaceTREx SHAB-10V +2022-04-10 0:35:38,2022-04-10 0:35:39,32.45067,-106.45083,13,53,16801.49,004 6.70 248.00 5.07 10 SpaceTRE +2022-04-10 0:47:38,2022-04-10 0:47:38,32.4585,-106.39883,41,79,17686.63,003 0.00 235.00 4.88 06 250383 0 0.0 0 18000 +2022-04-10 0:54:03,2022-04-10 0:54:03,32.46333,-106.33967,56,81,17872.86,002 0.00 235.00 5.13 12 254637 100 0.0 100 18000 +2022-04-10 1:45:47,2022-04-10 1:45:47,32.48117,-105.631,63,84,6353.56,002 0.00 235.00 4.47 12 291964 0 0.0 0 17000 \ No newline at end of file diff --git a/balloon_data/SHAB12V-APRS.csv b/balloon_data/SHAB12V-APRS.csv new file mode 100644 index 0000000..3217c7c --- /dev/null +++ b/balloon_data/SHAB12V-APRS.csv @@ -0,0 +1,650 @@ +time,lasttime,lat,lng,speed,course,altitude,comment,alt_sp +2022-08-22 14:06:28,2022-08-22 14:06:28,34.64267,-106.83283,4,257,1589.84, StrTrk 55 9 1.62V 23C 84656Pa ,20000 +2022-08-22 14:07:27,2022-08-22 14:07:27,34.642,-106.83367,9,228,1628.85, StrTrk 56 9 1.62V 24C 84141Pa ,20000 +2022-08-22 14:08:27,2022-08-22 14:08:27,34.6405,-106.8345,7,221,1710.84, StrTrk 57 9 1.62V 24C 83513Pa ,20000 +2022-08-22 14:09:28,2022-08-22 14:09:28,34.63983,-106.83533,4,231,1778.81, StrTrk 58 9 1.61V 25C 82859Pa ,20000 +2022-08-22 14:11:27,2022-08-22 14:11:27,34.6385,-106.83467,2,55,1965.96, StrTrk 60 9 1.61V 23C 81037Pa ,20000 +2022-08-22 14:13:28,2022-08-22 14:13:28,34.63917,-106.83517,4,325,2111.04, StrTrk 62 9 1.61V 24C 79680Pa ,20000 +2022-08-22 14:14:27,2022-08-22 14:14:27,34.63967,-106.83567,4,306,2194.86, StrTrk 63 9 1.61V 23C 78883Pa ,20000 +2022-08-22 14:15:27,2022-08-22 14:15:27,34.64033,-106.83667,7,308,2293.01, StrTrk 64 9 1.61V 23C 77970Pa ,20000 +2022-08-22 14:16:28,2022-08-22 14:16:28,34.64017,-106.8375,6,229,2383.84, StrTrk 65 9 1.61V 22C 77122Pa ,20000 +2022-08-22 14:17:28,2022-08-22 14:17:28,34.63967,-106.838,6,175,2474.06, StrTrk 66 9 1.61V 21C 76317Pa ,20000 +2022-08-22 14:18:28,2022-08-22 14:18:28,34.63883,-106.837,7,88,2570.07, StrTrk 67 9 1.61V 22C 75437Pa ,20000 +2022-08-22 14:19:28,2022-08-22 14:19:28,34.6385,-106.83583,7,125,2656.94, StrTrk 68 9 1.61V 20C 74689Pa ,20000 +2022-08-22 14:20:27,2022-08-22 14:20:27,34.638,-106.83517,2,109,2737.1, StrTrk 69 9 1.61V 20C 73962Pa ,20000 +2022-08-22 14:21:27,2022-08-22 14:21:27,34.63783,-106.835,4,189,2821.84, StrTrk 70 9 1.61V 20C 73225Pa ,20000 +2022-08-22 14:23:28,2022-08-22 14:23:28,34.63633,-106.83533,6,150,3012.03, StrTrk 72 9 1.61V 19C 71585Pa ,20000 +2022-08-22 14:24:28,2022-08-22 14:24:28,34.636,-106.835,6,120,3108.96, StrTrk 73 9 1.60V 19C 70767Pa ,20000 +2022-08-22 14:25:28,2022-08-22 14:25:28,34.63533,-106.8325,19,107,3198.88, StrTrk 74 9 1.61V 19C 69980Pa ,20000 +2022-08-22 14:26:28,2022-08-22 14:26:28,34.63417,-106.82983,13,121,3296.11, StrTrk 75 9 1.60V 18C 69190Pa ,20000 +2022-08-22 14:27:28,2022-08-22 14:27:28,34.63233,-106.828,7,149,3382.98, StrTrk 76 9 1.61V 18C 68489Pa ,20000 +2022-08-22 14:29:28,2022-08-22 14:29:28,34.62817,-106.82633,13,175,3539.03, StrTrk 78 9 1.60V 18C 67203Pa ,20000 +2022-08-22 14:30:28,2022-08-22 14:30:28,34.62633,-106.8265,13,195,3620.11, StrTrk 79 9 1.60V 17C 66545Pa ,20000 +2022-08-22 14:31:28,2022-08-22 14:31:28,34.624,-106.82717,19,183,3706.98, StrTrk 80 9 1.59V 17C 65837Pa ,20000 +2022-08-22 14:32:28,2022-08-22 14:32:28,34.62167,-106.8275,17,190,3806.04, StrTrk 81 9 1.60V 16C 65057Pa ,20000 +2022-08-22 14:33:27,2022-08-22 14:33:27,34.61917,-106.82783,11,184,3906.93, StrTrk 82 9 1.60V 16C 64256Pa ,20000 +2022-08-22 14:34:27,2022-08-22 14:34:27,34.6165,-106.828,19,173,4025.19, StrTrk 83 9 1.60V 15C 63353Pa ,20000 +2022-08-22 14:35:27,2022-08-22 14:35:27,34.6135,-106.828,20,178,4137.05, StrTrk 84 9 1.60V 15C 62504Pa ,20000 +2022-08-22 14:36:27,2022-08-22 14:36:27,34.611,-106.82767,20,162,4248, StrTrk 85 9 1.58V 15C 61624Pa ,20000 +2022-08-22 14:37:27,2022-08-22 14:37:27,34.60817,-106.827,15,167,4344.01, StrTrk 86 9 1.58V 13C 60883Pa ,20000 +2022-08-22 14:39:27,2022-08-22 14:39:27,34.6035,-106.827,19,182,4518.05, StrTrk 88 9 1.59V 12C 59602Pa ,20000 +2022-08-22 14:40:27,2022-08-22 14:40:27,34.60167,-106.827,11,184,4596.99, StrTrk 89 9 1.58V 12C 59021Pa ,20000 +2022-08-22 14:41:27,2022-08-22 14:41:27,34.60033,-106.82667,7,180,4687.21, StrTrk 90 9 1.57V 12C 58347Pa ,20000 +2022-08-22 14:42:28,2022-08-22 14:42:28,34.59933,-106.82717,7,217,4778.04, StrTrk 91 9 1.58V 12C 57669Pa ,20000 +2022-08-22 14:43:27,2022-08-22 14:43:27,34.59883,-106.82767,4,271,4885.03, StrTrk 92 9 1.57V 11C 56927Pa ,20000 +2022-08-22 14:44:27,2022-08-22 14:44:27,34.59867,-106.8285,4,231,4983.18, StrTrk 93 9 1.58V 10C 56185Pa ,20000 +2022-08-22 14:45:27,2022-08-22 14:45:27,34.59817,-106.82933,2,271,5102.05, StrTrk 94 9 1.56V 09C 55395Pa ,20000 +2022-08-22 14:46:27,2022-08-22 14:46:27,34.5975,-106.82867,11,132,5212.08, StrTrk 95 9 1.56V 09C 54612Pa ,20000 +2022-08-22 14:47:27,2022-08-22 14:47:27,34.59617,-106.8275,11,154,5324.25, StrTrk 96 9 1.57V 09C 53865Pa ,20000 +2022-08-22 14:48:27,2022-08-22 14:48:27,34.59533,-106.8265,9,150,5425.14, StrTrk 97 9 1.56V 09C 53164Pa ,20000 +2022-08-22 14:49:27,2022-08-22 14:49:27,34.59417,-106.825,13,113,5547.97, StrTrk 98 9 1.56V 7C 52353Pa ,20000 +2022-08-22 14:50:27,2022-08-22 14:50:27,34.59333,-106.82233,13,118,5677.2, StrTrk 99 9 1.57V 8C 51502Pa ,20000 +2022-08-22 14:51:27,2022-08-22 14:51:27,34.5925,-106.82033,11,117,5776.26, StrTrk 100 9 1.56V 6C 50879Pa ,20000 +2022-08-22 14:52:27,2022-08-22 14:52:27,34.59067,-106.81783,22,129,5881.12, StrTrk 101 9 1.57V 6C 50175Pa ,20000 +2022-08-22 14:54:27,2022-08-22 14:54:27,34.5855,-106.81317,28,149,6059.12, StrTrk 103 9 1.57V 5C 49051Pa ,20000 +2022-08-22 14:55:27,2022-08-22 14:55:27,34.58233,-106.80967,24,137,6160.01, StrTrk 104 9 1.56V 6C 48430Pa ,20000 +2022-08-22 14:56:28,2022-08-22 14:56:28,34.57917,-106.80583,28,139,6270.04, StrTrk 105 9 1.56V 6C 47741Pa ,20000 +2022-08-22 14:57:27,2022-08-22 14:57:27,34.57633,-106.80133,28,124,6385.26, StrTrk 106 9 1.55V 6C 47031Pa ,20000 +2022-08-22 14:58:27,2022-08-22 14:58:27,34.57367,-106.79683,28,116,6525.16, StrTrk 107 9 1.55V 5C 46175Pa ,20000 +2022-08-22 14:59:27,2022-08-22 14:59:27,34.57117,-106.79267,28,128,6673.29, StrTrk 108 9 1.56V 4C 45332Pa ,20000 +2022-08-22 15:00:27,2022-08-22 15:00:27,34.56783,-106.78783,31,132,6811.06, StrTrk 109 9 1.55V 3C 44491Pa ,20000 +2022-08-22 15:01:27,2022-08-22 15:01:27,34.5645,-106.783,33,128,6936.33, StrTrk 110 9 1.55V 1C 43825Pa ,20000 +2022-08-22 15:02:27,2022-08-22 15:02:27,34.562,-106.77883,26,122,7032.04, StrTrk 111 9 1.56V 0C 43275Pa ,20000 +2022-08-22 15:03:27,2022-08-22 15:03:27,34.56017,-106.77517,24,116,7124.09, StrTrk 112 9 1.55V 1C 42735Pa ,20000 +2022-08-22 15:04:27,2022-08-22 15:04:27,34.56,-106.77067,22,90,7225.28, StrTrk 113 9 1.54V 3C 42168Pa ,20000 +2022-08-22 15:05:27,2022-08-22 15:05:27,34.5605,-106.76667,20,65,7324.34, StrTrk 114 9 1.55V 3C 41628Pa ,20000 +2022-08-22 15:07:27,2022-08-22 15:07:27,34.56267,-106.75983,24,66,7565.14, StrTrk 116 9 1.53V 2C 40310Pa ,20000 +2022-08-22 15:08:27,2022-08-22 15:08:27,34.56367,-106.75483,33,75,7714.18, StrTrk 117 9 1.53V 0C 39519Pa ,20000 +2022-08-22 15:09:27,2022-08-22 15:09:27,34.5645,-106.74883,30,71,7854.09, StrTrk 118 9 1.54V 0C 38796Pa ,20000 +2022-08-22 15:10:27,2022-08-22 15:10:27,34.56517,-106.74233,35,89,7994.29, StrTrk 119 9 1.53V -1C 38070Pa ,20000 +2022-08-22 15:11:27,2022-08-22 15:11:27,34.56567,-106.73667,30,92,8108.29, StrTrk 120 9 1.54V -4C 37481Pa ,20000 +2022-08-22 15:12:27,2022-08-22 15:12:27,34.566,-106.73017,43,89,8226.25, StrTrk 121 9 1.53V -3C 36913Pa ,20000 +2022-08-22 15:13:27,2022-08-22 15:13:27,34.56717,-106.7225,43,75,8336.28, StrTrk 122 9 1.53V -3C 36360Pa ,20000 +2022-08-22 15:14:27,2022-08-22 15:14:27,34.5685,-106.71433,43,78,8458.2, StrTrk 123 9 1.53V -3C 35768Pa ,20000 +2022-08-22 15:15:27,2022-08-22 15:15:27,34.57017,-106.70667,39,79,8581.34, StrTrk 124 9 1.52V -4C 35176Pa ,20000 +2022-08-22 15:16:27,2022-08-22 15:16:27,34.57133,-106.699,35,78,8727.34, StrTrk 125 9 1.52V -4C 34486Pa ,20000 +2022-08-22 15:17:27,2022-08-22 15:17:27,34.572,-106.69267,33,89,8863.28, StrTrk 126 9 1.52V -4C 33842Pa ,20000 +2022-08-22 15:18:27,2022-08-22 15:18:27,34.57217,-106.687,28,87,9000.44, StrTrk 127 9 1.52V -6C 33225Pa ,20000 +2022-08-22 15:19:27,2022-08-22 15:19:27,34.572,-106.68133,33,87,9126.32, StrTrk 128 9 1.52V -6C 32647Pa ,20000 +2022-08-22 15:20:27,2022-08-22 15:20:27,34.57183,-106.6745,44,93,9271.41, StrTrk 129 9 1.52V -7C 32007Pa ,20000 +2022-08-22 15:21:27,2022-08-22 15:21:27,34.57117,-106.667,43,98,9421.37, StrTrk 130 9 1.52V -8C 31358Pa ,20000 +2022-08-22 15:22:27,2022-08-22 15:22:27,34.57033,-106.6595,43,98,9565.23, StrTrk 131 9 1.52V -10C 30732Pa ,20000 +2022-08-22 15:23:27,2022-08-22 15:23:27,34.5695,-106.65083,48,97,9717.33, StrTrk 132 9 1.51V -10C 30087Pa ,20000 +2022-08-22 15:24:27,2022-08-22 15:24:27,34.56983,-106.64117,56,88,9851.44, StrTrk 133 9 1.51V -10C 29516Pa ,20000 +2022-08-22 15:25:27,2022-08-22 15:25:27,34.57017,-106.63067,57,93,9988.3, StrTrk 134 9 1.52V -11C 28955Pa ,20000 +2022-08-22 15:26:27,2022-08-22 15:26:27,34.56983,-106.62017,61,90,10149.23, StrTrk 135 9 1.51V -12C 28310Pa ,20000 +2022-08-22 15:27:27,2022-08-22 15:27:27,34.57,-106.609,59,85,10314.43, StrTrk 136 9 1.50V -12C 27639Pa ,20000 +2022-08-22 15:28:27,2022-08-22 15:28:27,34.57033,-106.5975,69,90,10493.35, StrTrk 137 9 1.51V -13C 26949Pa ,20000 +2022-08-22 15:29:27,2022-08-22 15:29:27,34.571,-106.58567,63,84,10670.44, StrTrk 138 9 1.50V -15C 26294Pa ,20000 +2022-08-22 15:30:27,2022-08-22 15:30:27,34.5715,-106.57383,65,80,10826.5, StrTrk 139 9 1.49V -16C 25685Pa ,20000 +2022-08-22 15:31:27,2022-08-22 15:31:27,34.5725,-106.56233,59,85,10981.33, StrTrk 140 9 1.49V -16C 25106Pa ,20000 +2022-08-22 15:32:27,2022-08-22 15:32:27,34.57333,-106.55117,63,80,11138.31, StrTrk 141 9 1.49V -17C 24535Pa ,20000 +2022-08-22 15:33:27,2022-08-22 15:33:27,34.57483,-106.54033,61,84,11292.54, StrTrk 142 9 1.48V -18C 24015Pa ,20000 +2022-08-22 15:34:27,2022-08-22 15:34:27,34.5765,-106.52917,61,77,11442.5, StrTrk 143 9 1.48V -19C 23460Pa ,20000 +2022-08-22 15:35:27,2022-08-22 15:35:27,34.57867,-106.51833,61,74,11600.38, StrTrk 144 9 1.48V -20C 22933Pa ,20000 +2022-08-22 15:36:27,2022-08-22 15:36:27,34.581,-106.5075,63,78,11767.41, StrTrk 145 9 1.48V -20C 22361Pa ,20000 +2022-08-22 15:37:27,2022-08-22 15:37:27,34.5835,-106.4965,65,74,11955.48, StrTrk 146 9 1.48V -21C 21735Pa ,20000 +2022-08-22 15:38:27,2022-08-22 15:38:27,34.58617,-106.48533,59,73,12136.53, StrTrk 147 9 1.47V -23C 21148Pa ,20000 +2022-08-22 15:39:27,2022-08-22 15:39:27,34.58817,-106.47417,59,82,12317.58, StrTrk 148 9 1.46V -24C 20603Pa ,20000 +2022-08-22 15:40:27,2022-08-22 15:40:27,34.58933,-106.46283,65,83,12473.33, StrTrk 149 9 1.46V -25C 20089Pa ,20000 +2022-08-22 15:42:27,2022-08-22 15:42:27,34.589,-106.44183,54,95,12848.54, StrTrk 151 9 1.46V -27C 18972Pa ,20000 +2022-08-22 15:44:38,2022-08-22 15:44:38,34.58883,-106.42083,54,96,13245.39, StrTrk 1 9 1.45V -30C 17827Pa ,20000 +2022-08-22 15:45:34,2022-08-22 15:45:34,34.5885,-106.411,54,87,13431.62, StrTrk 2 8 1.45V -31C 17309Pa ,20000 +2022-08-22 15:47:44,2022-08-22 15:47:44,34.5925,-106.39067,61,75,13836.4, StrTrk 1 9 1.44V -32C 16210Pa ,20000 +2022-08-22 15:48:39,2022-08-22 15:48:39,34.59433,-106.38067,57,79,14056.46, StrTrk 2 8 1.43V -33C 15648Pa ,20000 +2022-08-22 15:49:39,2022-08-22 15:49:39,34.59533,-106.37,61,84,14281.4, StrTrk 3 9 1.43V -33C 15080Pa ,20000 +2022-08-22 15:52:39,2022-08-22 15:52:39,34.598,-106.34017,48,88,14860.52, StrTrk 6 9 1.42V -36C 13658Pa ,20000 +2022-08-22 15:52:53,2022-08-22 15:52:53,34.5955,-106.359,56,81,14489.58, StrTrk 4 9 1.42V -34C 14559Pa ,20000 +2022-08-22 15:53:39,2022-08-22 15:53:39,34.59883,-106.33133,48,82,15062.61, StrTrk 7 9 1.40V -36C 13215Pa ,20000 +2022-08-22 15:54:04,2022-08-22 15:54:04,34.59683,-106.3495,57,82,14677.64, StrTrk 5 9 1.42V -34C 14093Pa ,20000 +2022-08-22 15:54:39,2022-08-22 15:54:39,34.59817,-106.3235,41,116,15275.66, StrTrk 8 9 1.40V -36C 12766Pa ,20000 +2022-08-22 15:55:39,2022-08-22 15:55:39,34.59467,-106.318,31,134,15466.47, StrTrk 9 9 1.39V -37C 12333Pa ,20000 +2022-08-22 15:56:39,2022-08-22 15:56:39,34.59017,-106.31417,31,169,15660.62, StrTrk 10 9 1.40V -38C 11930Pa ,20000 +2022-08-22 15:57:39,2022-08-22 15:57:39,34.58783,-106.31317,9,150,15866.67, StrTrk 11 9 1.39V -37C 11509Pa ,20000 +2022-08-22 15:58:39,2022-08-22 15:58:39,34.587,-106.3125,2,20,16060.52, StrTrk 12 9 1.40V -39C 11142Pa ,20000 +2022-08-22 15:59:39,2022-08-22 15:59:39,34.58683,-106.31417,9,310,16264.74, StrTrk 13 9 1.39V -38C 10754Pa ,20000 +2022-08-22 16:00:39,2022-08-22 16:00:39,34.58867,-106.316,19,325,16452.8, StrTrk 14 9 1.38V -39C 10405Pa ,20000 +2022-08-22 16:01:39,2022-08-22 16:01:39,34.59,-106.31567,2,268,16638.73, StrTrk 15 9 1.39V -39C 10080Pa ,20000 +2022-08-22 16:02:39,2022-08-22 16:02:39,34.59,-106.316,9,68,16829.53, StrTrk 16 9 1.39V -39C 9753Pa ,20000 +2022-08-22 16:03:39,2022-08-22 16:03:39,34.59117,-106.31567,15,340,17000.83, StrTrk 17 9 1.40V -38C 9456Pa ,20000 +2022-08-22 16:04:39,2022-08-22 16:04:39,34.59267,-106.31583,15,50,17162.68, StrTrk 18 9 1.40V -38C 9202Pa ,20000 +2022-08-22 16:05:39,2022-08-22 16:05:39,34.5955,-106.31533,9,17,17329.71, StrTrk 19 9 1.39V -38C 8927Pa ,20000 +2022-08-22 16:07:39,2022-08-22 16:07:39,34.59483,-106.31283,15,180,17680.84, StrTrk 21 9 1.39V -38C 8410Pa ,20000 +2022-08-22 16:08:39,2022-08-22 16:08:39,34.59183,-106.31383,26,206,17834.76, StrTrk 22 9 1.40V -37C 8156Pa ,20000 +2022-08-22 16:09:39,2022-08-22 16:09:39,34.58883,-106.31683,24,232,17978.63, StrTrk 23 9 1.40V -36C 7988Pa ,20000 +2022-08-22 16:10:39,2022-08-22 16:10:39,34.586,-106.32083,35,229,18070.68, StrTrk 24 9 1.41V -36C 7842Pa ,20000 +2022-08-22 16:11:39,2022-08-22 16:11:39,34.583,-106.32667,39,247,18172.79, StrTrk 25 9 1.41V -34C 7687Pa ,20000 +2022-08-22 16:12:39,2022-08-22 16:12:39,34.58117,-106.332,17,235,18338.6, StrTrk 26 9 1.41V -33C 7482Pa ,20000 +2022-08-22 16:13:39,2022-08-22 16:13:39,34.5805,-106.33567,15,259,18487.64, StrTrk 27 9 1.41V -33C 7301Pa ,20000 +2022-08-22 16:15:39,2022-08-22 16:15:39,34.57933,-106.34367,33,258,18783.91, StrTrk 29 9 1.43V -32C 6924Pa ,20000 +2022-08-22 16:16:39,2022-08-22 16:16:39,34.57883,-106.34933,28,273,18917.72, StrTrk 30 9 1.43V -31C 6772Pa ,20000 +2022-08-22 16:17:39,2022-08-22 16:17:39,34.58,-106.35417,24,299,19048.78, StrTrk 31 9 1.43V -32C 6624Pa ,20000 +2022-08-22 16:18:39,2022-08-22 16:18:39,34.58183,-106.35717,17,310,19139.92, StrTrk 32 9 1.44V -30C 6518Pa ,20000 +2022-08-22 16:19:39,2022-08-22 16:19:39,34.58383,-106.35933,19,327,19213.68, StrTrk 33 9 1.43V -29C 6445Pa ,20000 +2022-08-22 16:20:39,2022-08-22 16:20:39,34.58633,-106.362,22,318,19286.83, StrTrk 34 9 1.45V -29C 6362Pa ,20000 +2022-08-22 16:21:39,2022-08-22 16:21:39,34.588,-106.36483,19,304,19379.79, StrTrk 35 9 1.44V -28C 6267Pa ,20000 +2022-08-22 16:22:39,2022-08-22 16:22:39,34.58883,-106.3675,11,289,19485.86, StrTrk 36 9 1.45V -28C 6153Pa ,20000 +2022-08-22 16:23:39,2022-08-22 16:23:39,34.58867,-106.36967,7,239,19575.78, StrTrk 37 9 1.46V -28C 6060Pa ,20000 +2022-08-22 16:24:39,2022-08-22 16:24:39,34.588,-106.3715,17,257,19659.9, StrTrk 38 9 1.47V -29C 5970Pa ,20000 +2022-08-22 16:25:39,2022-08-22 16:25:39,34.58817,-106.375,19,276,19747.69, StrTrk 39 9 1.47V -30C 5877Pa ,20000 +2022-08-22 16:26:39,2022-08-22 16:26:39,34.58917,-106.37783,13,299,19851.93, StrTrk 40 9 1.47V -27C 5777Pa ,20000 +2022-08-22 16:27:39,2022-08-22 16:27:39,34.58967,-106.38033,17,263,19970.8, StrTrk 41 9 1.47V -27C 5670Pa ,20000 +2022-08-22 16:28:39,2022-08-22 16:28:39,34.589,-106.38367,20,244,20023.84, StrTrk 42 9 1.47V -27C 5611Pa ,20000 +2022-08-22 16:30:39,2022-08-22 16:30:39,34.58533,-106.39267,30,247,20052.79, StrTrk 44 9 1.47V -23C 5597Pa ,20000 +2022-08-22 16:31:39,2022-08-22 16:31:39,34.58383,-106.39733,24,252,20122.9, StrTrk 45 9 1.47V -22C 5541Pa ,20000 +2022-08-22 16:32:39,2022-08-22 16:32:39,34.58317,-106.40117,19,270,20227.75, StrTrk 46 9 1.48V -24C 5434Pa ,20000 +2022-08-22 16:34:39,2022-08-22 16:34:39,34.58383,-106.407,15,285,20239.94, StrTrk 48 9 1.49V -22C 5433Pa ,20000 +2022-08-22 16:35:39,2022-08-22 16:35:39,34.5845,-106.40967,13,285,20194.83, StrTrk 49 9 1.49V -20C 5479Pa ,20000 +2022-08-22 16:36:39,2022-08-22 16:36:39,34.585,-106.412,9,268,20222.87, StrTrk 50 9 1.49V -21C 5454Pa ,20000 +2022-08-22 16:37:39,2022-08-22 16:37:39,34.58533,-106.414,13,287,20221.96, StrTrk 51 9 1.49V -20C 5462Pa ,20000 +2022-08-22 16:38:39,2022-08-22 16:38:39,34.586,-106.41633,13,291,20232.93, StrTrk 52 9 1.49V -18C 5449Pa ,20000 +2022-08-22 16:39:39,2022-08-22 16:39:39,34.58683,-106.41867,13,285,20189.95, StrTrk 53 9 1.49V -18C 5498Pa ,20000 +2022-08-22 16:40:39,2022-08-22 16:40:39,34.58717,-106.42133,15,274,20165.87, StrTrk 54 9 1.49V -17C 5526Pa ,20000 +2022-08-22 16:41:39,2022-08-22 16:41:39,34.58717,-106.424,13,270,20171.97, StrTrk 55 9 1.49V -16C 5531Pa ,20000 +2022-08-22 16:42:39,2022-08-22 16:42:39,34.587,-106.42667,15,265,20170.75, StrTrk 56 9 1.49V -15C 5536Pa ,20000 +2022-08-22 16:43:39,2022-08-22 16:43:39,34.58683,-106.4295,15,260,20151.85, StrTrk 57 9 1.50V -14C 5550Pa ,20000 +2022-08-22 16:44:39,2022-08-22 16:44:39,34.58633,-106.4325,17,256,20131.74, StrTrk 58 9 1.49V -15C 5582Pa ,20000 +2022-08-22 16:45:39,2022-08-22 16:45:39,34.58567,-106.4355,17,256,20128.69, StrTrk 59 9 1.49V -15C 5570Pa ,20000 +2022-08-22 16:46:39,2022-08-22 16:46:39,34.585,-106.439,19,257,20134.78, StrTrk 60 9 1.50V -15C 5560Pa ,20000 +2022-08-22 16:47:39,2022-08-22 16:47:39,34.58433,-106.44267,20,255,20116.8, StrTrk 61 9 1.50V -14C 5577Pa ,20000 +2022-08-22 16:48:39,2022-08-22 16:48:39,34.58333,-106.4465,22,252,20081.75, StrTrk 62 9 1.50V -14C 5621Pa ,20000 +2022-08-22 16:49:39,2022-08-22 16:49:39,34.58217,-106.45067,24,249,20054.93, StrTrk 63 9 1.49V -13C 5649Pa ,20000 +2022-08-22 16:50:39,2022-08-22 16:50:39,34.58083,-106.45483,26,245,20050.96, StrTrk 64 9 1.49V -13C 5648Pa ,20000 +2022-08-22 16:51:39,2022-08-22 16:51:39,34.579,-106.45933,26,243,20061.94, StrTrk 65 9 1.50V -13C 5642Pa ,20000 +2022-08-22 16:52:39,2022-08-22 16:52:39,34.577,-106.464,30,243,20039.69, StrTrk 66 9 1.49V -15C 5658Pa ,20000 +2022-08-22 16:53:39,2022-08-22 16:53:39,34.575,-106.469,31,242,20009.82, StrTrk 67 9 1.50V -15C 5679Pa ,20000 +2022-08-22 16:54:39,2022-08-22 16:54:39,34.57267,-106.47417,31,241,19994.88, StrTrk 68 9 1.50V -14C 5697Pa ,20000 +2022-08-22 16:55:39,2022-08-22 16:55:39,34.57033,-106.4795,33,239,20007.68, StrTrk 69 9 1.50V -16C 5678Pa ,20000 +2022-08-22 16:56:39,2022-08-22 16:56:39,34.56767,-106.48483,33,238,20016.83, StrTrk 70 9 1.50V -17C 5665Pa ,20000 +2022-08-22 16:57:39,2022-08-22 16:57:39,34.56517,-106.49,31,239,19992.75, StrTrk 71 9 1.51V -19C 5662Pa ,20000 +2022-08-22 16:58:39,2022-08-22 16:58:39,34.56267,-106.49483,30,237,19956.78, StrTrk 72 9 1.50V -20C 5704Pa ,20000 +2022-08-22 16:59:39,2022-08-22 16:59:39,34.5605,-106.49883,22,239,19927.82, StrTrk 73 9 1.51V -19C 5740Pa ,20000 +2022-08-22 17:01:39,2022-08-22 17:01:39,34.55883,-106.50483,11,272,19892.77, StrTrk 75 9 1.49V -20C 5770Pa ,20000 +2022-08-22 17:02:39,2022-08-22 17:02:39,34.55917,-106.507,11,285,19872.96, StrTrk 76 9 1.49V -20C 5790Pa ,20000 +2022-08-22 17:03:39,2022-08-22 17:03:39,34.55983,-106.50917,11,291,19855.89, StrTrk 77 9 1.49V -19C 5805Pa ,20000 +2022-08-22 17:05:39,2022-08-22 17:05:39,34.56183,-106.51267,11,311,19805.9, StrTrk 79 9 1.50V -19C 5856Pa ,20000 +2022-08-22 17:07:39,2022-08-22 17:07:39,34.56417,-106.51633,11,300,19795.85, StrTrk 81 9 1.50V -20C 5863Pa ,20000 +2022-08-22 17:08:39,2022-08-22 17:08:39,34.565,-106.51833,11,294,19800.72, StrTrk 82 9 1.51V -19C 5856Pa ,20000 +2022-08-22 17:09:39,2022-08-22 17:09:39,34.56583,-106.52067,13,292,19787.92, StrTrk 83 9 1.50V -18C 5879Pa ,20000 +2022-08-22 17:10:39,2022-08-22 17:10:39,34.5665,-106.523,13,290,19760.79, StrTrk 84 9 1.49V -17C 5918Pa ,20000 +2022-08-22 17:12:39,2022-08-22 17:12:39,34.568,-106.52783,15,290,19748.91, StrTrk 86 9 1.49V -15C 5927Pa ,20000 +2022-08-22 17:13:39,2022-08-22 17:13:39,34.56883,-106.53033,15,293,19773.9, StrTrk 87 9 1.49V -14C 5902Pa ,20000 +2022-08-22 17:14:40,2022-08-22 17:14:40,34.56967,-106.53267,13,297,19799.81, StrTrk 88 9 1.50V -14C 5888Pa ,20000 +2022-08-22 17:15:39,2022-08-22 17:15:39,34.57083,-106.5345,11,316,19841.87, StrTrk 89 9 1.49V -16C 5837Pa ,20000 +2022-08-22 17:17:39,2022-08-22 17:17:39,34.57317,-106.53767,13,306,19845.83, StrTrk 91 9 1.50V -19C 5812Pa ,20000 +2022-08-22 17:18:39,2022-08-22 17:18:39,34.57433,-106.5395,11,308,19829.68, StrTrk 92 9 1.51V -19C 5835Pa ,20000 +2022-08-22 17:19:39,2022-08-22 17:19:39,34.57567,-106.5415,13,305,19794.93, StrTrk 93 9 1.51V -18C 5876Pa ,20000 +2022-08-22 17:20:39,2022-08-22 17:20:39,34.577,-106.54367,15,306,19781.82, StrTrk 94 9 1.50V -17C 5894Pa ,20000 +2022-08-22 17:21:39,2022-08-22 17:21:39,34.57817,-106.546,15,303,19764.76, StrTrk 95 9 1.50V -16C 5916Pa ,20000 +2022-08-22 17:22:39,2022-08-22 17:22:39,34.5795,-106.54833,15,302,19756.83, StrTrk 96 9 1.50V -16C 5923Pa ,20000 +2022-08-22 17:23:39,2022-08-22 17:23:39,34.58083,-106.55067,15,301,19758.66, StrTrk 97 9 1.50V -16C 5922Pa ,20000 +2022-08-22 17:24:39,2022-08-22 17:24:39,34.582,-106.55333,15,300,19754.7, StrTrk 98 9 1.49V -16C 5921Pa ,20000 +2022-08-22 17:25:39,2022-08-22 17:25:39,34.58333,-106.55583,17,299,19747.69, StrTrk 99 9 1.50V -16C 5928Pa ,20000 +2022-08-22 17:26:40,2022-08-22 17:26:40,34.5845,-106.5585,17,298,19739.76, StrTrk 100 9 1.49V -17C 5937Pa ,20000 +2022-08-22 17:27:39,2022-08-22 17:27:39,34.58583,-106.56133,17,297,19725.74, StrTrk 101 9 1.50V -18C 5944Pa ,20000 +2022-08-22 17:28:39,2022-08-22 17:28:39,34.587,-106.56417,17,295,19710.81, StrTrk 102 9 1.50V -20C 5947Pa ,20000 +2022-08-22 17:29:39,2022-08-22 17:29:39,34.58817,-106.567,15,293,19695.87, StrTrk 103 9 1.49V -20C 5961Pa ,20000 +2022-08-22 17:30:39,2022-08-22 17:30:39,34.589,-106.56983,17,293,19701.66, StrTrk 104 9 1.50V -19C 5958Pa ,16000 +2022-08-22 17:31:39,2022-08-22 17:31:39,34.58983,-106.57267,11,266,19658.69, StrTrk 105 9 1.50V -19C 6011Pa ,16000 +2022-08-22 17:32:39,2022-08-22 17:32:39,34.5895,-106.57467,13,297,19409.66, StrTrk 106 9 1.49V -22C 6261Pa ,16000 +2022-08-22 17:33:39,2022-08-22 17:33:39,34.59167,-106.577,19,302,19093.89, StrTrk 107 9 1.49V -26C 6594Pa ,16000 +2022-08-22 17:34:40,2022-08-22 17:34:40,34.59217,-106.58217,28,278,18796.71, StrTrk 108 9 1.48V -28C 6937Pa ,16000 +2022-08-22 17:35:39,2022-08-22 17:35:39,34.593,-106.587,30,288,18515.69, StrTrk 109 9 1.48V -30C 7269Pa ,16000 +2022-08-22 17:36:39,2022-08-22 17:36:39,34.59367,-106.59283,41,271,18245.63, StrTrk 110 9 1.47V -32C 7619Pa ,16000 +2022-08-22 17:37:39,2022-08-22 17:37:39,34.5925,-106.59983,33,250,17979.85, StrTrk 111 9 1.47V -33C 7979Pa ,16000 +2022-08-22 17:39:39,2022-08-22 17:39:39,34.58883,-106.60417,7,121,17548.56, StrTrk 113 9 1.45V -36C 8602Pa ,16000 +2022-08-22 17:40:39,2022-08-22 17:40:39,34.589,-106.60133,22,68,17391.58, StrTrk 114 9 1.46V -37C 8844Pa ,16000 +2022-08-22 17:41:39,2022-08-22 17:41:39,34.59067,-106.59867,15,43,17302.58, StrTrk 115 9 1.45V -37C 8990Pa ,16000 +2022-08-22 17:42:39,2022-08-22 17:42:39,34.59233,-106.597,13,43,17240.71, StrTrk 116 9 1.45V -36C 9072Pa ,16000 +2022-08-22 17:43:40,2022-08-22 17:43:40,34.5935,-106.59517,9,65,17182.8, StrTrk 117 9 1.44V -35C 9184Pa ,16000 +2022-08-22 17:44:39,2022-08-22 17:44:39,34.594,-106.59367,7,65,17120.62, StrTrk 118 9 1.44V -33C 9265Pa ,16000 +2022-08-22 17:45:39,2022-08-22 17:45:39,34.5945,-106.59233,6,60,17095.62, StrTrk 119 9 1.43V -32C 9292Pa ,16000 +2022-08-22 17:46:39,2022-08-22 17:46:39,34.595,-106.5915,6,56,17047.77, StrTrk 120 9 1.44V -32C 9373Pa ,16000 +2022-08-22 17:47:39,2022-08-22 17:47:39,34.59517,-106.59067,4,115,16992.6, StrTrk 121 9 1.44V -32C 9467Pa ,16000 +2022-08-22 17:48:39,2022-08-22 17:48:39,34.59433,-106.59,9,150,16915.79, StrTrk 122 9 1.44V -32C 9598Pa ,16000 +2022-08-22 17:50:39,2022-08-22 17:50:39,34.59283,-106.588,6,84,16809.72, StrTrk 124 9 1.44V -34C 9778Pa ,16000 +2022-08-22 17:51:39,2022-08-22 17:51:39,34.59317,-106.58683,6,77,16740.53, StrTrk 125 9 1.43V -35C 9897Pa ,16000 +2022-08-22 17:52:39,2022-08-22 17:52:39,34.59333,-106.58567,6,86,16708.53, StrTrk 126 9 1.43V -35C 9952Pa ,16000 +2022-08-22 17:54:39,2022-08-22 17:54:39,34.59367,-106.58283,7,67,16629.58, StrTrk 128 9 1.44V -35C 10094Pa ,16000 +2022-08-22 17:55:39,2022-08-22 17:55:39,34.59433,-106.58167,7,48,16594.53, StrTrk 129 9 1.44V -34C 10161Pa ,16000 +2022-08-22 17:56:39,2022-08-22 17:56:39,34.59533,-106.58067,6,31,16549.73, StrTrk 130 9 1.45V -34C 10227Pa ,16000 +2022-08-22 17:58:39,2022-08-22 17:58:39,34.598,-106.57917,13,28,16452.8, StrTrk 132 9 1.44V -35C 10422Pa ,16000 +2022-08-22 17:59:39,2022-08-22 17:59:39,34.59983,-106.578,15,28,16418.66, StrTrk 133 9 1.45V -35C 10483Pa ,16000 +2022-08-22 18:00:39,2022-08-22 18:00:39,34.60233,-106.57633,20,29,16375.68, StrTrk 134 9 1.45V -35C 10555Pa ,16000 +2022-08-22 18:01:39,2022-08-22 18:01:39,34.60533,-106.57483,24,16,16323.56, StrTrk 135 9 1.44V -35C 10654Pa ,16000 +2022-08-22 18:02:39,2022-08-22 18:02:39,34.60917,-106.57367,28,8,16293.69, StrTrk 136 9 1.44V -35C 10707Pa ,16000 +2022-08-22 18:03:39,2022-08-22 18:03:39,34.6135,-106.5735,28,356,16266.57, StrTrk 137 9 1.44V -34C 10746Pa ,16000 +2022-08-22 18:04:39,2022-08-22 18:04:39,34.61783,-106.57383,28,354,16237.61, StrTrk 138 9 1.43V -34C 10797Pa ,16000 +2022-08-22 18:05:39,2022-08-22 18:05:39,34.62167,-106.57433,24,353,16200.73, StrTrk 139 9 1.43V -33C 10863Pa ,16000 +2022-08-22 18:06:39,2022-08-22 18:06:39,34.625,-106.575,19,344,16150.74, StrTrk 140 9 1.42V -33C 10963Pa ,16000 +2022-08-22 18:07:39,2022-08-22 18:07:39,34.627,-106.576,9,336,16111.73, StrTrk 141 9 1.42V -34C 11041Pa ,16000 +2022-08-22 18:08:39,2022-08-22 18:08:39,34.62817,-106.57683,7,329,16082.77, StrTrk 142 9 1.42V -34C 11100Pa ,16000 +2022-08-22 18:09:39,2022-08-22 18:09:39,34.62917,-106.5775,6,327,16052.6, StrTrk 143 9 1.42V -34C 11154Pa ,16000 +2022-08-22 18:10:39,2022-08-22 18:10:39,34.62983,-106.578,2,344,16019.68, StrTrk 144 9 1.42V -34C 11236Pa ,16000 +2022-08-22 18:11:39,2022-08-22 18:11:39,34.63033,-106.57783,2,330,16037.66, StrTrk 145 9 1.42V -33C 11193Pa ,16000 +2022-08-22 18:12:39,2022-08-22 18:12:39,34.631,-106.57833,7,338,16109.59, StrTrk 146 9 1.42V -34C 11049Pa ,16000 +2022-08-22 18:13:39,2022-08-22 18:13:39,34.63233,-106.57883,7,335,16102.58, StrTrk 147 9 1.42V -35C 11068Pa ,16000 +2022-08-22 18:14:39,2022-08-22 18:14:39,34.63333,-106.57933,7,337,16095.57, StrTrk 148 9 1.43V -35C 11071Pa ,16000 +2022-08-22 18:15:39,2022-08-22 18:15:39,34.6345,-106.57983,7,339,16091.61, StrTrk 149 9 1.44V -34C 11086Pa ,16000 +2022-08-22 18:16:39,2022-08-22 18:16:39,34.6355,-106.58033,6,342,16050.77, StrTrk 150 9 1.44V -36C 11175Pa ,16000 +2022-08-22 18:17:39,2022-08-22 18:17:39,34.6365,-106.58083,6,339,16032.48, StrTrk 151 9 1.45V -37C 11214Pa ,16000 +2022-08-22 18:18:39,2022-08-22 18:18:39,34.63717,-106.58083,4,11,16015.72, StrTrk 152 9 1.44V -37C 11238Pa ,16000 +2022-08-22 18:19:39,2022-08-22 18:19:39,34.63833,-106.5815,7,342,16104.72, StrTrk 153 9 1.44V -37C 11068Pa ,16000 +2022-08-22 18:20:39,2022-08-22 18:20:39,34.6395,-106.58167,7,352,16105.63, StrTrk 154 9 1.44V -37C 11068Pa ,16000 +2022-08-22 18:21:39,2022-08-22 18:21:39,34.64067,-106.582,7,350,16066.62, StrTrk 155 9 1.43V -36C 11128Pa ,16000 +2022-08-22 18:22:39,2022-08-22 18:22:39,34.642,-106.58233,7,351,16051.68, StrTrk 156 9 1.44V -35C 11158Pa ,16000 +2022-08-22 18:23:39,2022-08-22 18:23:39,34.64317,-106.5825,7,357,16038.58, StrTrk 157 9 1.45V -35C 11188Pa ,16000 +2022-08-22 18:24:39,2022-08-22 18:24:39,34.64433,-106.58233,6,20,16015.72, StrTrk 158 9 1.45V -36C 11239Pa ,16000 +2022-08-22 18:25:39,2022-08-22 18:25:39,34.64533,-106.58183,7,4,16032.48, StrTrk 159 9 1.45V -36C 11200Pa ,16000 +2022-08-22 18:26:39,2022-08-22 18:26:39,34.64683,-106.58217,9,351,16077.59, StrTrk 160 9 1.44V -35C 11109Pa ,16000 +2022-08-22 18:27:39,2022-08-22 18:27:39,34.64833,-106.58233,9,355,16052.6, StrTrk 161 9 1.45V -36C 11172Pa ,16000 +2022-08-22 18:28:39,2022-08-22 18:28:39,34.64967,-106.58233,7,359,16024.56, StrTrk 162 9 1.44V -36C 11209Pa ,16000 +2022-08-22 18:29:39,2022-08-22 18:29:39,34.65067,-106.58233,6,16,16002.61, StrTrk 163 9 1.44V -35C 11255Pa ,16000 +2022-08-22 18:30:39,2022-08-22 18:30:39,34.652,-106.58233,11,347,16051.68, StrTrk 164 9 1.45V -34C 11153Pa ,16000 +2022-08-22 18:31:39,2022-08-22 18:31:39,34.6535,-106.58267,11,352,16073.63, StrTrk 165 9 1.44V -34C 11122Pa ,16000 +2022-08-22 18:32:39,2022-08-22 18:32:39,34.65517,-106.583,9,355,16019.68, StrTrk 166 9 1.44V -36C 11231Pa ,16000 +2022-08-22 18:33:39,2022-08-22 18:33:39,34.65683,-106.58317,9,354,16054.73, StrTrk 167 9 1.44V -35C 11162Pa ,16000 +2022-08-22 18:34:40,2022-08-22 18:34:40,34.6585,-106.58333,11,358,16083.69, StrTrk 168 9 1.45V -34C 11100Pa ,16000 +2022-08-22 18:35:39,2022-08-22 18:35:39,34.66017,-106.58333,9,355,16043.76, StrTrk 169 9 1.43V -34C 11171Pa ,16000 +2022-08-22 18:36:39,2022-08-22 18:36:39,34.66183,-106.5835,11,352,16060.52, StrTrk 170 9 1.44V -32C 11137Pa ,16000 +2022-08-22 18:37:39,2022-08-22 18:37:39,34.6635,-106.58367,11,353,16051.68, StrTrk 171 9 1.44V -33C 11153Pa ,16000 +2022-08-22 18:38:39,2022-08-22 18:38:39,34.66517,-106.58383,11,356,16047.72, StrTrk 172 9 1.45V -34C 11164Pa ,16000 +2022-08-22 18:39:39,2022-08-22 18:39:39,34.667,-106.584,9,5,16015.72, StrTrk 173 9 1.46V -35C 11239Pa ,16000 +2022-08-22 18:40:39,2022-08-22 18:40:39,34.6685,-106.58367,11,358,16027.6, StrTrk 174 9 1.45V -35C 11203Pa ,16000 +2022-08-22 18:41:39,2022-08-22 18:41:39,34.6705,-106.58383,13,353,16054.73, StrTrk 175 9 1.45V -33C 11147Pa ,16000 +2022-08-22 18:42:39,2022-08-22 18:42:39,34.6725,-106.584,13,355,16025.77, StrTrk 176 9 1.44V -33C 11198Pa ,16000 +2022-08-22 18:43:39,2022-08-22 18:43:39,34.6745,-106.58417,13,356,16018.76, StrTrk 177 9 1.44V -33C 11204Pa ,16000 +2022-08-22 18:44:39,2022-08-22 18:44:39,34.67667,-106.58417,13,359,16023.64, StrTrk 178 9 1.44V -33C 11199Pa ,16000 +2022-08-22 18:45:39,2022-08-22 18:45:39,34.6785,-106.584,13,1,16019.68, StrTrk 179 9 1.44V -33C 11224Pa ,16000 +2022-08-22 18:46:40,2022-08-22 18:46:40,34.68083,-106.58383,17,7,16055.64, StrTrk 180 9 1.43V -33C 11136Pa ,16000 +2022-08-22 18:47:39,2022-08-22 18:47:39,34.6835,-106.5835,17,4,16054.73, StrTrk 181 9 1.43V -34C 11157Pa ,16000 +2022-08-22 18:48:39,2022-08-22 18:48:39,34.686,-106.58333,15,3,16013.58, StrTrk 182 9 1.43V -34C 11225Pa ,16000 +2022-08-22 18:49:39,2022-08-22 18:49:39,34.6885,-106.58317,17,4,16068.75, StrTrk 183 9 1.42V -32C 11118Pa ,16000 +2022-08-22 18:50:39,2022-08-22 18:50:39,34.69117,-106.58283,19,3,16119.65, StrTrk 184 9 1.42V -33C 11022Pa ,16000 +2022-08-22 18:52:39,2022-08-22 18:52:39,34.69733,-106.58217,19,5,16048.63, StrTrk 186 9 1.43V -36C 11173Pa ,16000 +2022-08-22 18:53:40,2022-08-22 18:53:40,34.70017,-106.58183,17,5,16025.77, StrTrk 187 9 1.43V -35C 11220Pa ,16000 +2022-08-22 18:54:39,2022-08-22 18:54:39,34.703,-106.58133,17,8,16016.63, StrTrk 188 9 1.43V -34C 11216Pa ,16000 +2022-08-22 18:55:39,2022-08-22 18:55:39,34.7055,-106.58083,17,9,16023.64, StrTrk 189 9 1.43V -32C 11198Pa ,16000 +2022-08-22 18:56:39,2022-08-22 18:56:39,34.7085,-106.58033,22,10,16093.74, StrTrk 190 9 1.44V -32C 11057Pa ,16000 +2022-08-22 18:57:39,2022-08-22 18:57:39,34.71167,-106.57983,19,7,16069.67, StrTrk 191 9 1.44V -35C 11137Pa ,16000 +2022-08-22 18:58:39,2022-08-22 18:58:39,34.7145,-106.57917,19,8,16038.58, StrTrk 192 9 1.43V -35C 11179Pa ,16000 +2022-08-22 18:59:39,2022-08-22 18:59:39,34.71733,-106.57867,19,11,16067.53, StrTrk 193 9 1.44V -34C 11111Pa ,16000 +2022-08-22 19:00:39,2022-08-22 19:00:39,34.72017,-106.57783,19,10,16023.64, StrTrk 194 9 1.44V -34C 11204Pa ,18000 +2022-08-22 19:01:39,2022-08-22 19:01:39,34.723,-106.57717,19,14,16021.51, StrTrk 195 9 1.45V -34C 11146Pa ,18000 +2022-08-22 19:02:39,2022-08-22 19:02:39,34.72767,-106.57617,37,16,16148.61, StrTrk 196 9 1.44V -34C 10932Pa ,18000 +2022-08-22 19:03:39,2022-08-22 19:03:39,34.7325,-106.5735,26,27,16273.58, StrTrk 197 9 1.44V -35C 10717Pa ,18000 +2022-08-22 19:04:39,2022-08-22 19:04:39,34.73533,-106.57233,15,37,16437.56, StrTrk 198 9 1.44V -37C 10438Pa ,18000 +2022-08-22 19:05:40,2022-08-22 19:05:40,34.7365,-106.5705,11,58,16590.57, StrTrk 199 9 1.43V -39C 10180Pa ,18000 +2022-08-22 19:06:39,2022-08-22 19:06:39,34.7385,-106.57033,11,342,16728.64, StrTrk 200 9 1.42V -39C 9943Pa ,18000 +2022-08-22 19:07:39,2022-08-22 19:07:39,34.73867,-106.57133,7,256,16863.67, StrTrk 201 9 1.40V -39C 9712Pa ,18000 +2022-08-22 19:08:39,2022-08-22 19:08:39,34.73883,-106.57217,6,1,17001.74, StrTrk 202 9 1.40V -39C 9489Pa ,18000 +2022-08-22 19:09:39,2022-08-22 19:09:39,34.74,-106.57167,9,60,17140.73, StrTrk 203 9 1.39V -39C 9247Pa ,18000 +2022-08-22 19:10:39,2022-08-22 19:10:39,34.74017,-106.5695,17,73,17292.83, StrTrk 204 9 1.38V -39C 9009Pa ,18000 +2022-08-22 19:11:39,2022-08-22 19:11:39,34.7405,-106.56633,9,134,17430.6, StrTrk 205 9 1.39V -39C 8793Pa ,18000 +2022-08-22 19:12:43,2022-08-22 19:12:43,34.73883,-106.566,9,198,17562.58, StrTrk 206 9 1.37V -40C 8595Pa ,18000 +2022-08-22 19:13:39,2022-08-22 19:13:39,34.737,-106.56733,28,209,17694.86, StrTrk 207 9 1.37V -40C 8403Pa ,18000 +2022-08-22 19:14:43,2022-08-22 19:14:43,34.73417,-106.57083,26,235,17799.71, StrTrk 208 9 1.37V -40C 8260Pa ,18000 +2022-08-22 19:15:39,2022-08-22 19:15:39,34.73283,-106.57467,20,258,17916.75, StrTrk 209 9 1.38V -40C 8080Pa ,18000 +2022-08-22 19:17:40,2022-08-22 19:17:40,34.73183,-106.585,30,269,18086.83, StrTrk 211 9 1.38V -39C 7839Pa ,18000 +2022-08-22 19:18:39,2022-08-22 19:18:39,34.73117,-106.5905,26,261,17947.84, StrTrk 212 9 1.39V -39C 8042Pa ,18000 +2022-08-22 19:19:39,2022-08-22 19:19:39,34.7305,-106.5945,22,256,17937.78, StrTrk 213 9 1.38V -39C 8041Pa ,18000 +2022-08-22 19:21:39,2022-08-22 19:21:39,34.72917,-106.605,28,260,18017.64, StrTrk 215 9 1.40V -37C 7918Pa ,18000 +2022-08-22 19:22:39,2022-08-22 19:22:39,34.7285,-106.61033,28,262,17930.77, StrTrk 216 9 1.40V -37C 8042Pa ,18000 +2022-08-22 19:23:39,2022-08-22 19:23:39,34.72767,-106.61567,30,258,18029.83, StrTrk 217 9 1.40V -37C 7921Pa ,18000 +2022-08-22 19:24:39,2022-08-22 19:24:39,34.7275,-106.6215,31,268,18073.73, StrTrk 218 9 1.41V -37C 7848Pa ,18000 +2022-08-22 19:25:39,2022-08-22 19:25:39,34.727,-106.62683,26,262,17935.65, StrTrk 219 9 1.41V -38C 8050Pa ,18000 +2022-08-22 19:26:39,2022-08-22 19:26:39,34.7265,-106.6315,28,259,17978.63, StrTrk 220 9 1.40V -37C 7977Pa ,18000 +2022-08-22 19:27:39,2022-08-22 19:27:39,34.72567,-106.637,31,263,18063.67, StrTrk 221 9 1.40V -37C 7871Pa ,18000 +2022-08-22 19:28:39,2022-08-22 19:28:39,34.72517,-106.64283,31,260,18021.6, StrTrk 222 9 1.41V -37C 7913Pa ,18000 +2022-08-22 19:29:39,2022-08-22 19:29:39,34.72433,-106.64817,28,261,17950.59, StrTrk 223 9 1.41V -37C 8013Pa ,18000 +2022-08-22 19:30:39,2022-08-22 19:30:39,34.72333,-106.65333,31,261,18040.81, StrTrk 224 9 1.42V -36C 7903Pa ,18000 +2022-08-22 19:31:39,2022-08-22 19:31:39,34.72283,-106.65933,31,259,18025.87, StrTrk 225 9 1.42V -35C 7925Pa ,18000 +2022-08-22 19:32:39,2022-08-22 19:32:39,34.72183,-106.66467,28,256,17964.61, StrTrk 226 9 1.42V -35C 7988Pa ,18000 +2022-08-22 19:33:39,2022-08-22 19:33:39,34.72083,-106.67017,30,264,18050.87, StrTrk 227 9 1.42V -35C 7877Pa ,18000 +2022-08-22 19:34:39,2022-08-22 19:34:39,34.72033,-106.67567,30,259,18002.71, StrTrk 228 9 1.43V -35C 7946Pa ,18000 +2022-08-22 19:35:39,2022-08-22 19:35:39,34.71917,-106.68083,28,248,17985.64, StrTrk 229 9 1.42V -35C 7962Pa ,18000 +2022-08-22 19:36:39,2022-08-22 19:36:39,34.71833,-106.68633,30,264,18058.79, StrTrk 230 9 1.44V -35C 7868Pa ,18000 +2022-08-22 19:37:39,2022-08-22 19:37:39,34.71783,-106.69183,30,257,17977.71, StrTrk 231 9 1.43V -35C 7982Pa ,18000 +2022-08-22 19:38:39,2022-08-22 19:38:39,34.717,-106.697,30,258,17957.6, StrTrk 232 9 1.44V -35C 8006Pa ,18000 +2022-08-22 19:39:39,2022-08-22 19:39:39,34.7165,-106.7025,28,268,18031.66, StrTrk 233 9 1.42V -34C 7903Pa ,18000 +2022-08-22 19:40:39,2022-08-22 19:40:39,34.716,-106.70767,28,264,18070.68, StrTrk 234 9 1.44V -33C 7853Pa ,18000 +2022-08-22 19:41:39,2022-08-22 19:41:39,34.7155,-106.713,28,260,17961.86, StrTrk 235 9 1.44V -35C 7998Pa ,18000 +2022-08-22 19:42:39,2022-08-22 19:42:39,34.7145,-106.718,30,266,18031.66, StrTrk 236 9 1.43V -34C 7900Pa ,18000 +2022-08-22 19:43:39,2022-08-22 19:43:39,34.7145,-106.7235,30,269,18021.6, StrTrk 237 9 1.43V -34C 7915Pa ,18000 +2022-08-22 19:44:39,2022-08-22 19:44:39,34.71383,-106.72883,28,256,17945.71, StrTrk 238 9 1.44V -34C 8016Pa ,18000 +2022-08-22 19:45:39,2022-08-22 19:45:39,34.71333,-106.73417,30,263,18055.74, StrTrk 239 9 1.44V -34C 7869Pa ,18000 +2022-08-22 19:47:39,2022-08-22 19:47:39,34.712,-106.74467,28,260,17918.58, StrTrk 241 9 1.44V -34C 8066Pa ,18000 +2022-08-22 19:49:39,2022-08-22 19:49:39,34.711,-106.7555,30,264,18089.88, StrTrk 243 9 1.43V -33C 7820Pa ,18000 +2022-08-22 19:51:39,2022-08-22 19:51:39,34.71,-106.766,26,261,17937.78, StrTrk 245 9 1.44V -35C 8030Pa ,18000 +2022-08-22 19:52:39,2022-08-22 19:52:39,34.709,-106.77117,30,265,18001.79, StrTrk 246 9 1.43V -35C 7950Pa ,18000 +2022-08-22 19:54:39,2022-08-22 19:54:39,34.70833,-106.78183,31,264,18004.84, StrTrk 248 9 1.44V -34C 7934Pa ,18000 +2022-08-22 19:55:39,2022-08-22 19:55:39,34.70783,-106.787,28,265,17954.85, StrTrk 249 9 1.43V -35C 8011Pa ,18000 +2022-08-22 19:56:39,2022-08-22 19:56:39,34.707,-106.79217,31,260,18024.65, StrTrk 250 9 1.44V -34C 7919Pa ,18000 +2022-08-22 19:57:39,2022-08-22 19:57:39,34.7065,-106.79767,28,265,18054.83, StrTrk 251 9 1.44V -33C 7869Pa ,18000 +2022-08-22 19:58:39,2022-08-22 19:58:39,34.706,-106.80267,26,261,17948.76, StrTrk 252 9 1.44V -35C 8021Pa ,18000 +2022-08-22 19:59:39,2022-08-22 19:59:39,34.70533,-106.80783,30,265,18026.79, StrTrk 253 9 1.44V -34C 7910Pa ,18000 +2022-08-22 20:01:39,2022-08-22 20:01:39,34.70483,-106.81833,28,261,17957.6, StrTrk 255 9 1.43V -32C 8002Pa ,18000 +2022-08-22 20:02:39,2022-08-22 20:02:39,34.70467,-106.8235,28,265,18052.69, StrTrk 256 9 1.44V -31C 7869Pa ,18000 +2022-08-22 20:03:39,2022-08-22 20:03:39,34.70467,-106.82867,26,268,18068.85, StrTrk 257 9 1.44V -32C 7864Pa ,18000 +2022-08-22 20:04:39,2022-08-22 20:04:39,34.70433,-106.83367,26,262,17949.67, StrTrk 258 9 1.44V -34C 8015Pa ,18000 +2022-08-22 20:05:39,2022-08-22 20:05:39,34.70367,-106.83883,28,264,18009.72, StrTrk 259 9 1.44V -33C 7925Pa ,18000 +2022-08-22 20:06:39,2022-08-22 20:06:39,34.70383,-106.844,28,272,18056.66, StrTrk 260 9 1.45V -32C 7862Pa ,18000 +2022-08-22 20:07:39,2022-08-22 20:07:39,34.704,-106.8495,30,269,17971.62, StrTrk 261 9 1.44V -33C 7988Pa ,18000 +2022-08-22 20:08:39,2022-08-22 20:08:39,34.70417,-106.855,28,276,18045.68, StrTrk 262 9 1.44V -34C 7890Pa ,18000 +2022-08-22 20:09:40,2022-08-22 20:09:40,34.7045,-106.86033,28,272,18024.65, StrTrk 263 9 1.45V -33C 7921Pa ,18000 +2022-08-22 20:10:40,2022-08-22 20:10:40,34.7045,-106.86567,28,265,17976.8, StrTrk 264 9 1.44V -34C 7982Pa ,18000 +2022-08-22 20:12:39,2022-08-22 20:12:39,34.70467,-106.876,30,270,18024.65, StrTrk 266 9 1.45V -34C 7926Pa ,18000 +2022-08-22 20:13:39,2022-08-22 20:13:39,34.70417,-106.88117,30,259,17961.86, StrTrk 267 9 1.45V -33C 8005Pa ,18000 +2022-08-22 20:14:39,2022-08-22 20:14:39,34.704,-106.8865,28,272,18026.79, StrTrk 268 9 1.45V -33C 7910Pa ,18000 +2022-08-22 20:15:39,2022-08-22 20:15:39,34.70383,-106.8915,28,270,18058.79, StrTrk 269 9 1.45V -31C 7867Pa ,18000 +2022-08-22 20:16:39,2022-08-22 20:16:39,34.704,-106.89683,28,263,17934.74, StrTrk 270 9 1.45V -31C 8037Pa ,18000 +2022-08-22 20:17:39,2022-08-22 20:17:39,34.70383,-106.902,26,279,18002.71, StrTrk 271 9 1.45V -31C 7947Pa ,18000 +2022-08-22 20:18:39,2022-08-22 20:18:39,34.70417,-106.90683,24,275,18063.67, StrTrk 272 9 1.45V -31C 7860Pa ,18000 +2022-08-22 20:19:39,2022-08-22 20:19:39,34.7045,-106.91167,28,275,17978.63, StrTrk 273 9 1.45V -32C 7982Pa ,18000 +2022-08-22 20:20:39,2022-08-22 20:20:39,34.70433,-106.91667,26,267,17971.62, StrTrk 274 9 1.46V -33C 7986Pa ,18000 +2022-08-22 20:23:39,2022-08-22 20:23:39,34.70483,-106.93133,26,266,17948.76, StrTrk 277 9 1.44V -32C 8024Pa ,18000 +2022-08-22 20:24:39,2022-08-22 20:24:39,34.705,-106.93633,28,277,18051.78, StrTrk 278 9 1.45V -32C 7880Pa ,18000 +2022-08-22 20:25:39,2022-08-22 20:25:39,34.70517,-106.94117,26,274,18037.76, StrTrk 279 9 1.45V -31C 7901Pa ,18000 +2022-08-22 20:26:39,2022-08-22 20:26:39,34.7055,-106.94617,26,271,17947.84, StrTrk 280 9 1.44V -31C 8020Pa ,18000 +2022-08-22 20:27:39,2022-08-22 20:27:39,34.70583,-106.95067,26,275,18042.64, StrTrk 281 9 1.45V -31C 7889Pa ,18000 +2022-08-22 20:28:39,2022-08-22 20:28:39,34.70667,-106.95533,28,285,18105.73, StrTrk 282 9 1.45V -31C 7818Pa ,18000 +2022-08-22 20:29:39,2022-08-22 20:29:39,34.7075,-106.96017,26,274,17977.71, StrTrk 283 9 1.45V -31C 7994Pa ,18000 +2022-08-22 20:30:39,2022-08-22 20:30:39,34.70733,-106.96483,24,262,17953.63, StrTrk 284 9 1.46V -31C 8007Pa ,14000 +2022-08-22 20:31:39,2022-08-22 20:31:39,34.70783,-106.96967,24,284,18013.68, StrTrk 285 9 1.45V -31C 7933Pa ,14000 +2022-08-22 20:32:40,2022-08-22 20:32:40,34.70883,-106.97433,26,283,17973.75, StrTrk 286 9 1.45V -30C 7983Pa ,14000 +2022-08-22 20:33:39,2022-08-22 20:33:39,34.70917,-106.979,22,274,17853.66, StrTrk 287 9 1.45V -32C 8157Pa ,14000 +2022-08-22 20:34:39,2022-08-22 20:34:39,34.70883,-106.98283,22,257,17750.64, StrTrk 288 9 1.45V -35C 8308Pa ,14000 +2022-08-22 20:35:39,2022-08-22 20:35:39,34.70767,-106.98683,24,243,17676.57, StrTrk 289 9 1.44V -34C 8403Pa ,14000 +2022-08-22 20:37:39,2022-08-22 20:37:39,34.7035,-106.99183,13,210,17504.66, StrTrk 291 9 1.45V -33C 8654Pa ,14000 +2022-08-22 20:38:39,2022-08-22 20:38:39,34.702,-106.99267,9,191,17492.78, StrTrk 292 9 1.44V -33C 8680Pa ,14000 +2022-08-22 20:39:39,2022-08-22 20:39:39,34.70067,-106.9925,7,153,17439.74, StrTrk 293 9 1.44V -34C 8754Pa ,14000 +2022-08-22 20:40:39,2022-08-22 20:40:39,34.69933,-106.99083,17,124,17359.58, StrTrk 294 9 1.44V -34C 8887Pa ,14000 +2022-08-22 20:41:39,2022-08-22 20:41:39,34.698,-106.98833,13,123,17292.83, StrTrk 295 9 1.45V -33C 8990Pa ,14000 +2022-08-22 20:42:39,2022-08-22 20:42:39,34.697,-106.98683,9,144,17228.82, StrTrk 296 9 1.44V -32C 9091Pa ,14000 +2022-08-22 20:43:39,2022-08-22 20:43:39,34.6955,-106.98617,7,170,17165.73, StrTrk 297 9 1.43V -32C 9197Pa ,14000 +2022-08-22 20:44:39,2022-08-22 20:44:39,34.6945,-106.98617,4,181,17132.81, StrTrk 298 9 1.44V -32C 9237Pa ,14000 +2022-08-22 20:45:39,2022-08-22 20:45:39,34.69417,-106.98633,2,202,17106.6, StrTrk 299 9 1.42V -31C 9278Pa ,14000 +2022-08-22 20:46:39,2022-08-22 20:46:39,34.69417,-106.9865,2,338,17046.55, StrTrk 300 9 1.43V -31C 9374Pa ,14000 +2022-08-22 20:47:39,2022-08-22 20:47:39,34.69433,-106.987,2,297,16988.64, StrTrk 301 9 1.44V -31C 9472Pa ,14000 +2022-08-22 20:48:39,2022-08-22 20:48:39,34.694,-106.98733,2,214,16925.54, StrTrk 302 9 1.44V -32C 9590Pa ,14000 +2022-08-22 20:49:39,2022-08-22 20:49:39,34.69417,-106.98733,4,38,16865.8, StrTrk 303 9 1.43V -34C 9684Pa ,14000 +2022-08-22 20:50:39,2022-08-22 20:50:39,34.695,-106.98633,7,37,16819.78, StrTrk 304 9 1.43V -34C 9766Pa ,14000 +2022-08-22 20:52:39,2022-08-22 20:52:39,34.69783,-106.98383,11,36,16766.74, StrTrk 306 9 1.44V -33C 9866Pa ,14000 +2022-08-22 20:53:39,2022-08-22 20:53:39,34.69917,-106.98233,11,47,16726.81, StrTrk 307 9 1.44V -33C 9933Pa ,14000 +2022-08-22 20:54:39,2022-08-22 20:54:39,34.7005,-106.98067,13,50,16675.61, StrTrk 308 9 1.44V -33C 10016Pa ,14000 +2022-08-22 20:55:39,2022-08-22 20:55:39,34.70167,-106.97883,11,56,16633.55, StrTrk 309 9 1.45V -32C 10096Pa ,14000 +2022-08-22 20:57:39,2022-08-22 20:57:39,34.70367,-106.97383,17,65,16546.68, StrTrk 311 9 1.45V -31C 10232Pa ,14000 +2022-08-22 20:58:39,2022-08-22 20:58:39,34.705,-106.97083,19,59,16530.52, StrTrk 312 9 1.45V -30C 10246Pa ,14000 +2022-08-22 20:59:39,2022-08-22 20:59:39,34.70717,-106.96783,24,44,16510.71, StrTrk 313 9 1.45V -30C 10296Pa ,14000 +2022-08-22 21:00:39,2022-08-22 21:00:39,34.71,-106.9645,28,41,16468.65, StrTrk 314 9 1.45V -30C 10353Pa ,14000 +2022-08-22 21:02:39,2022-08-22 21:02:39,34.717,-106.957,33,39,16364.71, StrTrk 316 9 1.45V -29C 10545Pa ,14000 +2022-08-22 21:03:39,2022-08-22 21:03:39,34.72083,-106.95283,37,41,16346.73, StrTrk 317 9 1.46V -29C 10578Pa ,14000 +2022-08-22 21:04:39,2022-08-22 21:04:39,34.7245,-106.94867,30,48,16325.7, StrTrk 318 9 1.46V -31C 10628Pa ,14000 +2022-08-22 21:05:39,2022-08-22 21:05:39,34.72717,-106.94467,28,52,16287.6, StrTrk 319 9 1.47V -31C 10701Pa ,14000 +2022-08-22 21:07:38,2022-08-22 21:07:38,34.73167,-106.93683,24,60,16254.68, StrTrk 321 9 1.46V -32C 10755Pa ,14000 +2022-08-22 21:08:39,2022-08-22 21:08:39,34.73367,-106.93283,24,58,16260.78, StrTrk 322 9 1.47V -31C 10744Pa ,14000 +2022-08-22 21:09:38,2022-08-22 21:09:38,34.73667,-106.92933,30,32,16213.53, StrTrk 323 9 1.45V -31C 10836Pa ,14000 +2022-08-22 21:10:38,2022-08-22 21:10:38,34.74117,-106.92667,33,20,16151.66, StrTrk 324 9 1.45V -30C 10956Pa ,14000 +2022-08-22 21:11:38,2022-08-22 21:11:38,34.74633,-106.925,35,9,16095.57, StrTrk 325 9 1.44V -29C 11055Pa ,14000 +2022-08-22 21:12:38,2022-08-22 21:12:38,34.75133,-106.924,31,11,16060.52, StrTrk 326 9 1.44V -29C 11132Pa ,14000 +2022-08-22 21:13:38,2022-08-22 21:13:38,34.756,-106.92267,30,15,16012.67, StrTrk 327 9 1.44V -30C 11225Pa ,14000 +2022-08-22 21:14:38,2022-08-22 21:14:38,34.7605,-106.92117,30,15,16012.67, StrTrk 328 9 1.44V -28C 11223Pa ,14000 +2022-08-22 21:15:38,2022-08-22 21:15:38,34.765,-106.91967,30,15,16024.56, StrTrk 329 9 1.45V -28C 11186Pa ,14000 +2022-08-22 21:17:38,2022-08-22 21:17:38,34.77383,-106.91683,30,14,16034.61, StrTrk 331 9 1.46V -26C 11171Pa ,14000 +2022-08-22 21:18:38,2022-08-22 21:18:38,34.77817,-106.9155,30,12,16012.67, StrTrk 332 9 1.46V -26C 11197Pa ,14000 +2022-08-22 21:19:38,2022-08-22 21:19:38,34.7825,-106.91433,30,11,15995.6, StrTrk 333 9 1.47V -27C 11235Pa ,14000 +2022-08-22 21:20:38,2022-08-22 21:20:38,34.787,-106.91317,30,14,15953.54, StrTrk 334 9 1.47V -27C 11325Pa ,14000 +2022-08-22 21:21:38,2022-08-22 21:21:38,34.7915,-106.9115,30,17,15912.69, StrTrk 335 9 1.48V -27C 11390Pa ,14000 +2022-08-22 21:22:38,2022-08-22 21:22:38,34.79583,-106.90983,30,16,15906.6, StrTrk 336 9 1.48V -27C 11421Pa ,14000 +2022-08-22 21:23:38,2022-08-22 21:23:38,34.80033,-106.90833,30,17,15917.57, StrTrk 337 9 1.48V -26C 11388Pa ,14000 +2022-08-22 21:24:38,2022-08-22 21:24:38,34.80467,-106.9065,28,19,15913.61, StrTrk 338 9 1.48V -26C 11409Pa ,14000 +2022-08-22 21:25:38,2022-08-22 21:25:38,34.80833,-106.90467,24,23,15871.55, StrTrk 339 9 1.48V -27C 11478Pa ,14000 +2022-08-22 21:26:39,2022-08-22 21:26:39,34.8115,-106.90283,20,26,15836.49, StrTrk 340 9 1.48V -27C 11562Pa ,14000 +2022-08-22 21:27:38,2022-08-22 21:27:38,34.8145,-106.901,20,25,15805.71, StrTrk 341 9 1.48V -27C 11618Pa ,14000 +2022-08-22 21:28:38,2022-08-22 21:28:38,34.81733,-106.89933,19,30,15761.51, StrTrk 342 9 1.47V -26C 11708Pa ,14000 +2022-08-22 21:29:38,2022-08-22 21:29:38,34.81933,-106.8975,15,36,15711.53, StrTrk 343 9 1.46V -26C 11806Pa ,14000 +2022-08-22 21:30:38,2022-08-22 21:30:38,34.82133,-106.89583,15,35,15685.62, StrTrk 344 9 1.47V -26C 11848Pa ,14000 +2022-08-22 21:31:38,2022-08-22 21:31:38,34.82317,-106.89433,15,32,15674.64, StrTrk 345 9 1.45V -27C 11888Pa ,14000 +2022-08-22 21:32:38,2022-08-22 21:32:38,34.82533,-106.893,15,23,15651.48, StrTrk 346 9 1.47V -27C 11936Pa ,14000 +2022-08-22 21:33:38,2022-08-22 21:33:38,34.8275,-106.892,15,19,15601.49, StrTrk 347 9 1.47V -26C 12026Pa ,14000 +2022-08-22 21:34:38,2022-08-22 21:34:38,34.82983,-106.891,15,18,15563.7, StrTrk 348 9 1.47V -24C 12105Pa ,14000 +2022-08-22 21:35:38,2022-08-22 21:35:38,34.832,-106.89,13,26,15531.69, StrTrk 349 9 1.47V -25C 12179Pa ,14000 +2022-08-22 21:36:38,2022-08-22 21:36:38,34.83317,-106.888,13,61,15479.57, StrTrk 350 9 1.47V -28C 12298Pa ,14000 +2022-08-22 21:37:38,2022-08-22 21:37:38,34.834,-106.88533,17,71,15456.71, StrTrk 351 9 1.46V -28C 12345Pa ,14000 +2022-08-22 21:38:38,2022-08-22 21:38:38,34.83483,-106.88233,17,72,15428.67, StrTrk 352 9 1.45V -28C 12405Pa ,14000 +2022-08-22 21:39:38,2022-08-22 21:39:38,34.83567,-106.87933,17,74,15410.69, StrTrk 353 9 1.47V -28C 12445Pa ,14000 +2022-08-22 21:40:39,2022-08-22 21:40:39,34.83633,-106.87633,15,75,15368.63, StrTrk 354 9 1.46V -28C 12536Pa ,14000 +2022-08-22 21:41:38,2022-08-22 21:41:38,34.83683,-106.8735,15,80,15333.57, StrTrk 355 9 1.47V -29C 12615Pa ,14000 +2022-08-22 21:43:38,2022-08-22 21:43:38,34.83683,-106.86733,17,98,15268.65, StrTrk 357 9 1.47V -30C 12757Pa ,14000 +2022-08-22 21:45:38,2022-08-22 21:45:38,34.83533,-106.86067,19,110,15195.5, StrTrk 359 9 1.46V -30C 12925Pa ,14000 +2022-08-22 21:47:38,2022-08-22 21:47:38,34.833,-106.854,20,114,15168.68, StrTrk 361 9 1.48V -27C 12968Pa ,14000 +2022-08-22 21:49:38,2022-08-22 21:49:38,34.83083,-106.84517,26,99,15126.61, StrTrk 363 9 1.48V -27C 13076Pa ,14000 +2022-08-22 21:50:38,2022-08-22 21:50:38,34.83,-106.84,28,100,15117.47, StrTrk 364 9 1.47V -26C 13076Pa ,14000 +2022-08-22 21:51:38,2022-08-22 21:51:38,34.82917,-106.83467,28,103,15097.66, StrTrk 365 9 1.47V -25C 13128Pa ,14000 +2022-08-22 21:52:38,2022-08-22 21:52:38,34.828,-106.82917,30,103,15084.55, StrTrk 366 9 1.47V -25C 13159Pa ,14000 +2022-08-22 21:53:38,2022-08-22 21:53:38,34.827,-106.82333,33,100,15075.71, StrTrk 367 9 1.46V -25C 13178Pa ,14000 +2022-08-22 21:54:38,2022-08-22 21:54:38,34.82617,-106.8175,31,100,15086.69, StrTrk 368 9 1.47V -24C 13149Pa ,14000 +2022-08-22 21:55:38,2022-08-22 21:55:38,34.82517,-106.8115,33,101,15072.66, StrTrk 369 9 1.47V -25C 13187Pa ,14000 +2022-08-22 21:56:38,2022-08-22 21:56:38,34.82417,-106.80517,33,100,15061.69, StrTrk 370 9 1.47V -25C 13209Pa ,14000 +2022-08-22 21:57:38,2022-08-22 21:57:38,34.82317,-106.799,35,101,15032.43, StrTrk 371 9 1.47V -26C 13281Pa ,14000 +2022-08-22 21:58:38,2022-08-22 21:58:38,34.82217,-106.7925,37,97,14980.62, StrTrk 372 9 1.47V -27C 13408Pa ,14000 +2022-08-22 21:59:38,2022-08-22 21:59:38,34.82167,-106.7855,37,92,14940.69, StrTrk 373 9 1.47V -27C 13502Pa ,14000 +2022-08-22 22:00:38,2022-08-22 22:00:38,34.82167,-106.77867,37,87,14898.62, StrTrk 374 9 1.47V -27C 13597Pa ,18000 +2022-08-22 22:01:38,2022-08-22 22:01:38,34.822,-106.77183,37,88,14913.56, StrTrk 375 9 1.45V -26C 13546Pa ,18000 +2022-08-22 22:02:38,2022-08-22 22:02:38,34.82117,-106.76517,35,101,15022.68, StrTrk 376 9 1.46V -27C 13308Pa ,18000 +2022-08-22 22:04:38,2022-08-22 22:04:38,34.81917,-106.75767,9,142,15349.73, StrTrk 378 9 1.45V -34C 12638Pa ,18000 +2022-08-22 22:05:38,2022-08-22 22:05:38,34.8195,-106.7585,7,347,15496.64, StrTrk 379 9 1.44V -35C 12304Pa ,18000 +2022-08-22 22:06:38,2022-08-22 22:06:38,34.8215,-106.75833,19,35,15687.75, StrTrk 380 9 1.44V -36C 11912Pa ,18000 +2022-08-22 22:07:38,2022-08-22 22:07:38,34.82433,-106.75567,19,48,15845.64, StrTrk 381 9 1.41V -35C 11577Pa ,18000 +2022-08-22 22:08:38,2022-08-22 22:08:38,34.827,-106.75317,28,17,16019.68, StrTrk 382 9 1.40V -35C 11236Pa ,18000 +2022-08-22 22:09:38,2022-08-22 22:09:38,34.83117,-106.75167,28,44,16169.64, StrTrk 383 9 1.39V -36C 10952Pa ,18000 +2022-08-22 22:10:38,2022-08-22 22:10:38,34.83417,-106.7475,26,55,16298.57, StrTrk 384 9 1.38V -36C 10701Pa ,18000 +2022-08-22 22:12:42,2022-08-22 22:12:42,34.836,-106.7365,35,80,16638.73, StrTrk 386 9 1.37V -37C 10100Pa ,18000 +2022-08-22 22:13:38,2022-08-22 22:13:38,34.83467,-106.73183,17,134,16812.77, StrTrk 387 9 1.36V -36C 9783Pa ,18000 +2022-08-22 22:15:38,2022-08-22 22:15:38,34.83333,-106.72717,9,56,17093.79, StrTrk 389 9 1.36V -38C 9327Pa ,18000 +2022-08-22 22:16:38,2022-08-22 22:16:38,34.8345,-106.72583,11,81,17213.58, StrTrk 390 9 1.36V -38C 9136Pa ,18000 +2022-08-22 22:17:38,2022-08-22 22:17:38,34.83333,-106.72333,6,149,17349.83, StrTrk 391 9 1.35V -36C 8906Pa ,18000 +2022-08-22 22:18:38,2022-08-22 22:18:38,34.83183,-106.72317,9,257,17501.62, StrTrk 392 9 1.35V -36C 8674Pa ,18000 +2022-08-22 22:19:38,2022-08-22 22:19:38,34.83067,-106.72667,17,262,17636.64, StrTrk 393 9 1.36V -37C 8478Pa ,18000 +2022-08-22 22:21:42,2022-08-22 22:21:42,34.83283,-106.7335,22,292,17822.57, StrTrk 395 9 1.37V -37C 8203Pa ,18000 +2022-08-22 22:22:38,2022-08-22 22:22:38,34.83433,-106.73717,24,297,17926.81, StrTrk 396 9 1.39V -36C 8055Pa ,18000 +2022-08-22 22:23:38,2022-08-22 22:23:38,34.8365,-106.74117,28,311,18009.72, StrTrk 397 9 1.39V -35C 7930Pa ,18000 +2022-08-22 22:24:38,2022-08-22 22:24:38,34.83883,-106.74583,33,295,18081.65, StrTrk 398 9 1.40V -34C 7844Pa ,18000 +2022-08-22 22:25:38,2022-08-22 22:25:38,34.84117,-106.7505,24,306,17980.76, StrTrk 399 9 1.41V -34C 7967Pa ,18000 +2022-08-22 22:26:38,2022-08-22 22:26:38,34.843,-106.75433,24,303,17989.6, StrTrk 400 9 1.41V -33C 7956Pa ,18000 +2022-08-22 22:27:38,2022-08-22 22:27:38,34.8455,-106.75817,26,304,18056.66, StrTrk 401 9 1.43V -31C 7870Pa ,18000 +2022-08-22 22:28:38,2022-08-22 22:28:38,34.848,-106.76183,24,308,17997.83, StrTrk 402 9 1.43V -31C 7954Pa ,18000 +2022-08-22 22:29:38,2022-08-22 22:29:38,34.84967,-106.76517,22,302,17993.87, StrTrk 403 9 1.43V -29C 7957Pa ,18000 +2022-08-22 22:30:38,2022-08-22 22:30:38,34.85217,-106.76883,26,306,18066.72, StrTrk 404 9 1.43V -28C 7866Pa ,18000 +2022-08-22 22:31:38,2022-08-22 22:31:38,34.85433,-106.7725,20,310,18020.69, StrTrk 405 9 1.43V -29C 7934Pa ,18000 +2022-08-22 22:33:38,2022-08-22 22:33:38,34.858,-106.77867,24,315,18096.59, StrTrk 407 9 1.44V -27C 7829Pa ,18000 +2022-08-22 22:34:39,2022-08-22 22:34:39,34.86017,-106.78167,19,298,17988.69, StrTrk 408 9 1.44V -28C 7969Pa ,18000 +2022-08-22 22:35:38,2022-08-22 22:35:38,34.8615,-106.785,20,298,18024.65, StrTrk 409 9 1.45V -28C 7926Pa ,18000 +2022-08-22 22:36:38,2022-08-22 22:36:38,34.86383,-106.78817,24,316,18079.82, StrTrk 410 9 1.45V -25C 7850Pa ,18000 +2022-08-22 22:37:38,2022-08-22 22:37:38,34.86583,-106.79117,17,296,17991.73, StrTrk 411 9 1.46V -27C 7974Pa ,18000 +2022-08-22 22:38:38,2022-08-22 22:38:38,34.86717,-106.79417,20,305,18019.78, StrTrk 412 9 1.45V -26C 7938Pa ,18000 +2022-08-22 22:39:38,2022-08-22 22:39:38,34.86967,-106.79717,26,314,18081.65, StrTrk 413 9 1.46V -25C 7854Pa ,18000 +2022-08-22 22:40:38,2022-08-22 22:40:38,34.87267,-106.80017,22,320,18029.83, StrTrk 414 9 1.46V -26C 7936Pa ,18000 +2022-08-22 22:41:38,2022-08-22 22:41:38,34.87467,-106.80283,20,314,18041.72, StrTrk 415 9 1.46V -25C 7903Pa ,18000 +2022-08-22 22:42:38,2022-08-22 22:42:38,34.878,-106.80533,24,331,18091.71, StrTrk 416 9 1.47V -23C 7852Pa ,18000 +2022-08-22 22:44:38,2022-08-22 22:44:38,34.88283,-106.81017,24,324,18055.74, StrTrk 418 9 1.46V -24C 7881Pa ,18000 +2022-08-22 22:45:38,2022-08-22 22:45:38,34.88617,-106.813,28,324,18081.65, StrTrk 419 9 1.47V -24C 7856Pa ,18000 +2022-08-22 22:46:38,2022-08-22 22:46:38,34.8895,-106.81583,24,321,17995.7, StrTrk 420 9 1.47V -24C 7974Pa ,18000 +2022-08-22 22:47:38,2022-08-22 22:47:38,34.89283,-106.81883,30,316,18080.74, StrTrk 421 9 1.47V -22C 7853Pa ,18000 +2022-08-22 22:48:39,2022-08-22 22:48:39,34.89633,-106.823,30,317,18100.85, StrTrk 422 9 1.47V -22C 7837Pa ,18000 +2022-08-22 22:49:38,2022-08-22 22:49:38,34.8995,-106.826,22,321,17998.74, StrTrk 423 9 1.47V -24C 7972Pa ,18000 +2022-08-22 22:50:38,2022-08-22 22:50:38,34.90267,-106.82867,30,318,18056.66, StrTrk 424 9 1.47V -25C 7892Pa ,18000 +2022-08-22 22:51:39,2022-08-22 22:51:39,34.90583,-106.833,30,309,18097.8, StrTrk 425 9 1.48V -23C 7840Pa ,18000 +2022-08-22 22:52:38,2022-08-22 22:52:38,34.90867,-106.8365,24,320,18028.62, StrTrk 426 9 1.47V -22C 7942Pa ,18000 +2022-08-22 22:53:38,2022-08-22 22:53:38,34.91167,-106.8395,28,314,18061.84, StrTrk 427 9 1.47V -22C 7887Pa ,18000 +2022-08-22 22:54:38,2022-08-22 22:54:38,34.91433,-106.84383,31,309,18068.85, StrTrk 428 9 1.48V -22C 7880Pa ,18000 +2022-08-22 22:55:38,2022-08-22 22:55:38,34.91717,-106.84717,24,324,18024.65, StrTrk 429 9 1.48V -22C 7939Pa ,18000 +2022-08-22 22:56:38,2022-08-22 22:56:38,34.92017,-106.85033,26,309,18113.65, StrTrk 430 9 1.48V -21C 7821Pa ,18000 +2022-08-22 22:57:38,2022-08-22 22:57:38,34.92317,-106.85417,28,325,18067.63, StrTrk 431 9 1.48V -22C 7888Pa ,18000 +2022-08-22 22:58:38,2022-08-22 22:58:38,34.92567,-106.85717,22,314,18000.88, StrTrk 432 9 1.48V -25C 7968Pa ,18000 +2022-08-22 22:59:38,2022-08-22 22:59:38,34.929,-106.85983,28,319,18098.72, StrTrk 433 9 1.48V -24C 7833Pa ,18000 +2022-08-22 23:00:38,2022-08-22 23:00:38,34.932,-106.86367,26,316,18124.63, StrTrk 434 9 1.49V -23C 7805Pa ,18000 +2022-08-22 23:01:39,2022-08-22 23:01:39,34.93467,-106.86667,20,301,18015.81, StrTrk 435 9 1.48V -26C 7942Pa ,18000 +2022-08-22 23:02:38,2022-08-22 23:02:38,34.93617,-106.86983,22,311,18065.8, StrTrk 436 9 1.48V -22C 7880Pa ,18000 +2022-08-22 23:03:38,2022-08-22 23:03:38,34.93883,-106.87283,22,312,18066.72, StrTrk 437 9 1.48V -21C 7880Pa ,18000 +2022-08-22 23:04:38,2022-08-22 23:04:38,34.94067,-106.87583,19,298,17991.73, StrTrk 438 9 1.48V -24C 7978Pa ,18000 +2022-08-22 23:05:38,2022-08-22 23:05:38,34.9425,-106.87883,33,342,18088.66, StrTrk 439 9 1.48V -22C 7853Pa ,18000 +2022-08-22 23:06:38,2022-08-22 23:06:38,34.94533,-106.8815,20,313,18054.83, StrTrk 440 9 1.47V -20C 7898Pa ,18000 +2022-08-22 23:07:38,2022-08-22 23:07:38,34.94683,-106.88467,19,296,17954.85, StrTrk 441 9 1.47V -22C 8027Pa ,18000 +2022-08-22 23:08:38,2022-08-22 23:08:38,34.94867,-106.888,24,313,18039.59, StrTrk 442 9 1.47V -22C 7914Pa ,18000 +2022-08-22 23:09:38,2022-08-22 23:09:38,34.95167,-106.891,24,321,18113.65, StrTrk 443 9 1.48V -21C 7819Pa ,18000 +2022-08-22 23:10:38,2022-08-22 23:10:38,34.95433,-106.8935,20,312,18039.59, StrTrk 444 9 1.48V -23C 7924Pa ,18000 +2022-08-22 23:11:38,2022-08-22 23:11:38,34.95567,-106.89633,17,300,17963.69, StrTrk 445 9 1.47V -23C 8015Pa ,18000 +2022-08-22 23:12:38,2022-08-22 23:12:38,34.9575,-106.89917,22,321,18030.75, StrTrk 446 9 1.48V -24C 7915Pa ,18000 +2022-08-22 23:14:38,2022-08-22 23:14:38,34.96367,-106.90433,19,308,17994.78, StrTrk 448 9 1.47V -23C 7977Pa ,18000 +2022-08-22 23:16:38,2022-08-22 23:16:38,34.96833,-106.90983,24,326,18131.64, StrTrk 450 9 1.48V -22C 7794Pa ,18000 +2022-08-22 23:17:38,2022-08-22 23:17:38,34.9705,-106.91267,20,301,17987.77, StrTrk 451 9 1.48V -25C 7985Pa ,18000 +2022-08-22 23:18:38,2022-08-22 23:18:38,34.97233,-106.91533,20,310,17956.68, StrTrk 452 9 1.47V -24C 8022Pa ,18000 +2022-08-22 23:21:38,2022-08-22 23:21:38,34.978,-106.92433,19,308,17995.7, StrTrk 455 9 1.47V -25C 7975Pa ,18000 +2022-08-22 23:22:38,2022-08-22 23:22:38,34.97967,-106.92717,17,305,17998.74, StrTrk 456 9 1.47V -25C 7961Pa ,18000 +2022-08-22 23:23:38,2022-08-22 23:23:38,34.9815,-106.92983,19,304,18083.78, StrTrk 457 9 1.47V -25C 7854Pa ,18000 +2022-08-22 23:24:38,2022-08-22 23:24:38,34.98333,-106.9325,19,310,18054.83, StrTrk 458 9 1.47V -26C 7893Pa ,18000 +2022-08-22 23:25:38,2022-08-22 23:25:38,34.985,-106.93467,19,304,17923.76, StrTrk 459 9 1.47V -28C 8054Pa ,18000 +2022-08-22 23:26:38,2022-08-22 23:26:38,34.98683,-106.93717,17,316,17978.63, StrTrk 460 9 1.47V -27C 7978Pa ,18000 +2022-08-22 23:27:38,2022-08-22 23:27:38,34.9885,-106.93967,17,314,18050.87, StrTrk 461 9 1.47V -26C 7888Pa ,18000 +2022-08-22 23:28:38,2022-08-22 23:28:38,34.99067,-106.94167,17,322,18092.62, StrTrk 462 9 1.46V -24C 7835Pa ,18000 +2022-08-22 23:29:38,2022-08-22 23:29:38,34.99233,-106.94383,15,311,17953.63, StrTrk 463 9 1.47V -27C 8031Pa ,18000 +2022-08-22 23:30:38,2022-08-22 23:30:38,34.9935,-106.94583,15,323,17948.76, StrTrk 464 9 1.46V -26C 8030Pa ,16000 +2022-08-22 23:31:38,2022-08-22 23:31:38,34.9955,-106.9475,17,318,17992.65, StrTrk 465 9 1.45V -23C 7983Pa ,16000 +2022-08-22 23:32:38,2022-08-22 23:32:38,34.9975,-106.94917,13,328,17910.66, StrTrk 466 9 1.45V -25C 8094Pa ,16000 +2022-08-22 23:33:38,2022-08-22 23:33:38,34.998,-106.951,9,244,17721.68, StrTrk 467 9 1.45V -29C 8353Pa ,16000 +2022-08-22 23:35:38,2022-08-22 23:35:38,34.9965,-106.9555,13,183,17314.77, StrTrk 469 9 1.45V -32C 8968Pa ,16000 +2022-08-22 23:36:38,2022-08-22 23:36:38,34.9945,-106.95417,13,146,17130.67, StrTrk 470 9 1.45V -31C 9252Pa ,16000 +2022-08-22 23:38:38,2022-08-22 23:38:38,34.99367,-106.95033,17,72,16842.64, StrTrk 472 9 1.44V -32C 9716Pa ,16000 +2022-08-22 23:39:38,2022-08-22 23:39:38,34.99417,-106.947,19,82,16830.75, StrTrk 473 9 1.44V -32C 9733Pa ,16000 +2022-08-22 23:42:38,2022-08-22 23:42:38,34.99467,-106.93617,24,96,16749.67, StrTrk 476 9 1.45V -30C 9879Pa ,16000 +2022-08-22 23:43:38,2022-08-22 23:43:38,34.99433,-106.9315,26,95,16696.64, StrTrk 477 9 1.45V -29C 9967Pa ,16000 +2022-08-22 23:44:38,2022-08-22 23:44:38,34.994,-106.92617,30,92,16662.81, StrTrk 478 9 1.45V -28C 10020Pa ,16000 +2022-08-22 23:45:38,2022-08-22 23:45:38,34.994,-106.9205,31,86,16598.8, StrTrk 479 9 1.45V -28C 10133Pa ,16000 +2022-08-22 23:46:38,2022-08-22 23:46:38,34.99433,-106.914,39,82,16542.72, StrTrk 480 9 1.44V -28C 10222Pa ,16000 +2022-08-22 23:47:38,2022-08-22 23:47:38,34.99517,-106.90717,35,80,16532.66, StrTrk 481 9 1.44V -26C 10249Pa ,16000 +2022-08-22 23:48:38,2022-08-22 23:48:38,34.99583,-106.90133,28,83,16493.64, StrTrk 482 9 1.44V -27C 10327Pa ,16000 +2022-08-22 23:49:38,2022-08-22 23:49:38,34.99633,-106.89667,22,83,16443.66, StrTrk 483 9 1.43V -27C 10419Pa ,16000 +2022-08-22 23:50:38,2022-08-22 23:50:38,34.99683,-106.8925,22,79,16409.52, StrTrk 484 9 1.44V -29C 10475Pa ,16000 +2022-08-22 23:51:38,2022-08-22 23:51:38,34.998,-106.88767,31,65,16337.58, StrTrk 485 9 1.44V -30C 10621Pa ,16000 +2022-08-22 23:52:38,2022-08-22 23:52:38,35.00017,-106.88167,37,67,16283.64, StrTrk 486 9 1.43V -29C 10711Pa ,16000 +2022-08-22 23:53:38,2022-08-22 23:53:38,35.00283,-106.87517,41,63,16239.74, StrTrk 487 9 1.43V -29C 10795Pa ,16000 +2022-08-22 23:54:38,2022-08-22 23:54:38,35.00583,-106.86833,46,59,16188.54, StrTrk 488 9 1.44V -28C 10888Pa ,16000 +2022-08-22 23:55:38,2022-08-22 23:55:38,35.00967,-106.861,46,53,16146.78, StrTrk 489 9 1.43V -27C 10960Pa ,16000 +2022-08-22 23:56:38,2022-08-22 23:56:38,35.01433,-106.8545,46,46,16116.6, StrTrk 490 9 1.42V -27C 11021Pa ,16000 +2022-08-22 23:57:38,2022-08-22 23:57:38,35.01917,-106.84817,48,47,16144.65, StrTrk 491 9 1.41V -25C 10962Pa ,16000 +2022-08-22 23:58:38,2022-08-22 23:58:38,35.02417,-106.84167,48,46,16101.67, StrTrk 492 9 1.41V -25C 11036Pa ,16000 +2022-08-22 23:59:38,2022-08-22 23:59:38,35.02933,-106.83517,48,46,16107.77, StrTrk 493 9 1.42V -24C 11022Pa ,16000 +2022-08-23 00:00:38,2022-08-23 00:00:38,35.03433,-106.8285,48,47,16117.52, StrTrk 494 9 1.41V -23C 11015Pa ,16000 +2022-08-23 00:01:38,2022-08-23 00:01:38,35.0395,-106.822,48,45,16071.49, StrTrk 495 9 1.43V -23C 11105Pa ,16000 +2022-08-23 00:02:39,2022-08-23 00:02:39,35.0445,-106.81567,48,46,16075.76, StrTrk 496 9 1.43V -22C 11087Pa ,16000 +2022-08-23 00:03:39,2022-08-23 00:03:39,35.0495,-106.80917,46,46,16030.65, StrTrk 497 9 1.43V -24C 11176Pa ,16000 +2022-08-23 00:04:38,2022-08-23 00:04:38,35.0545,-106.80267,48,48,16082.77, StrTrk 498 9 1.43V -24C 11061Pa ,16000 +2022-08-23 00:05:38,2022-08-23 00:05:38,35.0595,-106.79567,52,49,16114.78, StrTrk 499 9 1.43V -25C 11013Pa ,16000 +2022-08-23 00:06:38,2022-08-23 00:06:38,35.06433,-106.78883,48,49,16062.66, StrTrk 500 9 1.44V -28C 11114Pa ,16000 +2022-08-23 00:08:38,2022-08-23 00:08:38,35.07367,-106.77483,50,52,16110.51, StrTrk 502 9 1.44V -27C 11030Pa ,16000 +2022-08-23 00:09:38,2022-08-23 00:09:38,35.0785,-106.76783,46,50,16005.66, StrTrk 503 9 1.45V -29C 11235Pa ,16000 +2022-08-23 00:10:38,2022-08-23 00:10:38,35.08283,-106.76083,48,54,16011.75, StrTrk 504 9 1.44V -28C 11209Pa ,16000 +2022-08-23 00:11:38,2022-08-23 00:11:38,35.086,-106.75367,35,68,16071.49, StrTrk 505 9 1.45V -30C 11107Pa ,16000 +2022-08-23 00:13:39,2022-08-23 00:13:39,35.08633,-106.74333,33,84,16131.54, StrTrk 507 9 1.45V -32C 11009Pa ,16000 +2022-08-23 00:14:38,2022-08-23 00:14:38,35.089,-106.7365,44,58,16078.5, StrTrk 508 9 1.44V -32C 11116Pa ,16000 +2022-08-23 00:16:38,2022-08-23 00:16:38,35.09617,-106.72267,41,60,16102.58, StrTrk 510 9 1.43V -30C 11047Pa ,16000 +2022-08-23 00:17:38,2022-08-23 00:17:38,35.0995,-106.71567,48,55,16027.6, StrTrk 511 9 1.42V -31C 11199Pa ,16000 +2022-08-23 00:18:38,2022-08-23 00:18:38,35.1035,-106.7085,44,59,16070.58, StrTrk 512 9 1.41V -29C 11114Pa ,16000 +2022-08-23 00:19:38,2022-08-23 00:19:38,35.1065,-106.70167,39,67,16117.52, StrTrk 513 9 1.41V -30C 11012Pa ,16000 +2022-08-23 00:20:38,2022-08-23 00:20:38,35.10883,-106.69467,43,64,16120.57, StrTrk 514 9 1.41V -31C 11033Pa ,16000 +2022-08-23 00:21:38,2022-08-23 00:21:38,35.11233,-106.68767,44,57,16103.5, StrTrk 515 9 1.41V -30C 11048Pa ,16000 +2022-08-23 00:22:38,2022-08-23 00:22:38,35.116,-106.68067,44,57,16135.5, StrTrk 516 9 1.41V -27C 10974Pa ,16000 +2022-08-23 00:23:38,2022-08-23 00:23:38,35.11967,-106.67383,41,57,16108.68, StrTrk 517 9 1.41V -26C 11029Pa ,16000 +2022-08-23 00:24:38,2022-08-23 00:24:38,35.12333,-106.66733,43,56,16177.56, StrTrk 518 9 1.41V -27C 10886Pa ,16000 +2022-08-23 00:25:38,2022-08-23 00:25:38,35.1255,-106.66133,33,71,16284.55, StrTrk 519 9 1.40V -29C 10671Pa ,16000 +2022-08-23 00:26:38,2022-08-23 00:26:38,35.12633,-106.656,26,78,16388.79, StrTrk 520 9 1.39V -30C 10501Pa ,16000 +2022-08-23 00:27:38,2022-08-23 00:27:38,35.1265,-106.65133,24,87,16447.62, StrTrk 521 9 1.40V -33C 10393Pa ,16000 +2022-08-23 00:28:38,2022-08-23 00:28:38,35.127,-106.6465,28,79,16369.59, StrTrk 522 9 1.41V -34C 10556Pa ,16000 +2022-08-23 00:29:38,2022-08-23 00:29:38,35.128,-106.64117,30,73,16305.58, StrTrk 523 9 1.41V -32C 10671Pa ,16000 +2022-08-23 00:30:38,2022-08-23 00:30:38,35.1295,-106.63567,31,68,16224.5, StrTrk 524 9 1.41V -31C 10826Pa ,16000 +2022-08-23 00:31:39,2022-08-23 00:31:39,35.131,-106.63033,26,79,16243.71, StrTrk 525 9 1.40V -30C 10781Pa ,16000 +2022-08-23 00:32:39,2022-08-23 00:32:39,35.13167,-106.6255,24,88,16320.52, StrTrk 526 9 1.40V -29C 10633Pa ,16000 +2022-08-23 00:33:38,2022-08-23 00:33:38,35.131,-106.62117,24,98,16340.63, StrTrk 527 9 1.40V -31C 10613Pa ,16000 +2022-08-23 00:34:38,2022-08-23 00:34:38,35.13083,-106.6165,26,84,16235.78, StrTrk 528 9 1.40V -35C 10823Pa ,16000 +2022-08-23 00:35:38,2022-08-23 00:35:38,35.13133,-106.6115,22,85,16253.76, StrTrk 529 9 1.40V -35C 10798Pa ,16000 +2022-08-23 00:36:38,2022-08-23 00:36:38,35.13117,-106.607,26,102,16313.51, StrTrk 530 9 1.41V -34C 10679Pa ,16000 +2022-08-23 00:37:38,2022-08-23 00:37:38,35.12967,-106.6025,26,111,16339.72, StrTrk 531 9 1.41V -34C 10623Pa ,16000 +2022-08-23 00:38:38,2022-08-23 00:38:38,35.129,-106.5975,28,94,16282.72, StrTrk 532 9 1.41V -33C 10724Pa ,16000 +2022-08-23 00:39:38,2022-08-23 00:39:38,35.12883,-106.592,30,91,16283.64, StrTrk 533 9 1.40V -32C 10722Pa ,16000 +2022-08-23 00:40:38,2022-08-23 00:40:38,35.12867,-106.58617,31,90,16278.76, StrTrk 534 9 1.41V -31C 10725Pa ,16000 +2022-08-23 00:41:38,2022-08-23 00:41:38,35.12883,-106.58,33,88,16230.6, StrTrk 535 9 1.41V -31C 10806Pa ,16000 +2022-08-23 00:43:38,2022-08-23 00:43:38,35.12833,-106.56833,30,94,16300.7, StrTrk 537 9 1.40V -30C 10677Pa ,16000 +2022-08-23 00:44:38,2022-08-23 00:44:38,35.128,-106.56267,30,88,16263.52, StrTrk 538 9 1.40V -30C 10742Pa ,16000 +2022-08-23 00:45:38,2022-08-23 00:45:38,35.128,-106.55667,31,91,16285.77, StrTrk 539 9 1.39V -31C 10711Pa ,16000 +2022-08-23 00:46:38,2022-08-23 00:46:38,35.12817,-106.55083,33,86,16257.73, StrTrk 540 9 1.40V -32C 10761Pa ,16000 +2022-08-23 00:47:38,2022-08-23 00:47:38,35.12867,-106.5445,33,83,16237.61, StrTrk 541 9 1.41V -32C 10797Pa ,16000 +2022-08-23 00:48:38,2022-08-23 00:48:38,35.129,-106.53883,30,90,16300.7, StrTrk 542 9 1.41V -32C 10669Pa ,16000 +2022-08-23 00:50:38,2022-08-23 00:50:38,35.129,-106.5275,33,89,16272.66, StrTrk 544 9 1.41V -32C 10738Pa ,16000 +2022-08-23 00:51:38,2022-08-23 00:51:38,35.12933,-106.521,35,83,16258.64, StrTrk 545 9 1.40V -32C 10765Pa ,16000 +2022-08-23 00:52:38,2022-08-23 00:52:38,35.13,-106.51417,39,83,16230.6, StrTrk 546 9 1.40V -32C 10817Pa ,16000 +2022-08-23 00:53:39,2022-08-23 00:53:39,35.13083,-106.5075,35,82,16247.67, StrTrk 547 9 1.39V -32C 10767Pa ,16000 +2022-08-23 00:54:38,2022-08-23 00:54:38,35.13133,-106.50117,33,85,16241.57, StrTrk 548 9 1.39V -32C 10788Pa ,16000 +2022-08-23 00:55:38,2022-08-23 00:55:38,35.132,-106.4945,35,80,16239.74, StrTrk 549 9 1.40V -34C 10784Pa ,16000 +2022-08-23 00:57:38,2022-08-23 00:57:38,35.13383,-106.4815,39,78,16241.57, StrTrk 551 9 1.41V -33C 10789Pa ,16000 +2022-08-23 00:58:38,2022-08-23 00:58:38,35.13517,-106.47383,43,78,16247.67, StrTrk 552 9 1.41V -33C 10782Pa ,16000 +2022-08-23 00:59:38,2022-08-23 00:59:38,35.13617,-106.4665,39,80,16272.66, StrTrk 553 9 1.40V -34C 10740Pa ,16000 +2022-08-23 01:00:38,2022-08-23 01:00:38,35.1375,-106.45883,44,77,16183.66, StrTrk 554 9 1.41V -34C 10922Pa ,16000 +2022-08-23 01:01:38,2022-08-23 01:01:38,35.139,-106.45083,43,79,16230.6, StrTrk 555 9 1.41V -33C 10819Pa ,16000 +2022-08-23 01:02:38,2022-08-23 01:02:38,35.14,-106.44283,43,81,16251.63, StrTrk 556 9 1.40V -33C 10781Pa ,16000 +2022-08-23 01:03:38,2022-08-23 01:03:38,35.14117,-106.43467,44,78,16183.66, StrTrk 557 9 1.39V -35C 10920Pa ,16000 +2022-08-23 01:04:38,2022-08-23 01:04:38,35.14283,-106.42717,39,74,16130.63, StrTrk 558 9 1.39V -34C 11008Pa ,14000 +2022-08-23 01:05:38,2022-08-23 01:05:38,35.14433,-106.42033,35,76,16076.68, StrTrk 559 9 1.38V -35C 11121Pa ,14000 +2022-08-23 01:06:38,2022-08-23 01:06:38,35.14567,-106.4145,31,71,16007.49, StrTrk 560 9 1.38V -36C 11272Pa ,14000 +2022-08-23 01:07:38,2022-08-23 01:07:38,35.14733,-106.4095,26,63,15948.66, StrTrk 561 9 1.38V -36C 11388Pa ,14000 +2022-08-23 01:08:42,2022-08-23 01:08:42,35.149,-106.40483,28,65,15899.59, StrTrk 562 9 1.37V -36C 11475Pa ,14000 +2022-08-23 01:09:42,2022-08-23 01:09:42,35.151,-106.39967,35,64,15865.75, StrTrk 563 9 1.38V -38C 11578Pa ,14000 +2022-08-23 01:10:42,2022-08-23 01:10:42,35.15383,-106.39333,43,59,15798.7, StrTrk 564 9 1.38V -38C 11708Pa ,14000 +2022-08-23 01:11:38,2022-08-23 01:11:38,35.15733,-106.38667,41,55,15744.75, StrTrk 565 9 1.37V -37C 11797Pa ,14000 +2022-08-23 01:12:38,2022-08-23 01:12:38,35.16067,-106.38067,39,53,15676.47, StrTrk 566 9 1.36V -37C 11943Pa ,14000 +2022-08-23 01:13:38,2022-08-23 01:13:38,35.1645,-106.375,39,50,15581.68, StrTrk 567 9 1.36V -37C 12152Pa ,14000 +2022-08-23 01:14:38,2022-08-23 01:14:38,35.16833,-106.36967,37,46,15492.68, StrTrk 568 9 1.36V -37C 12333Pa ,14000 +2022-08-23 01:15:39,2022-08-23 01:15:39,35.1725,-106.36483,39,41,15422.58, StrTrk 569 9 1.35V -36C 12480Pa ,14000 +2022-08-23 01:16:38,2022-08-23 01:16:38,35.177,-106.36017,37,38,15356.74, StrTrk 570 9 1.36V -36C 12618Pa ,14000 +2022-08-23 01:17:38,2022-08-23 01:17:38,35.181,-106.356,33,44,15275.66, StrTrk 571 9 1.35V -38C 12795Pa ,14000 +2022-08-23 01:18:38,2022-08-23 01:18:38,35.18383,-106.35167,26,65,15192.45, StrTrk 572 9 1.36V -39C 13009Pa ,14000 +2022-08-23 01:19:38,2022-08-23 01:19:38,35.18533,-106.34717,26,67,15153.44, StrTrk 573 9 1.35V -39C 13083Pa ,14000 +2022-08-23 01:20:38,2022-08-23 01:20:38,35.1875,-106.34317,28,47,15219.58, StrTrk 574 9 1.36V -38C 12925Pa ,14000 +2022-08-23 01:21:38,2022-08-23 01:21:38,35.19083,-106.339,30,42,15299.74, StrTrk 575 9 1.37V -39C 12774Pa ,14000 +2022-08-23 01:22:39,2022-08-23 01:22:39,35.19483,-106.335,37,44,15376.55, StrTrk 576 9 1.36V -39C 12603Pa ,14000 +2022-08-23 01:24:38,2022-08-23 01:24:38,35.20233,-106.32483,37,54,15595.7, StrTrk 578 9 1.36V -41C 12150Pa ,14000 +2022-08-23 01:25:38,2022-08-23 01:25:38,35.20517,-106.31833,37,62,15697.5, StrTrk 579 9 1.36V -40C 11932Pa ,14000 +2022-08-23 01:26:38,2022-08-23 01:26:38,35.20767,-106.3115,39,70,15829.48, StrTrk 580 9 1.35V -41C 11683Pa ,14000 +2022-08-23 01:27:38,2022-08-23 01:27:38,35.20967,-106.30567,30,69,15926.71, StrTrk 581 9 1.35V -42C 11492Pa ,14000 +2022-08-23 01:28:38,2022-08-23 01:28:38,35.21133,-106.3,35,69,16025.77, StrTrk 582 9 1.34V -42C 11286Pa ,14000 +2022-08-23 01:29:38,2022-08-23 01:29:38,35.213,-106.29333,39,73,16136.72, StrTrk 583 9 1.34V -42C 11072Pa ,14000 +2022-08-23 01:30:38,2022-08-23 01:30:38,35.21417,-106.28533,46,81,16262.6, StrTrk 584 9 1.33V -41C 10839Pa ,14000 +2022-08-23 01:31:38,2022-08-23 01:31:38,35.21483,-106.27717,41,83,16340.63, StrTrk 585 9 1.32V -42C 10690Pa ,14000 +2022-08-23 01:32:38,2022-08-23 01:32:38,35.21517,-106.27033,35,91,16395.5, StrTrk 586 9 1.33V -43C 10603Pa ,14000 +2022-08-23 01:33:38,2022-08-23 01:33:38,35.21483,-106.26533,20,93,16429.63, StrTrk 587 9 1.32V -43C 10524Pa ,14000 +2022-08-23 01:34:38,2022-08-23 01:34:38,35.21483,-106.26117,24,89,16481.76, StrTrk 588 9 1.33V -43C 10435Pa ,14000 +2022-08-23 01:35:39,2022-08-23 01:35:39,35.21467,-106.25633,24,89,16561.61, StrTrk 589 9 1.33V -43C 10303Pa ,14000 +2022-08-23 01:36:38,2022-08-23 01:36:38,35.21483,-106.252,24,84,16636.59, StrTrk 590 9 1.33V -43C 10147Pa ,14000 +2022-08-23 01:37:38,2022-08-23 01:37:38,35.215,-106.24783,20,95,16708.53, StrTrk 591 9 1.33V -42C 10021Pa ,14000 +2022-08-23 01:38:42,2022-08-23 01:38:42,35.21467,-106.24383,22,98,16746.63, StrTrk 592 9 1.31V -41C 9949Pa ,14000 +2022-08-23 01:39:42,2022-08-23 01:39:42,35.21417,-106.24,20,97,16755.77, StrTrk 593 9 1.32V -42C 9938Pa ,14000 +2022-08-23 01:40:38,2022-08-23 01:40:38,35.214,-106.23633,19,96,16753.64, StrTrk 594 9 1.32V -42C 9950Pa ,14000 +2022-08-23 01:41:38,2022-08-23 01:41:38,35.2135,-106.23267,20,97,16769.79, StrTrk 595 9 1.32V -42C 9907Pa ,14000 +2022-08-23 01:42:38,2022-08-23 01:42:38,35.21317,-106.229,20,98,16771.62, StrTrk 596 9 1.32V -42C 9906Pa ,14000 +2022-08-23 01:43:38,2022-08-23 01:43:38,35.2125,-106.225,22,105,16771.62, StrTrk 597 9 1.32V -42C 9927Pa ,14000 +2022-08-23 01:44:42,2022-08-23 01:44:42,35.2115,-106.221,22,104,16752.72, StrTrk 598 9 1.32V -42C 9957Pa ,14000 +2022-08-23 01:45:41,2022-08-23 01:45:41,35.21083,-106.21683,22,102,16722.55, StrTrk 599 9 1.32V -42C 10004Pa ,14000 +2022-08-23 01:46:38,2022-08-23 01:46:38,35.21,-106.21283,22,102,16688.71, StrTrk 600 9 1.33V -42C 10058Pa ,14000 +2022-08-23 01:47:38,2022-08-23 01:47:38,35.20933,-106.20867,24,98,16667.68, StrTrk 601 9 1.33V -43C 10107Pa ,14000 +2022-08-23 01:48:38,2022-08-23 01:48:38,35.209,-106.204,24,85,16621.66, StrTrk 602 9 1.32V -44C 10213Pa ,14000 +2022-08-23 01:49:38,2022-08-23 01:49:38,35.209,-106.19883,24,100,16446.7, StrTrk 603 9 1.32V -45C 10541Pa ,14000 +2022-08-23 01:50:38,2022-08-23 01:50:38,35.20833,-106.19217,44,94,16228.77, StrTrk 604 9 1.32V -46C 10994Pa ,14000 +2022-08-23 01:51:42,2022-08-23 01:51:42,35.20917,-106.18417,35,81,16050.77, StrTrk 605 9 1.30V -48C 11378Pa ,14000 +2022-08-23 01:52:38,2022-08-23 01:52:38,35.21067,-106.17767,44,68,15899.59, StrTrk 606 9 1.29V -48C 11756Pa ,14000 +2022-08-23 01:53:38,2022-08-23 01:53:38,35.2135,-106.17,48,63,15709.7, StrTrk 607 9 1.28V -49C 12152Pa ,14000 +2022-08-23 01:54:38,2022-08-23 01:54:38,35.21717,-106.1625,28,55,15541.75, StrTrk 608 9 1.28V -50C 12588Pa ,14000 +2022-08-23 01:55:38,2022-08-23 01:55:38,35.22117,-106.15633,41,41,15355.52, StrTrk 609 9 1.25V -50C 13037Pa ,14000 +2022-08-23 01:56:38,2022-08-23 01:56:38,35.22367,-106.15217,0,43,14708.43, StrTrk 610 7 1.23V -51C 14618Pa ,14000 +2022-08-23 01:58:38,2022-08-23 01:58:38,35.226,-106.13067,0,122,13467.59, StrTrk 612 0 1.22V -51C 18191Pa ,14000 +2022-08-23 01:59:38,2022-08-23 01:59:38,35.22733,-106.11417,81,89,12755.58, StrTrk 613 9 1.22V -49C 20111Pa ,14000 +2022-08-23 02:00:39,2022-08-23 02:06:42,35.22817,-106.0995,0,329,13273.43, StrTrk 620 0 1.33V -30C 34206Pa ,14000 diff --git a/balloon_data/SHAB14V-APRS.csv b/balloon_data/SHAB14V-APRS.csv new file mode 100644 index 0000000..b087af6 --- /dev/null +++ b/balloon_data/SHAB14V-APRS.csv @@ -0,0 +1,714 @@ +time,lasttime,lat,lng,speed,course,altitude,comment +2022-08-22 14:37:53,2022-08-22 14:37:53,34.64267,-106.83283,4,262,1556.92," StrTrk 88 9 1.63V 26C 84259Pa " +2022-08-22 14:38:53,2022-08-22 14:38:53,34.64317,-106.83383,4,279,1719.99," StrTrk 89 9 1.62V 27C 83564Pa " +2022-08-22 14:39:53,2022-08-22 14:39:53,34.64200,-106.83367,0,242,1787.04," StrTrk 90 9 1.62V 26C 82696Pa " +2022-08-22 14:40:54,2022-08-22 14:40:54,34.64150,-106.83367,4,125,1876.96," StrTrk 91 9 1.62V 26C 81770Pa " +2022-08-22 14:41:53,2022-08-22 14:41:53,34.64150,-106.83283,6,134,1962.91," StrTrk 92 9 1.62V 25C 80974Pa " +2022-08-22 14:42:54,2022-08-22 14:42:54,34.64150,-106.83200,4,80,2065.93," StrTrk 93 9 1.62V 25C 80014Pa " +2022-08-22 14:43:54,2022-08-22 14:43:54,34.64167,-106.83217,2,271,2150.97," StrTrk 94 9 1.61V 24C 79186Pa " +2022-08-22 14:45:54,2022-08-22 14:45:54,34.64183,-106.83283,2,288,2343.91," StrTrk 96 9 1.62V 23C 77353Pa " +2022-08-22 14:46:53,2022-08-22 14:46:53,34.64150,-106.83333,2,205,2442.06," StrTrk 97 9 1.60V 24C 76472Pa " +2022-08-22 14:47:53,2022-08-22 14:47:53,34.64133,-106.83250,6,64,2531.06," StrTrk 98 9 1.62V 23C 75666Pa " +2022-08-22 14:49:54,2022-08-22 14:49:54,34.64167,-106.83067,2,147,2726.13," StrTrk 100 9 1.61V 22C 73959Pa " +2022-08-22 14:50:53,2022-08-22 14:50:53,34.64150,-106.83033,4,203,2810.87," StrTrk 101 9 1.61V 22C 73196Pa " +2022-08-22 14:51:54,2022-08-22 14:51:54,34.64167,-106.83050,6,174,2891.94," StrTrk 102 9 1.61V 20C 72516Pa " +2022-08-22 14:52:53,2022-08-22 14:52:53,34.64133,-106.82967,2,135,2973.02," StrTrk 103 9 1.60V 20C 71822Pa " +2022-08-22 14:53:53,2022-08-22 14:53:53,34.64100,-106.82800,15,97,3055.01," StrTrk 104 9 1.60V 19C 71096Pa " +2022-08-22 14:54:53,2022-08-22 14:54:53,34.64067,-106.82500,15,114,3151.94," StrTrk 105 9 1.60V 18C 70272Pa " +2022-08-22 14:55:53,2022-08-22 14:55:53,34.63967,-106.82250,17,129,3246.12," StrTrk 106 9 1.60V 18C 69504Pa " +2022-08-22 14:56:53,2022-08-22 14:56:53,34.63750,-106.82017,20,145,3307.08," StrTrk 107 9 1.60V 18C 68974Pa " +2022-08-22 14:57:53,2022-08-22 14:57:53,34.63533,-106.81883,15,152,3379.93," StrTrk 108 9 1.60V 19C 68405Pa " +2022-08-22 14:58:53,2022-08-22 14:58:53,34.63317,-106.81767,17,158,3449.12," StrTrk 109 9 1.59V 20C 67827Pa " +2022-08-22 14:59:53,2022-08-22 14:59:53,34.63100,-106.81683,11,157,3535.98," StrTrk 110 9 1.59V 20C 67113Pa " +2022-08-22 15:00:53,2022-08-22 15:00:53,34.62883,-106.81617,11,159,3635.96," StrTrk 111 9 1.59V 19C 66286Pa " +2022-08-22 15:01:53,2022-08-22 15:01:53,34.62667,-106.81567,17,162,3741.12," StrTrk 112 9 1.59V 18C 65482Pa " +2022-08-22 15:02:53,2022-08-22 15:02:53,34.62417,-106.81533,17,162,3834.08," StrTrk 113 9 1.59V 16C 64724Pa " +2022-08-22 15:03:53,2022-08-22 15:03:53,34.62150,-106.81467,22,159,3945.03," StrTrk 114 9 1.59V 17C 63865Pa " +2022-08-22 15:04:53,2022-08-22 15:04:53,34.61867,-106.81433,20,167,4052.01," StrTrk 115 9 1.59V 16C 63035Pa " +2022-08-22 15:06:53,2022-08-22 15:06:53,34.61350,-106.81400,13,167,4278.17," StrTrk 117 9 1.58V 15C 61287Pa " +2022-08-22 15:07:54,2022-08-22 15:07:54,34.61100,-106.81333,15,157,4386.07," StrTrk 118 9 1.58V 14C 60501Pa " +2022-08-22 15:08:53,2022-08-22 15:08:53,34.60867,-106.81283,13,173,4479.95," StrTrk 119 9 1.58V 14C 59749Pa " +2022-08-22 15:09:53,2022-08-22 15:09:53,34.60667,-106.81233,15,159,4589.07," StrTrk 120 9 1.58V 13C 58964Pa " +2022-08-22 15:10:53,2022-08-22 15:10:53,34.60467,-106.81183,15,166,4695.14," StrTrk 121 9 1.57V 12C 58211Pa " +2022-08-22 15:11:53,2022-08-22 15:11:53,34.60333,-106.81133,13,130,4799.99," StrTrk 122 9 1.58V 12C 57437Pa " +2022-08-22 15:12:53,2022-08-22 15:12:53,34.60233,-106.81033,9,124,4906.98," StrTrk 123 9 1.58V 11C 56652Pa " +2022-08-22 15:13:53,2022-08-22 15:13:53,34.60217,-106.80967,6,125,5018.23," StrTrk 124 9 1.57V 10C 55899Pa " +2022-08-22 15:14:53,2022-08-22 15:14:53,34.60200,-106.80883,11,114,5119.12," StrTrk 125 9 1.57V 10C 55154Pa " +2022-08-22 15:16:54,2022-08-22 15:16:54,34.59983,-106.80550,13,126,5332.17," StrTrk 127 9 1.57V 8C 53703Pa " +2022-08-22 15:18:53,2022-08-22 15:18:53,34.59783,-106.80133,11,98,5569.00," StrTrk 129 9 1.56V 8C 52135Pa " +2022-08-22 15:19:53,2022-08-22 15:19:53,34.59667,-106.79867,15,124,5673.24," StrTrk 130 9 1.56V 7C 51425Pa " +2022-08-22 15:20:53,2022-08-22 15:20:53,34.59517,-106.79600,19,116,5771.08," StrTrk 131 9 1.56V 7C 50796Pa " +2022-08-22 15:21:53,2022-08-22 15:21:53,34.59333,-106.79317,24,135,5875.02," StrTrk 132 9 1.56V 7C 50137Pa " +2022-08-22 15:22:53,2022-08-22 15:22:53,34.59100,-106.79133,24,150,5985.05," StrTrk 133 9 1.55V 7C 49428Pa " +2022-08-22 15:23:53,2022-08-22 15:23:53,34.58817,-106.78917,19,153,6097.22," StrTrk 134 9 1.56V 6C 48741Pa " +2022-08-22 15:24:53,2022-08-22 15:24:53,34.58483,-106.78633,26,147,6208.17," StrTrk 135 9 1.55V 6C 48032Pa " +2022-08-22 15:25:53,2022-08-22 15:25:53,34.58150,-106.78300,26,138,6322.16," StrTrk 136 9 1.56V 5C 47344Pa " +2022-08-22 15:26:53,2022-08-22 15:26:53,34.57833,-106.77933,30,130,6433.11," StrTrk 137 9 1.56V 5C 46665Pa " +2022-08-22 15:27:53,2022-08-22 15:27:53,34.57483,-106.77533,35,143,6538.26," StrTrk 138 9 1.55V 5C 46025Pa " +2022-08-22 15:28:53,2022-08-22 15:28:53,34.57150,-106.77133,33,136,6646.16," StrTrk 139 9 1.55V 4C 45384Pa " +2022-08-22 15:30:53,2022-08-22 15:30:53,34.56600,-106.76217,26,115,6863.18," StrTrk 141 9 1.54V 3C 44120Pa " +2022-08-22 15:31:53,2022-08-22 15:31:53,34.56433,-106.75817,24,116,6987.24," StrTrk 142 9 1.55V 2C 43432Pa " +2022-08-22 15:32:53,2022-08-22 15:32:53,34.56350,-106.75383,26,102,7110.07," StrTrk 143 9 1.55V 2C 42717Pa " +2022-08-22 15:33:53,2022-08-22 15:33:53,34.56350,-106.74950,26,80,7248.14," StrTrk 144 9 1.55V 1C 41954Pa " +2022-08-22 15:34:53,2022-08-22 15:34:53,34.56450,-106.74567,26,67,7385.30," StrTrk 145 9 1.54V 1C 41205Pa " +2022-08-22 15:35:53,2022-08-22 15:35:53,34.56517,-106.74117,20,77,7531.30," StrTrk 146 9 1.54V 0C 40422Pa " +2022-08-22 15:36:53,2022-08-22 15:36:53,34.56583,-106.73600,37,82,7672.12," StrTrk 147 9 1.54V 0C 39668Pa " +2022-08-22 15:37:53,2022-08-22 15:37:53,34.56683,-106.72983,30,71,7820.25," StrTrk 148 9 1.54V 0C 38895Pa " +2022-08-22 15:38:53,2022-08-22 15:38:53,34.56767,-106.72317,33,87,7960.16," StrTrk 149 9 1.53V -1C 38183Pa " +2022-08-22 15:39:53,2022-08-22 15:39:53,34.56800,-106.71683,30,90,8082.38," StrTrk 150 9 1.53V -2C 37553Pa " +2022-08-22 15:40:53,2022-08-22 15:40:53,34.56867,-106.71017,41,78,8212.23," StrTrk 151 9 1.53V -3C 36905Pa " +2022-08-22 15:42:53,2022-08-22 15:42:53,34.57083,-106.69467,46,76,8470.39," StrTrk 153 9 1.53V -4C 35647Pa " +2022-08-22 15:43:44,2022-08-22 15:43:44,34.56967,-106.70250,44,81,8338.11," StrTrk 152 9 1.52V -3C 36268Pa " +2022-08-22 15:44:53,2022-08-22 15:44:53,34.57300,-106.67983,37,80,8718.19," StrTrk 155 9 1.52V -4C 34452Pa " +2022-08-22 15:45:53,2022-08-22 15:45:53,34.57367,-106.67350,30,80,8833.41," StrTrk 156 9 1.52V -4C 33919Pa " +2022-08-22 15:46:53,2022-08-22 15:46:53,34.57417,-106.66733,39,89,8957.16," StrTrk 157 9 1.51V -5C 33367Pa " +2022-08-22 15:47:53,2022-08-22 15:47:53,34.57367,-106.66050,43,99,9078.16," StrTrk 158 9 1.51V -6C 32811Pa " +2022-08-22 15:48:53,2022-08-22 15:48:53,34.57300,-106.65350,37,87,9190.33," StrTrk 159 9 1.51V -6C 32275Pa " +2022-08-22 15:49:53,2022-08-22 15:50:35,34.57250,-106.64583,41,98,9313.16," StrTrk 160 9 1.50V -7C 31750Pa " +2022-08-22 15:51:53,2022-08-22 15:51:53,34.57217,-106.62983,44,97,9580.17," StrTrk 162 9 1.50V -8C 30573Pa " +2022-08-22 15:52:53,2022-08-22 15:52:53,34.57183,-106.62167,50,92,9715.20," StrTrk 163 9 1.50V -09C 30020Pa " +2022-08-22 15:53:08,2022-08-22 15:53:08,34.57233,-106.63817,44,83,9441.18," StrTrk 161 9 1.50V -7C 31170Pa " +2022-08-22 15:53:53,2022-08-22 15:53:53,34.57150,-106.61283,50,84,9858.45," StrTrk 164 9 1.50V -10C 29413Pa " +2022-08-22 15:54:53,2022-08-22 15:54:53,34.57217,-106.60350,52,81,10018.47," StrTrk 165 9 1.49V -11C 28719Pa " +2022-08-22 15:55:53,2022-08-22 15:55:53,34.57250,-106.59367,63,90,10166.30," StrTrk 166 9 1.49V -12C 28144Pa " +2022-08-22 15:56:53,2022-08-22 15:56:53,34.57233,-106.58300,56,95,10331.50," StrTrk 167 9 1.48V -13C 27520Pa " +2022-08-22 15:57:53,2022-08-22 15:57:53,34.57233,-106.57167,61,85,10495.48," StrTrk 168 9 1.49V -14C 26859Pa " +2022-08-22 15:59:53,2022-08-22 15:59:53,34.57167,-106.54950,57,93,10811.26," StrTrk 170 9 1.48V -15C 25665Pa " +2022-08-22 16:00:53,2022-08-22 16:00:53,34.57217,-106.53833,57,85,10959.39," StrTrk 171 9 1.48V -17C 25108Pa " +2022-08-22 16:01:53,2022-08-22 16:01:53,34.57300,-106.52717,65,82,11118.49," StrTrk 172 9 1.47V -18C 24551Pa " +2022-08-22 16:02:53,2022-08-22 16:02:53,34.57383,-106.51600,67,83,11267.54," StrTrk 173 9 1.48V -19C 24013Pa " +2022-08-22 16:03:53,2022-08-22 16:03:53,34.57567,-106.50533,57,83,11410.49," StrTrk 174 9 1.47V -19C 23513Pa " +2022-08-22 16:04:53,2022-08-22 16:04:53,34.57783,-106.49467,56,73,11560.45," StrTrk 175 9 1.47V -21C 23006Pa " +2022-08-22 16:05:53,2022-08-22 16:05:53,34.58100,-106.48467,56,67,11716.51," StrTrk 176 9 1.47V -21C 22477Pa " +2022-08-22 16:06:53,2022-08-22 16:06:53,34.58417,-106.47467,54,72,11869.52," StrTrk 177 9 1.46V -22C 21951Pa " +2022-08-22 16:07:53,2022-08-22 16:07:53,34.58667,-106.46450,63,69,12042.34," StrTrk 178 9 1.45V -23C 21401Pa " +2022-08-22 16:08:53,2022-08-22 16:08:53,34.58867,-106.45383,69,79,12226.44," StrTrk 179 9 1.46V -24C 20791Pa " +2022-08-22 16:09:53,2022-08-22 16:09:53,34.59000,-106.44250,65,88,12424.56," StrTrk 180 9 1.45V -25C 20180Pa " +2022-08-22 16:10:53,2022-08-22 16:10:53,34.59050,-106.43150,54,87,12630.61," StrTrk 181 9 1.45V -25C 19547Pa " +2022-08-22 16:11:53,2022-08-22 16:11:53,34.59117,-106.42050,57,81,12830.56," StrTrk 182 9 1.44V -27C 18941Pa " +2022-08-22 16:12:53,2022-08-22 16:12:53,34.59150,-106.40983,54,82,13019.53," StrTrk 183 9 1.43V -28C 18398Pa " +2022-08-22 16:13:53,2022-08-22 16:13:53,34.59183,-106.39983,56,85,13184.43," StrTrk 184 9 1.43V -30C 17928Pa " +2022-08-22 16:14:53,2022-08-22 16:14:53,34.59183,-106.38983,57,93,13328.60," StrTrk 185 9 1.43V -31C 17504Pa " +2022-08-22 16:15:53,2022-08-22 16:15:53,34.59200,-106.38033,48,90,13486.49," StrTrk 186 9 1.42V -31C 17095Pa " +2022-08-22 16:16:53,2022-08-22 16:16:53,34.59400,-106.37050,56,75,13654.43," StrTrk 187 9 1.43V -32C 16643Pa " +2022-08-22 16:17:53,2022-08-22 16:17:53,34.59600,-106.36067,54,82,13844.63," StrTrk 188 9 1.42V -33C 16137Pa " +2022-08-22 16:19:53,2022-08-22 16:19:53,34.59917,-106.34033,63,83,14211.60," StrTrk 190 9 1.41V -34C 15196Pa " +2022-08-22 16:20:53,2022-08-22 16:20:53,34.59983,-106.32917,61,89,14396.62," StrTrk 191 9 1.41V -35C 14729Pa " +2022-08-22 16:21:53,2022-08-22 16:21:53,34.60083,-106.31950,50,76,14587.42," StrTrk 192 9 1.40V -36C 14284Pa " +2022-08-22 16:22:53,2022-08-22 16:22:53,34.60250,-106.30983,57,80,14778.53," StrTrk 193 9 1.41V -37C 13828Pa " +2022-08-22 16:23:53,2022-08-22 16:23:53,34.60250,-106.30033,56,96,14977.57," StrTrk 194 9 1.40V -38C 13368Pa " +2022-08-22 16:24:53,2022-08-22 16:24:53,34.60150,-106.29133,37,105,15179.65," StrTrk 195 9 1.39V -38C 12921Pa " +2022-08-22 16:25:53,2022-08-22 16:25:53,34.59850,-106.28517,37,123,15369.54," StrTrk 196 9 1.39V -38C 12507Pa " +2022-08-22 16:27:53,2022-08-22 16:27:53,34.59167,-106.27933,0,165,15734.69," StrTrk 198 9 1.38V -39C 11741Pa " +2022-08-22 16:28:53,2022-08-22 16:28:53,34.59133,-106.27917,6,105,15933.72," StrTrk 199 9 1.39V -39C 11350Pa " +2022-08-22 16:29:53,2022-08-22 16:29:53,34.59183,-106.27950,6,246,16135.50," StrTrk 200 9 1.38V -39C 10939Pa " +2022-08-22 16:30:57,2022-08-22 16:30:57,34.59350,-106.28067,24,348,16344.60," StrTrk 201 9 1.38V -40C 10549Pa " +2022-08-22 16:31:57,2022-08-22 16:31:57,34.59683,-106.28033,15,9,16557.65," StrTrk 202 9 1.38V -40C 10176Pa " +2022-08-22 16:32:53,2022-08-22 16:32:53,34.59800,-106.28033,11,3,16743.58," StrTrk 203 9 1.38V -39C 9843Pa " +2022-08-22 16:33:53,2022-08-22 16:33:53,34.59850,-106.28050,7,317,16937.74," StrTrk 204 9 1.39V -39C 9516Pa " +2022-08-22 16:34:53,2022-08-22 16:34:53,34.60000,-106.28033,13,46,17136.77," StrTrk 205 9 1.40V -40C 9186Pa " +2022-08-22 16:35:53,2022-08-22 16:35:53,34.60117,-106.27867,13,22,17337.63," StrTrk 206 9 1.39V -39C 8855Pa " +2022-08-22 16:36:53,2022-08-22 16:36:53,34.60217,-106.27567,13,107,17531.79," StrTrk 207 9 1.39V -38C 8555Pa " +2022-08-22 16:37:53,2022-08-22 16:37:53,34.60000,-106.27500,24,195,17709.79," StrTrk 208 9 1.39V -38C 8296Pa " +2022-08-22 16:38:53,2022-08-22 16:38:53,34.59667,-106.27650,19,198,17873.78," StrTrk 209 9 1.40V -39C 8043Pa " +2022-08-22 16:39:53,2022-08-22 16:39:53,34.59483,-106.28000,39,233,18045.68," StrTrk 210 9 1.42V -38C 7824Pa " +2022-08-22 16:40:53,2022-08-22 16:40:53,34.59200,-106.28550,41,252,18193.82," StrTrk 211 9 1.41V -37C 7618Pa " +2022-08-22 16:41:53,2022-08-22 16:41:53,34.59067,-106.29117,30,252,18339.82," StrTrk 212 9 1.41V -36C 7433Pa " +2022-08-22 16:42:53,2022-08-22 16:42:53,34.59050,-106.29483,17,267,18482.77," StrTrk 213 9 1.42V -35C 7241Pa " +2022-08-22 16:43:53,2022-08-22 16:43:53,34.59117,-106.29900,24,281,18628.77," StrTrk 214 9 1.43V -35C 7067Pa " +2022-08-22 16:44:53,2022-08-22 16:44:53,34.59133,-106.30400,33,264,18760.74," StrTrk 215 9 1.44V -34C 6898Pa " +2022-08-22 16:45:53,2022-08-22 16:45:53,34.59100,-106.30950,22,278,18910.71," StrTrk 216 9 1.43V -34C 6734Pa " +2022-08-22 16:46:53,2022-08-22 16:46:53,34.59217,-106.31333,19,314,19046.65," StrTrk 217 9 1.43V -32C 6575Pa " +2022-08-22 16:47:53,2022-08-22 16:47:53,34.59400,-106.31550,20,319,19150.89," StrTrk 218 9 1.43V -30C 6466Pa " +2022-08-22 16:48:53,2022-08-22 16:48:53,34.59650,-106.31850,22,309,19235.93," StrTrk 219 9 1.43V -29C 6376Pa " +2022-08-22 16:49:53,2022-08-22 16:49:53,34.59833,-106.32150,19,299,19329.81," StrTrk 220 9 1.43V -27C 6278Pa " +2022-08-22 16:50:53,2022-08-22 16:50:53,34.59950,-106.32433,19,295,19426.73," StrTrk 221 9 1.43V -27C 6171Pa " +2022-08-22 16:51:53,2022-08-22 16:51:53,34.60000,-106.32717,13,277,19524.88," StrTrk 222 9 1.43V -27C 6072Pa " +2022-08-22 16:52:53,2022-08-22 16:52:53,34.59967,-106.32967,17,270,19616.93," StrTrk 223 9 1.43V -26C 5984Pa " +2022-08-22 16:53:53,2022-08-22 16:53:53,34.60050,-106.33283,22,294,19703.80," StrTrk 224 9 1.45V -26C 5900Pa " +2022-08-22 16:54:53,2022-08-22 16:54:53,34.60200,-106.33550,13,314,19790.66," StrTrk 225 9 1.44V -26C 5806Pa " +2022-08-22 16:55:53,2022-08-22 16:55:53,34.60300,-106.33750,13,267,19856.81," StrTrk 226 9 1.45V -26C 5735Pa " +2022-08-22 16:56:53,2022-08-22 16:56:53,34.60217,-106.34083,24,240,19916.85," StrTrk 227 9 1.45V -26C 5682Pa " +2022-08-22 16:58:53,2022-08-22 16:58:53,34.59833,-106.34917,19,239,20091.81," StrTrk 229 9 1.45V -25C 5516Pa " +2022-08-22 16:59:50,2022-08-22 16:59:50,34.60000,-106.34517,30,237,19999.76," StrTrk 228 9 1.45V -25C 5599Pa " +2022-08-22 17:00:53,2022-08-22 17:00:53,34.59600,-106.35317,17,223,20254.87," StrTrk 231 9 1.46V -24C 5362Pa " +2022-08-22 17:01:53,2022-08-22 17:01:53,34.59350,-106.35600,28,225,20312.79," StrTrk 232 9 1.47V -24C 5319Pa " +2022-08-22 17:02:54,2022-08-22 17:02:54,34.59033,-106.36067,37,229,20383.80," StrTrk 233 9 1.47V -21C 5269Pa " +2022-08-22 17:03:53,2022-08-22 17:03:53,34.58683,-106.36633,37,236,20446.90," StrTrk 234 9 1.46V -20C 5219Pa " +2022-08-22 17:04:53,2022-08-22 17:04:53,34.58400,-106.37283,39,243,20507.86," StrTrk 235 9 1.46V -22C 5158Pa " +2022-08-22 17:05:53,2022-08-22 17:05:53,34.58167,-106.37967,41,246,20543.82," StrTrk 236 9 1.48V -21C 5136Pa " +2022-08-22 17:06:53,2022-08-22 17:06:53,34.57900,-106.38667,41,246,20589.85," StrTrk 237 9 1.47V -20C 5092Pa " +2022-08-22 17:08:53,2022-08-22 17:08:53,34.57467,-106.40083,41,250,20602.96," StrTrk 239 9 1.48V -19C 5086Pa " +2022-08-22 17:09:53,2022-08-22 17:09:53,34.57267,-106.40800,41,252,20602.96," StrTrk 240 9 1.47V -19C 5089Pa " +2022-08-22 17:10:53,2022-08-22 17:10:53,34.57067,-106.41517,41,253,20618.81," StrTrk 241 9 1.48V -18C 5071Pa " +2022-08-22 17:11:53,2022-08-22 17:11:53,34.56883,-106.42233,41,253,20603.87," StrTrk 242 9 1.49V -17C 5094Pa " +2022-08-22 17:12:53,2022-08-22 17:12:53,34.56700,-106.42950,39,253,20602.96," StrTrk 243 9 1.48V -15C 5116Pa " +2022-08-22 17:13:53,2022-08-22 17:13:53,34.56567,-106.43617,37,255,20617.89," StrTrk 244 9 1.49V -13C 5097Pa " +2022-08-22 17:15:53,2022-08-22 17:17:44,34.56250,-106.45050,41,255,20645.93," StrTrk 246 9 1.49V -13C 5070Pa " +2022-08-22 17:18:53,2022-08-22 17:18:53,34.55817,-106.47183,39,256,20631.91," StrTrk 249 9 1.50V -13C 5089Pa " +2022-08-22 17:19:53,2022-08-22 17:19:53,34.55650,-106.47917,43,254,20589.85," StrTrk 250 9 1.50V -15C 5097Pa " +2022-08-22 17:20:53,2022-08-22 17:20:53,34.55483,-106.48667,43,256,20595.95," StrTrk 251 9 1.49V -13C 5078Pa " +2022-08-22 17:21:53,2022-08-22 17:21:53,34.55350,-106.49417,41,256,20570.95," StrTrk 252 9 1.50V -13C 5140Pa " +2022-08-22 17:23:53,2022-08-22 17:23:53,34.55017,-106.50900,43,255,20563.94," StrTrk 254 9 1.51V -14C 5142Pa " +2022-08-22 17:24:53,2022-08-22 17:24:53,34.54850,-106.51667,43,255,20549.92," StrTrk 255 9 1.51V -15C 5153Pa " +2022-08-22 17:25:53,2022-08-22 17:25:53,34.54683,-106.52433,43,256,20542.00," StrTrk 256 9 1.50V -16C 5138Pa " +2022-08-22 17:26:53,2022-08-22 17:26:53,34.54533,-106.53217,44,255,20515.78," StrTrk 257 9 1.51V -16C 5163Pa " +2022-08-22 17:27:53,2022-08-22 17:27:53,34.54367,-106.54000,44,254,20495.97," StrTrk 258 9 1.51V -17C 5178Pa " +2022-08-22 17:28:53,2022-08-22 17:28:53,34.54183,-106.54767,43,253,20483.78," StrTrk 259 9 1.50V -17C 5197Pa " +2022-08-22 17:29:53,2022-08-22 17:29:53,34.54000,-106.55533,43,253,20497.80," StrTrk 260 9 1.50V -16C 5184Pa " +2022-08-22 17:30:53,2022-08-22 17:30:53,34.53800,-106.56300,54,243,20509.99," StrTrk 261 9 1.50V -15C 5175Pa " +2022-08-22 17:31:53,2022-08-22 17:31:53,34.53600,-106.57083,44,252,20531.94," StrTrk 262 9 1.51V -14C 5155Pa " +2022-08-22 17:32:53,2022-08-22 17:32:53,34.53417,-106.57867,44,253,20546.87," StrTrk 263 9 1.50V -12C 5217Pa " +2022-08-22 17:33:53,2022-08-22 17:33:53,34.53217,-106.58650,44,253,20538.95," StrTrk 264 9 1.51V -11C 5129Pa " +2022-08-22 17:34:53,2022-08-22 17:34:53,34.53017,-106.59467,46,253,20537.73," StrTrk 265 9 1.50V -09C 5202Pa " +2022-08-22 17:35:53,2022-08-22 17:35:53,34.52833,-106.60267,44,254,20526.76," StrTrk 266 9 1.50V -8C 5226Pa " +2022-08-22 17:36:54,2022-08-22 17:36:54,34.52633,-106.61067,44,252,20537.73," StrTrk 267 9 1.51V -8C 5200Pa " +2022-08-22 17:37:53,2022-08-22 17:37:53,34.52467,-106.61850,44,254,20571.87," StrTrk 268 9 1.51V -8C 5177Pa " +2022-08-22 17:38:53,2022-08-22 17:38:53,34.52300,-106.62667,46,254,20519.75," StrTrk 269 9 1.50V -12C 5154Pa " +2022-08-22 17:39:53,2022-08-22 17:39:53,34.52083,-106.63483,46,250,20483.78," StrTrk 270 9 1.51V -14C 5185Pa " +2022-08-22 17:40:53,2022-08-22 17:40:53,34.51850,-106.64300,46,250,20493.84," StrTrk 271 9 1.50V -13C 5157Pa " +2022-08-22 17:41:53,2022-08-22 17:41:53,34.51617,-106.65100,46,252,20496.89," StrTrk 272 9 1.51V -12C 5164Pa " +2022-08-22 17:42:53,2022-08-22 17:42:53,34.51417,-106.65933,46,254,20504.81," StrTrk 273 9 1.51V -11C 5230Pa " +2022-08-22 17:43:53,2022-08-22 17:43:53,34.51217,-106.66750,46,253,20492.92," StrTrk 274 9 1.51V -10C 5196Pa " +2022-08-22 17:45:53,2022-08-22 17:45:53,34.50817,-106.68433,48,253,20481.95," StrTrk 276 9 1.50V -09C 5235Pa " +2022-08-22 17:46:53,2022-08-22 17:46:53,34.50617,-106.69267,46,254,20504.81," StrTrk 277 9 1.50V -10C 5241Pa " +2022-08-22 17:47:20,2022-08-22 17:47:20,34.51017,-106.67583,48,253,20479.82," StrTrk 275 9 1.50V -10C 5279Pa " +2022-08-22 17:47:53,2022-08-22 17:47:53,34.50433,-106.70100,46,255,20510.91," StrTrk 278 9 1.51V -10C 5196Pa " +2022-08-22 17:48:53,2022-08-22 17:48:53,34.50250,-106.70933,46,254,20486.83," StrTrk 279 9 1.50V -10C 5224Pa " +2022-08-22 17:49:53,2022-08-22 17:49:53,34.50067,-106.71750,46,253,20466.71," StrTrk 280 9 1.51V -10C 5184Pa " +2022-08-22 17:50:53,2022-08-22 17:50:53,34.49867,-106.72567,46,253,20477.99," StrTrk 281 9 1.50V -10C 5202Pa " +2022-08-22 17:51:53,2022-08-22 17:51:53,34.49667,-106.73383,46,254,20498.71," StrTrk 282 9 1.51V -11C 5159Pa " +2022-08-22 17:52:53,2022-08-22 17:52:53,34.49467,-106.74200,46,253,20508.77," StrTrk 283 9 1.50V -10C 5231Pa " +2022-08-22 17:53:53,2022-08-22 17:53:53,34.49267,-106.75017,46,253,20501.76," StrTrk 284 9 1.51V -10C 5231Pa " +2022-08-22 17:54:53,2022-08-22 17:54:53,34.49067,-106.75817,44,252,20489.88," StrTrk 285 9 1.50V -10C 5245Pa " +2022-08-22 17:55:53,2022-08-22 17:55:53,34.48867,-106.76617,44,254,20477.99," StrTrk 286 9 1.50V -10C 5226Pa " +2022-08-22 17:56:53,2022-08-22 17:56:53,34.48683,-106.77417,44,254,20488.96," StrTrk 287 9 1.51V -10C 5235Pa " +2022-08-22 17:57:54,2022-08-22 17:57:54,34.48517,-106.78217,44,255,20500.85," StrTrk 288 9 1.50V -10C 5262Pa " +2022-08-22 17:58:53,2022-08-22 17:58:53,34.48333,-106.79017,44,255,20495.97," StrTrk 289 9 1.50V -10C 5236Pa " +2022-08-22 17:59:53,2022-08-22 17:59:53,34.48150,-106.79817,44,254,20473.72," StrTrk 290 9 1.49V -10C 5179Pa " +2022-08-22 18:01:53,2022-08-22 18:01:53,34.47783,-106.81417,44,254,20463.97," StrTrk 292 9 1.51V -12C 5255Pa " +2022-08-22 18:02:53,2022-08-22 18:02:53,34.47600,-106.82200,44,254,20479.82," StrTrk 293 9 1.50V -12C 5252Pa " +2022-08-22 18:03:53,2022-08-22 18:03:53,34.47417,-106.83000,44,254,20481.95," StrTrk 294 9 1.51V -13C 5222Pa " +2022-08-22 18:04:53,2022-08-22 18:04:53,34.47250,-106.83783,44,256,20462.75," StrTrk 295 9 1.51V -13C 5217Pa " +2022-08-22 18:05:53,2022-08-22 18:05:53,34.47100,-106.84567,44,256,20453.91," StrTrk 296 9 1.51V -13C 5254Pa " +2022-08-22 18:06:54,2022-08-22 18:06:54,34.46950,-106.85350,43,258,20448.73," StrTrk 297 9 1.51V -13C 5189Pa " +2022-08-22 18:07:53,2022-08-22 18:07:53,34.46817,-106.86133,43,258,20445.98," StrTrk 298 9 1.51V -13C 5253Pa " +2022-08-22 18:08:53,2022-08-22 18:08:53,34.46683,-106.86917,43,258,20437.75," StrTrk 299 9 1.51V -15C 5238Pa " +2022-08-22 18:10:53,2022-08-22 18:10:53,34.46417,-106.88483,43,257,20429.83," StrTrk 301 9 1.51V -16C 5262Pa " +2022-08-22 18:11:53,2022-08-22 18:11:53,34.46267,-106.89267,43,256,20416.72," StrTrk 302 9 1.50V -16C 5259Pa " +2022-08-22 18:12:53,2022-08-22 18:12:53,34.46100,-106.90017,43,256,20410.93," StrTrk 303 9 1.52V -15C 5272Pa " +2022-08-22 18:13:53,2022-08-22 18:13:53,34.45950,-106.90783,43,256,20413.98," StrTrk 304 9 1.51V -13C 5279Pa " +2022-08-22 18:14:53,2022-08-22 18:14:53,34.45800,-106.91550,43,256,20421.90," StrTrk 305 9 1.50V -13C 5230Pa " +2022-08-22 18:15:53,2022-08-22 18:15:53,34.45667,-106.92317,43,258,20425.87," StrTrk 306 9 1.50V -14C 5251Pa " +2022-08-22 18:16:53,2022-08-22 18:16:53,34.45517,-106.93100,44,257,20422.82," StrTrk 307 9 1.51V -14C 5248Pa " +2022-08-22 18:17:53,2022-08-22 18:17:53,34.45367,-106.93900,44,257,20418.86," StrTrk 308 9 1.50V -15C 5261Pa " +2022-08-22 18:18:53,2022-08-22 18:18:53,34.45217,-106.94683,43,256,20412.76," StrTrk 309 9 1.50V -14C 5248Pa " +2022-08-22 18:19:53,2022-08-22 18:19:53,34.45067,-106.95467,43,256,20430.74," StrTrk 310 9 1.50V -13C 5224Pa " +2022-08-22 18:20:53,2022-08-22 18:20:53,34.44917,-106.96250,44,257,20441.72," StrTrk 311 9 1.49V -12C 5223Pa " +2022-08-22 18:21:53,2022-08-22 18:21:53,34.44767,-106.97033,43,256,20435.93," StrTrk 312 9 1.50V -12C 5223Pa " +2022-08-22 18:22:53,2022-08-22 18:22:53,34.44617,-106.97817,43,256,20424.95," StrTrk 313 9 1.50V -12C 5216Pa " +2022-08-22 18:23:53,2022-08-22 18:23:53,34.44450,-106.98583,43,255,20435.93," StrTrk 314 9 1.50V -13C 5228Pa " +2022-08-22 18:24:53,2022-08-22 18:24:53,34.44283,-106.99350,43,256,20441.72," StrTrk 315 9 1.50V -12C 5235Pa " +2022-08-22 18:25:53,2022-08-22 18:25:53,34.44133,-107.00117,43,254,20457.87," StrTrk 316 9 1.51V -12C 5296Pa " +2022-08-22 18:26:53,2022-08-22 18:26:53,34.43967,-107.00867,43,254,20447.81," StrTrk 317 9 1.50V -13C 5234Pa " +2022-08-22 18:27:53,2022-08-22 18:27:53,34.43800,-107.01617,43,256,20434.71," StrTrk 318 9 1.50V -13C 5268Pa " +2022-08-22 18:28:53,2022-08-22 18:28:53,34.43667,-107.02383,43,258,20418.86," StrTrk 319 9 1.51V -14C 5276Pa " +2022-08-22 18:29:53,2022-08-22 18:29:53,34.43533,-107.03150,43,259,20407.88," StrTrk 320 9 1.51V -15C 5263Pa " +2022-08-22 18:30:53,2022-08-22 18:30:53,34.43400,-107.03933,43,259,20397.83," StrTrk 321 9 1.50V -15C 5271Pa " +2022-08-22 18:31:53,2022-08-22 18:31:53,34.43283,-107.04700,43,258,20378.93," StrTrk 322 9 1.51V -16C 5288Pa " +2022-08-22 18:32:53,2022-08-22 18:32:53,34.43150,-107.05483,43,258,20369.78," StrTrk 323 9 1.50V -16C 5292Pa " +2022-08-22 18:33:53,2022-08-22 18:33:53,34.43017,-107.06250,43,257,20376.79," StrTrk 324 9 1.50V -15C 5308Pa " +2022-08-22 18:34:53,2022-08-22 18:34:53,34.42883,-107.07017,43,257,20386.85," StrTrk 325 9 1.51V -15C 5284Pa " +2022-08-22 18:35:53,2022-08-22 18:35:53,34.42733,-107.07800,43,256,20394.78," StrTrk 326 9 1.50V -13C 5281Pa " +2022-08-22 18:36:53,2022-08-22 18:36:53,34.42583,-107.08567,43,255,20390.82," StrTrk 327 9 1.50V -13C 5244Pa " +2022-08-22 18:37:53,2022-08-22 18:37:53,34.42433,-107.09317,43,256,20398.74," StrTrk 328 9 1.50V -12C 5334Pa " +2022-08-22 18:38:53,2022-08-22 18:38:53,34.42267,-107.10067,43,252,20422.82," StrTrk 329 9 1.50V -12C 5249Pa " +2022-08-22 18:39:53,2022-08-22 18:39:53,34.42067,-107.10833,43,250,20456.96," StrTrk 330 9 1.50V -13C 5236Pa " +2022-08-22 18:40:53,2022-08-22 18:40:53,34.41867,-107.11600,44,252,20461.83," StrTrk 331 9 1.49V -13C 5208Pa " +2022-08-22 18:41:53,2022-08-22 18:41:53,34.41667,-107.12383,44,251,20439.89," StrTrk 332 9 1.50V -14C 5237Pa " +2022-08-22 18:42:53,2022-08-22 18:42:53,34.41433,-107.13150,44,247,20426.78," StrTrk 333 9 1.49V -13C 5270Pa " +2022-08-22 18:43:53,2022-08-22 18:43:53,34.41167,-107.13883,44,246,20411.85," StrTrk 334 9 1.50V -13C 5255Pa " +2022-08-22 18:44:53,2022-08-22 18:44:53,34.40900,-107.14650,44,248,20449.95," StrTrk 335 9 1.49V -12C 5255Pa " +2022-08-22 18:45:53,2022-08-22 18:45:53,34.40667,-107.15400,44,249,20465.80," StrTrk 336 9 1.50V -11C 5232Pa " +2022-08-22 18:46:53,2022-08-22 18:46:53,34.40433,-107.16167,43,248,20449.95," StrTrk 337 9 1.50V -11C 5194Pa " +2022-08-22 18:47:53,2022-08-22 18:47:53,34.40217,-107.16900,43,250,20443.85," StrTrk 338 9 1.51V -12C 5255Pa " +2022-08-22 18:48:53,2022-08-22 18:48:53,34.39983,-107.17650,44,249,20434.71," StrTrk 339 9 1.51V -13C 5227Pa " +2022-08-22 18:49:53,2022-08-22 18:49:53,34.39750,-107.18417,44,251,20481.95," StrTrk 340 9 1.50V -13C 5204Pa " +2022-08-22 18:50:53,2022-08-22 18:50:53,34.39550,-107.19200,44,252,20509.99," StrTrk 341 9 1.50V -12C 5229Pa " +2022-08-22 18:51:53,2022-08-22 18:51:53,34.39367,-107.19967,41,254,20518.83," StrTrk 342 9 1.50V -11C 5136Pa " +2022-08-22 18:52:53,2022-08-22 18:52:53,34.39200,-107.20700,41,254,20502.98," StrTrk 343 9 1.51V -15C 5190Pa " +2022-08-22 18:53:53,2022-08-22 18:53:53,34.39050,-107.21450,43,256,20525.84," StrTrk 344 9 1.50V -14C 5194Pa " +2022-08-22 18:54:53,2022-08-22 18:54:53,34.38900,-107.22217,43,258,20536.81," StrTrk 345 9 1.50V -12C 5153Pa " +2022-08-22 18:55:53,2022-08-22 18:55:53,34.38767,-107.22967,43,256,20513.95," StrTrk 346 9 1.50V -11C 5211Pa " +2022-08-22 18:56:53,2022-08-22 18:56:53,34.38617,-107.23717,41,256,20507.86," StrTrk 347 9 1.50V -12C 5148Pa " +2022-08-22 18:58:53,2022-08-22 18:58:53,34.38283,-107.25200,44,255,20504.81," StrTrk 349 9 1.51V -15C 5180Pa " +2022-08-22 18:59:53,2022-08-22 18:59:53,34.38133,-107.25983,44,255,20498.71," StrTrk 350 9 1.51V -15C 5179Pa " +2022-08-22 19:00:53,2022-08-22 19:00:53,34.37983,-107.26750,43,257,20498.71," StrTrk 351 9 1.50V -15C 5202Pa " +2022-08-22 19:01:53,2022-08-22 19:01:53,34.37850,-107.27500,41,256,20492.92," StrTrk 352 9 1.51V -13C 5210Pa " +2022-08-22 19:03:53,2022-08-22 19:03:53,34.37583,-107.29000,43,258,20526.76," StrTrk 354 9 1.50V -13C 5181Pa " +2022-08-22 19:04:53,2022-08-22 19:04:53,34.37450,-107.29767,43,258,20524.93," StrTrk 355 9 1.50V -12C 5137Pa " +2022-08-22 19:05:53,2022-08-22 19:05:53,34.37317,-107.30533,41,257,20542.00," StrTrk 356 9 1.50V -10C 5140Pa " +2022-08-22 19:06:53,2022-08-22 19:06:53,34.37200,-107.31233,37,259,20576.74," StrTrk 357 9 1.50V -11C 5086Pa " +2022-08-22 19:07:53,2022-08-22 19:07:53,34.37100,-107.31917,39,261,20566.99," StrTrk 358 9 1.50V -11C 5207Pa " +2022-08-22 19:08:53,2022-08-22 19:08:53,34.37017,-107.32650,39,262,20583.75," StrTrk 359 9 1.50V -11C 5115Pa " +2022-08-22 19:09:53,2022-08-22 19:09:53,34.36950,-107.33317,35,264,20598.99," StrTrk 360 9 1.50V -12C 5108Pa " +2022-08-22 19:10:53,2022-08-22 19:10:53,34.36900,-107.33983,39,268,20607.83," StrTrk 361 9 1.51V -13C 5140Pa " +2022-08-22 19:11:53,2022-08-22 19:11:53,34.36900,-107.34633,35,269,20613.93," StrTrk 362 9 1.51V -14C 5102Pa " +2022-08-22 19:12:53,2022-08-22 19:12:53,34.36883,-107.35300,35,268,20636.79," StrTrk 363 9 1.50V -11C 5064Pa " +2022-08-22 19:14:53,2022-08-22 19:14:53,34.36933,-107.36533,31,274,20682.81," StrTrk 365 9 1.49V -12C 5020Pa " +2022-08-22 19:15:53,2022-08-22 19:15:53,34.36967,-107.37150,33,273,20682.81," StrTrk 366 9 1.50V -13C 5049Pa " +2022-08-22 19:16:53,2022-08-22 19:16:53,34.36983,-107.37750,33,272,20663.00," StrTrk 367 9 1.51V -14C 5047Pa " +2022-08-22 19:17:53,2022-08-22 19:17:53,34.37017,-107.38350,33,271,20658.73," StrTrk 368 9 1.50V -14C 5062Pa " +2022-08-22 19:18:53,2022-08-22 19:18:53,34.37017,-107.38950,31,269,20656.91," StrTrk 369 9 1.50V -12C 5067Pa " +2022-08-22 19:19:53,2022-08-22 19:19:53,34.37017,-107.39517,31,269,20713.90," StrTrk 370 9 1.50V -11C 5047Pa " +2022-08-22 19:21:53,2022-08-22 19:21:53,34.37000,-107.40683,31,267,20716.95," StrTrk 372 9 1.51V -12C 5032Pa " +2022-08-22 19:22:53,2022-08-22 19:22:53,34.36967,-107.41267,31,267,20701.71," StrTrk 373 9 1.50V -12C 5042Pa " +2022-08-22 19:23:53,2022-08-22 19:23:53,34.36933,-107.41867,33,266,20709.94," StrTrk 374 9 1.50V -11C 5001Pa " +2022-08-22 19:24:53,2022-08-22 19:24:53,34.36933,-107.42483,33,270,20733.72," StrTrk 375 9 1.51V -11C 4963Pa " +2022-08-22 19:26:53,2022-08-22 19:26:53,34.37017,-107.43733,33,271,20727.92," StrTrk 377 9 1.50V -14C 5000Pa " +2022-08-22 19:27:53,2022-08-22 19:27:53,34.37050,-107.44367,33,275,20786.75," StrTrk 378 9 1.50V -12C 4973Pa " +2022-08-22 19:28:53,2022-08-22 19:28:53,34.37133,-107.45017,35,281,20806.87," StrTrk 379 9 1.51V -14C 4943Pa " +2022-08-22 19:29:53,2022-08-22 19:29:53,34.37217,-107.45683,35,276,20755.97," StrTrk 380 9 1.50V -16C 4954Pa " +2022-08-22 19:30:53,2022-08-22 19:30:53,34.37283,-107.46333,35,279,20761.76," StrTrk 381 9 1.50V -16C 4973Pa " +2022-08-22 19:31:53,2022-08-22 19:31:53,34.37417,-107.46983,37,286,20816.93," StrTrk 382 9 1.51V -14C 4939Pa " +2022-08-22 19:32:53,2022-08-22 19:32:53,34.37617,-107.47617,33,291,20873.92," StrTrk 383 9 1.50V -15C 4883Pa " +2022-08-22 19:33:53,2022-08-22 19:33:53,34.37817,-107.48217,35,293,20918.73," StrTrk 384 9 1.50V -15C 4842Pa " +2022-08-22 19:34:53,2022-08-22 19:34:53,34.38033,-107.48833,39,293,20976.95," StrTrk 385 9 1.50V -13C 4773Pa " +2022-08-22 19:35:53,2022-08-22 19:35:53,34.38267,-107.49467,37,297,20972.98," StrTrk 386 9 1.50V -12C 4800Pa " +2022-08-22 19:36:53,2022-08-22 19:36:53,34.38517,-107.50067,35,293,20959.88," StrTrk 387 9 1.49V -11C 4815Pa " +2022-08-22 19:37:53,2022-08-22 19:37:53,34.38767,-107.50683,39,300,21044.92," StrTrk 388 9 1.50V -11C 4698Pa " +2022-08-22 19:38:53,2022-08-22 19:38:53,34.39050,-107.51300,39,297,21097.95," StrTrk 389 9 1.51V -13C 4694Pa " +2022-08-22 19:39:53,2022-08-22 19:39:53,34.39333,-107.51950,41,296,21066.86," StrTrk 390 9 1.51V -13C 4720Pa " +2022-08-22 19:40:53,2022-08-22 19:40:53,34.39583,-107.52600,39,296,21045.83," StrTrk 391 9 1.51V -11C 4786Pa " +2022-08-22 19:42:53,2022-08-22 19:42:53,34.40117,-107.53883,39,299,21077.83," StrTrk 393 9 1.50V -10C 4742Pa " +2022-08-22 19:43:47,2022-08-22 19:43:47,34.39850,-107.53250,41,293,21073.87," StrTrk 392 9 1.50V -11C 4742Pa " +2022-08-22 19:44:53,2022-08-22 19:44:53,34.40733,-107.55133,41,300,21091.86," StrTrk 395 9 1.51V -10C 4746Pa " +2022-08-22 19:45:53,2022-08-22 19:45:53,34.41050,-107.55783,41,302,21098.87," StrTrk 396 9 1.51V -11C 4729Pa " +2022-08-22 19:46:53,2022-08-22 19:46:53,34.41383,-107.56417,43,303,21090.03," StrTrk 397 9 1.51V -09C 4711Pa " +2022-08-22 19:47:53,2022-08-22 19:47:53,34.41733,-107.57067,41,302,21064.73," StrTrk 398 9 1.52V -8C 4784Pa " +2022-08-22 19:48:53,2022-08-22 19:48:53,34.42067,-107.57683,39,301,21069.91," StrTrk 399 9 1.51V -7C 4768Pa " +2022-08-22 19:49:53,2022-08-22 19:49:53,34.42383,-107.58300,39,301,21086.98," StrTrk 400 9 1.51V -6C 4771Pa " +2022-08-22 19:51:53,2022-08-22 19:51:53,34.43033,-107.59567,39,301,21101.91," StrTrk 402 9 1.50V -6C 4752Pa " +2022-08-22 19:52:53,2022-08-22 19:52:53,34.43350,-107.60183,39,301,21095.82," StrTrk 403 9 1.50V -7C 4741Pa " +2022-08-22 19:53:53,2022-08-22 19:53:53,34.43650,-107.60800,39,302,21087.89," StrTrk 404 9 1.52V -8C 4750Pa " +2022-08-22 19:54:53,2022-08-22 19:54:53,34.43967,-107.61400,39,302,21096.73," StrTrk 405 9 1.51V -7C 4755Pa " +2022-08-22 19:55:55,2022-08-22 19:55:55,34.44300,-107.61983,39,303,21106.79," StrTrk 406 9 1.51V -6C 4759Pa " +2022-08-22 19:56:54,2022-08-22 19:56:54,34.44650,-107.62600,41,305,21090.03," StrTrk 407 9 1.51V -5C 4772Pa " +2022-08-22 19:58:53,2022-08-22 19:58:53,34.45367,-107.63833,41,304,20994.93," StrTrk 409 9 1.51V -6C 4847Pa " +2022-08-22 19:59:53,2022-08-22 19:59:53,34.45717,-107.64450,41,302,20975.73," StrTrk 410 9 1.52V -7C 4830Pa " +2022-08-22 20:00:53,2022-08-22 20:00:53,34.46033,-107.65083,41,301,20976.95," StrTrk 411 9 1.51V -7C 4840Pa " +2022-08-22 20:01:53,2022-08-22 20:01:53,34.46350,-107.65733,41,300,20969.02," StrTrk 412 9 1.51V -7C 4857Pa " +2022-08-22 20:02:53,2022-08-22 20:02:53,34.46667,-107.66383,41,299,20969.02," StrTrk 413 9 1.52V -8C 4851Pa " +2022-08-22 20:03:53,2022-08-22 20:03:53,34.46983,-107.67033,41,299,20972.98," StrTrk 414 9 1.51V -8C 4852Pa " +2022-08-22 20:04:54,2022-08-22 20:04:54,34.47283,-107.67683,41,300,20952.87," StrTrk 415 9 1.52V -7C 4848Pa " +2022-08-22 20:05:53,2022-08-22 20:05:53,34.47600,-107.68317,41,300,20916.90," StrTrk 416 9 1.52V -6C 4894Pa " +2022-08-22 20:06:53,2022-08-22 20:09:35,34.47917,-107.68950,39,300,20909.89," StrTrk 417 9 1.51V -5C 4907Pa " +2022-08-22 20:09:53,2022-08-22 20:09:53,34.48867,-107.70783,39,302,20947.99," StrTrk 420 9 1.52V -6C 4865Pa " +2022-08-22 20:10:53,2022-08-22 20:10:53,34.49200,-107.71383,39,302,20957.74," StrTrk 421 9 1.51V -6C 4858Pa " +2022-08-22 20:12:53,2022-08-22 20:12:53,34.49800,-107.72600,37,300,20962.92," StrTrk 423 9 1.52V -4C 4874Pa " +2022-08-22 20:13:53,2022-08-22 20:13:53,34.50100,-107.73200,37,300,20998.89," StrTrk 424 9 1.52V -3C 4848Pa " +2022-08-22 20:14:53,2022-08-22 20:14:53,34.50383,-107.73800,39,302,21059.85," StrTrk 425 9 1.52V -5C 4790Pa " +2022-08-22 20:15:53,2022-08-22 20:15:53,34.50683,-107.74383,35,302,21034.86," StrTrk 426 9 1.52V -7C 4786Pa " +2022-08-22 20:16:53,2022-08-22 20:16:53,34.50967,-107.74950,35,304,21013.83," StrTrk 427 9 1.52V -09C 4797Pa " +2022-08-22 20:17:53,2022-08-22 20:17:53,34.51283,-107.75533,39,301,21042.78," StrTrk 428 9 1.52V -09C 4801Pa " +2022-08-22 20:18:53,2022-08-22 20:18:53,34.51583,-107.76117,37,301,21065.95," StrTrk 429 9 1.53V -09C 4748Pa " +2022-08-22 20:19:53,2022-08-22 20:19:53,34.51883,-107.76700,37,301,21059.85," StrTrk 430 9 1.52V -8C 4785Pa " +2022-08-22 20:20:53,2022-08-22 20:20:53,34.52167,-107.77267,35,302,21042.78," StrTrk 431 9 1.52V -8C 4799Pa " +2022-08-22 20:21:53,2022-08-22 20:21:53,34.52467,-107.77833,37,300,21048.88," StrTrk 432 9 1.51V -6C 4798Pa " +2022-08-22 20:22:53,2022-08-22 20:22:53,34.52767,-107.78417,39,303,21069.91," StrTrk 433 9 1.51V -5C 4769Pa " +2022-08-22 20:23:53,2022-08-22 20:23:53,34.53083,-107.78983,35,301,21039.73," StrTrk 434 9 1.52V -6C 4796Pa " +2022-08-22 20:24:53,2022-08-22 20:24:53,34.53367,-107.79533,35,302,21026.02," StrTrk 435 9 1.52V -6C 4810Pa " +2022-08-22 20:25:53,2022-08-22 20:25:53,34.53650,-107.80067,33,303,21021.75," StrTrk 436 9 1.52V -5C 4826Pa " +2022-08-22 20:26:53,2022-08-22 20:26:53,34.53917,-107.80583,33,303,21023.88," StrTrk 437 9 1.51V -5C 4805Pa " +2022-08-22 20:28:53,2022-08-22 20:28:53,34.54467,-107.81567,31,303,21014.74," StrTrk 439 9 1.52V -5C 4829Pa " +2022-08-22 20:29:30,2022-08-22 20:29:30,34.54200,-107.81100,31,303,21024.80," StrTrk 438 9 1.52V -6C 4815Pa " +2022-08-22 20:29:53,2022-08-22 20:29:53,34.54733,-107.82033,31,307,21001.02," StrTrk 440 9 1.51V -7C 4824Pa " +2022-08-22 20:30:53,2022-08-22 20:30:53,34.55000,-107.82517,31,300,20976.95," StrTrk 441 9 1.51V -6C 4858Pa " +2022-08-22 20:31:53,2022-08-22 20:31:53,34.55233,-107.83000,30,299,20933.97," StrTrk 442 9 1.51V -6C 4886Pa " +2022-08-22 20:32:53,2022-08-22 20:32:53,34.55467,-107.83483,31,296,20892.82," StrTrk 443 9 1.51V -7C 4909Pa " +2022-08-22 20:33:53,2022-08-22 20:33:53,34.55667,-107.84017,31,294,20863.86," StrTrk 444 9 1.51V -8C 4939Pa " +2022-08-22 20:34:53,2022-08-22 20:34:53,34.55850,-107.84550,31,288,20809.00," StrTrk 445 9 1.51V -09C 4962Pa " +2022-08-22 20:35:53,2022-08-22 20:35:53,34.55967,-107.85117,30,280,20765.72," StrTrk 446 9 1.51V -8C 5005Pa " +2022-08-22 20:36:53,2022-08-22 20:36:53,34.56067,-107.85633,28,282,20747.74," StrTrk 447 9 1.52V -09C 5010Pa " +2022-08-22 20:38:53,2022-08-22 20:38:53,34.56233,-107.86700,30,278,20700.80," StrTrk 449 9 1.51V -10C 5059Pa " +2022-08-22 20:39:53,2022-08-22 20:39:53,34.56283,-107.87267,30,275,20654.77," StrTrk 450 9 1.51V -09C 5097Pa " +2022-08-22 20:40:53,2022-08-22 20:40:53,34.56333,-107.87817,30,275,20616.98," StrTrk 451 9 1.52V -09C 5131Pa " +2022-08-22 20:41:53,2022-08-22 20:41:53,34.56400,-107.88400,31,276,20606.00," StrTrk 452 9 1.51V -8C 5149Pa " +2022-08-22 20:42:53,2022-08-22 20:42:53,34.56450,-107.89000,33,277,20610.88," StrTrk 453 9 1.51V -8C 5141Pa " +2022-08-22 20:43:53,2022-08-22 20:43:53,34.56500,-107.89600,31,275,20600.82," StrTrk 454 9 1.52V -7C 5152Pa " +2022-08-22 20:45:53,2022-08-22 20:45:53,34.56550,-107.90800,33,272,20528.89," StrTrk 456 9 1.51V -7C 5225Pa " +2022-08-22 20:46:53,2022-08-22 20:46:53,34.56583,-107.91450,37,273,20522.79," StrTrk 457 9 1.52V -10C 5186Pa " +2022-08-22 20:47:53,2022-08-22 20:47:53,34.56617,-107.92167,39,273,20536.81," StrTrk 458 9 1.51V -12C 5216Pa " +2022-08-22 20:48:53,2022-08-22 20:48:53,34.56633,-107.92900,39,272,20553.88," StrTrk 459 9 1.51V -12C 5121Pa " +2022-08-22 20:49:53,2022-08-22 20:49:53,34.56667,-107.93633,39,272,20556.93," StrTrk 460 9 1.51V -11C 5140Pa " +2022-08-22 20:51:53,2022-08-22 20:51:53,34.56750,-107.95100,41,275,20563.94," StrTrk 462 9 1.52V -11C 5166Pa " +2022-08-22 20:52:53,2022-08-22 20:52:53,34.56817,-107.95850,41,278,20579.79," StrTrk 463 9 1.51V -09C 5174Pa " +2022-08-22 20:53:53,2022-08-22 20:53:53,34.56917,-107.96617,41,278,20583.75," StrTrk 464 9 1.51V -09C 5154Pa " +2022-08-22 20:54:53,2022-08-22 20:54:53,34.57000,-107.97383,43,277,20581.92," StrTrk 465 9 1.51V -09C 5173Pa " +2022-08-22 20:55:53,2022-08-22 20:55:53,34.57067,-107.98133,41,275,20564.86," StrTrk 466 9 1.51V -8C 5196Pa " +2022-08-22 20:56:53,2022-08-22 20:56:53,34.57117,-107.98883,41,274,20575.83," StrTrk 467 9 1.51V -7C 5183Pa " +2022-08-22 20:57:53,2022-08-22 20:57:53,34.57167,-107.99633,39,273,20596.86," StrTrk 468 9 1.52V -6C 5173Pa " +2022-08-22 20:58:53,2022-08-22 20:58:53,34.57217,-108.00367,41,275,20590.76," StrTrk 469 9 1.50V -6C 5178Pa " +2022-08-22 20:59:53,2022-08-22 20:59:53,34.57283,-108.01117,41,281,20627.95," StrTrk 470 9 1.51V -4C 5158Pa " +2022-08-22 21:00:53,2022-08-22 21:00:53,34.57350,-108.01833,39,277,20633.74," StrTrk 471 9 1.51V -7C 5124Pa " +2022-08-22 21:01:53,2022-08-22 21:01:53,34.57450,-108.02533,35,278,20661.78," StrTrk 472 9 1.52V -7C 5105Pa " +2022-08-22 21:03:53,2022-08-22 21:03:53,34.57600,-108.03883,39,279,20656.91," StrTrk 474 9 1.52V -7C 5113Pa " +2022-08-22 21:04:53,2022-08-22 21:04:53,34.57683,-108.04550,37,280,20665.74," StrTrk 475 9 1.51V -7C 5099Pa " +2022-08-22 21:05:53,2022-08-22 21:05:53,34.57783,-108.05233,39,280,20655.99," StrTrk 476 9 1.52V -7C 5118Pa " +2022-08-22 21:06:53,2022-08-22 21:06:53,34.57867,-108.05900,33,276,20690.74," StrTrk 477 9 1.51V -4C 5093Pa " +2022-08-22 21:07:53,2022-08-22 21:07:53,34.57917,-108.06500,33,277,20729.75," StrTrk 478 9 1.50V -6C 5054Pa " +2022-08-22 21:08:53,2022-08-22 21:08:53,34.57983,-108.07100,31,276,20737.98," StrTrk 479 9 1.51V -4C 5053Pa " +2022-08-22 21:09:53,2022-08-22 21:09:53,34.58033,-108.07667,31,277,20764.80," StrTrk 480 9 1.51V -5C 5031Pa " +2022-08-22 21:10:53,2022-08-22 21:10:53,34.58067,-108.08233,30,274,20760.84," StrTrk 481 9 1.52V -6C 5025Pa " +2022-08-22 21:11:53,2022-08-22 21:11:53,34.58117,-108.08800,31,274,20771.82," StrTrk 482 9 1.52V -6C 5022Pa " +2022-08-22 21:12:53,2022-08-22 21:12:53,34.58150,-108.09383,31,274,20790.71," StrTrk 483 9 1.53V -5C 5012Pa " +2022-08-22 21:13:53,2022-08-22 21:13:53,34.58167,-108.09967,31,273,20793.76," StrTrk 484 9 1.52V -3C 5014Pa " +2022-08-22 21:14:53,2022-08-22 21:14:53,34.58217,-108.10583,33,275,20807.78," StrTrk 485 9 1.52V -2C 5016Pa " +2022-08-22 21:15:53,2022-08-22 21:15:53,34.58283,-108.11217,33,280,20846.80," StrTrk 486 9 1.52V -2C 4972Pa " +2022-08-22 21:16:53,2022-08-22 21:16:53,34.58350,-108.11833,33,279,20892.82," StrTrk 487 9 1.52V -2C 4938Pa " +2022-08-22 21:18:53,2022-08-22 21:18:53,34.58533,-108.13033,31,281,20921.78," StrTrk 489 9 1.52V 0C 4930Pa " +2022-08-22 21:19:53,2022-08-22 21:19:53,34.58617,-108.13617,31,281,20909.89," StrTrk 490 9 1.53V 0C 4952Pa " +2022-08-22 21:20:53,2022-08-22 21:20:53,34.58700,-108.14200,31,279,20906.84," StrTrk 491 9 1.53V 1C 4956Pa " +2022-08-22 21:21:53,2022-08-22 21:21:53,34.58767,-108.14767,31,277,20925.74," StrTrk 492 9 1.53V -1C 4919Pa " +2022-08-22 21:22:53,2022-08-22 21:22:53,34.58833,-108.15350,31,275,20943.72," StrTrk 493 9 1.53V -3C 4894Pa " +2022-08-22 21:23:53,2022-08-22 21:23:53,34.58867,-108.15933,31,274,20953.78," StrTrk 494 9 1.53V -3C 4881Pa " +2022-08-22 21:24:53,2022-08-22 21:24:53,34.58917,-108.16533,31,274,20952.87," StrTrk 495 9 1.53V -3C 4891Pa " +2022-08-22 21:25:53,2022-08-22 21:26:51,34.58950,-108.17117,33,275,20932.75," StrTrk 496 9 1.54V -3C 4906Pa " +2022-08-22 21:27:53,2022-08-22 21:27:53,34.59067,-108.18317,31,276,20877.89," StrTrk 498 9 1.54V -1C 4969Pa " +2022-08-22 21:28:53,2022-08-22 21:28:53,34.59117,-108.18883,30,275,20873.01," StrTrk 499 9 1.54V -1C 4970Pa " +2022-08-22 21:29:41,2022-08-22 21:29:41,34.59017,-108.17717,31,276,20898.00," StrTrk 497 9 1.53V -2C 4932Pa " +2022-08-22 21:29:53,2022-08-22 21:29:53,34.59167,-108.19433,30,275,20858.99," StrTrk 500 9 1.54V -1C 4976Pa " +2022-08-22 21:30:53,2022-08-22 21:30:53,34.59217,-108.19967,28,276,20809.92," StrTrk 501 9 1.55V -1C 5022Pa " +2022-08-22 21:31:53,2022-08-22 21:31:53,34.59267,-108.20500,28,277,20752.92," StrTrk 502 9 1.54V -2C 5053Pa " +2022-08-22 21:32:53,2022-08-22 21:32:53,34.59317,-108.21033,30,277,20717.87," StrTrk 503 9 1.55V -2C 5079Pa " +2022-08-22 21:33:53,2022-08-22 21:33:53,34.59383,-108.21600,31,277,20749.87," StrTrk 504 9 1.54V -1C 5057Pa " +2022-08-22 21:34:53,2022-08-22 21:34:53,34.59433,-108.22167,33,274,20777.00," StrTrk 505 9 1.55V -3C 5030Pa " +2022-08-22 21:35:53,2022-08-22 21:38:21,34.59517,-108.22783,35,282,20740.73," StrTrk 506 9 1.55V -6C 5048Pa " +2022-08-22 21:38:53,2022-08-22 21:38:53,34.59900,-108.24833,41,283,20658.73," StrTrk 509 9 1.54V -6C 5112Pa " +2022-08-22 21:39:53,2022-08-22 21:39:53,34.60033,-108.25550,44,283,20639.84," StrTrk 510 9 1.55V -4C 5134Pa " +2022-08-22 21:40:53,2022-08-22 21:40:53,34.60183,-108.26283,41,283,20628.86," StrTrk 511 9 1.54V -5C 5149Pa " +2022-08-22 21:41:53,2022-08-22 21:41:53,34.60333,-108.27000,39,284,20657.82," StrTrk 512 9 1.54V -5C 5108Pa " +2022-08-22 21:42:53,2022-08-22 21:42:53,34.60483,-108.27717,39,285,20690.74," StrTrk 513 9 1.54V -5C 5104Pa " +2022-08-22 21:43:53,2022-08-22 21:43:53,34.60650,-108.28383,37,287,20681.90," StrTrk 514 9 1.54V -4C 5115Pa " +2022-08-22 21:44:53,2022-08-22 21:44:53,34.60833,-108.29067,39,287,20667.88," StrTrk 515 9 1.54V -2C 5132Pa " +2022-08-22 21:45:53,2022-08-22 21:45:53,34.61017,-108.29750,41,289,20652.94," StrTrk 516 9 1.54V 0C 5156Pa " +2022-08-22 21:46:53,2022-08-22 21:46:53,34.61233,-108.30467,43,291,20660.87," StrTrk 517 9 1.53V 1C 5162Pa " +2022-08-22 21:47:53,2022-08-22 21:47:53,34.61467,-108.31183,41,290,20650.81," StrTrk 518 9 1.53V -1C 5155Pa " +2022-08-22 21:48:53,2022-08-22 21:48:53,34.61700,-108.31883,41,291,20621.85," StrTrk 519 9 1.54V -2C 5170Pa " +2022-08-22 21:49:53,2022-08-22 21:49:53,34.61900,-108.32583,39,285,20656.91," StrTrk 520 9 1.54V -1C 5136Pa " +2022-08-22 21:50:53,2022-08-22 21:50:53,34.62067,-108.33317,41,288,20632.83," StrTrk 521 9 1.54V -4C 5157Pa " +2022-08-22 21:51:53,2022-08-22 21:51:53,34.62267,-108.34017,39,287,20614.84," StrTrk 522 9 1.54V -3C 5177Pa " +2022-08-22 21:53:53,2022-08-22 21:53:53,34.62633,-108.35450,41,287,20636.79," StrTrk 524 9 1.53V -3C 5150Pa " +2022-08-22 21:54:53,2022-08-22 21:54:53,34.62800,-108.36167,41,283,20669.71," StrTrk 525 9 1.54V -2C 5127Pa " +2022-08-22 21:55:53,2022-08-22 21:55:53,34.62950,-108.36900,41,283,20666.96," StrTrk 526 9 1.53V -1C 5132Pa " +2022-08-22 21:56:53,2022-08-22 21:56:53,34.63083,-108.37650,41,279,20713.90," StrTrk 527 9 1.54V 0C 5101Pa " +2022-08-22 21:57:53,2022-08-22 21:57:53,34.63183,-108.38383,43,276,20763.89," StrTrk 528 9 1.54V 0C 5061Pa " +2022-08-22 21:58:53,2022-08-22 21:58:53,34.63267,-108.39167,43,278,20765.72," StrTrk 529 9 1.53V 0C 5053Pa " +2022-08-22 21:59:53,2022-08-22 21:59:53,34.63367,-108.39967,44,278,20766.94," StrTrk 530 9 1.53V -1C 5050Pa " +2022-08-22 22:00:53,2022-08-22 22:00:53,34.63483,-108.40783,44,279,20752.00," StrTrk 531 9 1.53V -3C 5052Pa " +2022-08-22 22:01:53,2022-08-22 22:01:53,34.63600,-108.41600,44,280,20760.84," StrTrk 532 9 1.53V -3C 5048Pa " +2022-08-22 22:02:53,2022-08-22 22:02:53,34.63733,-108.42400,44,283,20729.75," StrTrk 533 9 1.54V -4C 5065Pa " +2022-08-22 22:03:53,2022-08-22 22:03:53,34.63900,-108.43167,43,286,20721.83," StrTrk 534 9 1.54V -5C 5052Pa " +2022-08-22 22:04:53,2022-08-22 22:04:53,34.64100,-108.43933,44,285,20723.96," StrTrk 535 9 1.53V -4C 5071Pa " +2022-08-22 22:05:53,2022-08-22 22:07:47,34.64333,-108.44700,44,289,20689.82," StrTrk 536 9 1.53V -3C 5104Pa " +2022-08-22 22:08:53,2022-08-22 22:08:53,34.65033,-108.47017,44,289,20672.76," StrTrk 539 9 1.54V -1C 5129Pa " +2022-08-22 22:09:06,2022-08-22 22:09:06,34.64550,-108.45467,44,289,20661.78," StrTrk 537 9 1.53V -2C 5144Pa " +2022-08-22 22:09:53,2022-08-22 22:09:53,34.65250,-108.47783,44,288,20651.72," StrTrk 540 9 1.53V 0C 5164Pa " +2022-08-22 22:10:53,2022-08-22 22:10:53,34.65483,-108.48567,44,288,20637.70," StrTrk 541 9 1.54V 0C 5185Pa " +2022-08-22 22:12:53,2022-08-22 22:12:53,34.65933,-108.50117,44,287,20609.97," StrTrk 543 9 1.53V 1C 5192Pa " +2022-08-22 22:13:49,2022-08-22 22:13:49,34.65717,-108.49350,46,290,20622.77," StrTrk 542 9 1.53V 0C 5184Pa " +2022-08-22 22:14:53,2022-08-22 22:14:53,34.66283,-108.51617,41,282,20591.98," StrTrk 545 9 1.53V 2C 5222Pa " +2022-08-22 22:16:41,2022-08-22 22:16:41,34.66117,-108.50883,43,285,20600.82," StrTrk 544 9 1.53V 1C 5210Pa " +2022-08-22 22:17:54,2022-08-22 22:17:54,34.66617,-108.53717,35,280,20517.92," StrTrk 548 9 1.53V 0C 5277Pa " +2022-08-22 22:18:36,2022-08-22 22:18:36,34.66517,-108.53067,37,280,20534.99," StrTrk 547 9 1.54V 0C 5269Pa " +2022-08-22 22:18:53,2022-08-22 22:18:53,34.66700,-108.54367,35,279,20529.80," StrTrk 549 9 1.53V 0C 5266Pa " +2022-08-22 22:19:53,2022-08-22 22:19:53,34.66783,-108.55017,37,279,20520.96," StrTrk 550 9 1.52V 2C 5278Pa " +2022-08-22 22:20:53,2022-08-22 22:20:53,34.66883,-108.55683,37,279,20503.90," StrTrk 551 9 1.52V 3C 5305Pa " +2022-08-22 22:21:53,2022-08-22 22:21:53,34.66967,-108.56350,37,279,20473.72," StrTrk 552 9 1.53V 3C 5333Pa " +2022-08-22 22:22:53,2022-08-22 22:22:53,34.67067,-108.57017,35,279,20457.87," StrTrk 553 9 1.52V 2C 5347Pa " +2022-08-22 22:23:53,2022-08-22 22:23:53,34.67150,-108.57667,37,280,20465.80," StrTrk 554 9 1.52V 0C 5326Pa " +2022-08-22 22:24:53,2022-08-22 22:27:18,34.67267,-108.58333,35,280,20460.92," StrTrk 555 9 1.52V 0C 5331Pa " +2022-08-22 22:27:54,2022-08-22 22:27:54,34.67417,-108.60183,30,268,20369.78," StrTrk 558 9 1.53V -3C 5380Pa " +2022-08-22 22:28:53,2022-08-22 22:28:53,34.67400,-108.60733,28,267,20358.81," StrTrk 559 9 1.52V -4C 5381Pa " +2022-08-22 22:29:53,2022-08-22 22:29:53,34.67383,-108.61250,28,270,20380.76," StrTrk 560 9 1.53V -5C 5357Pa " +2022-08-22 22:30:53,2022-08-22 22:30:53,34.67417,-108.61817,31,272,20408.80," StrTrk 561 9 1.53V -6C 5335Pa " +2022-08-22 22:31:54,2022-08-22 22:31:54,34.67417,-108.62383,30,266,20382.89," StrTrk 562 9 1.52V -5C 5359Pa " +2022-08-22 22:32:53,2022-08-22 22:32:53,34.67350,-108.62917,28,257,20360.94," StrTrk 563 9 1.51V -6C 5382Pa " +2022-08-22 22:33:54,2022-08-22 22:33:54,34.67250,-108.63383,26,252,20362.77," StrTrk 564 9 1.52V -6C 5386Pa " +2022-08-22 22:34:53,2022-08-22 22:34:53,34.67133,-108.63833,24,254,20384.72," StrTrk 565 9 1.52V -6C 5351Pa " +2022-08-22 22:35:53,2022-08-22 22:35:53,34.67067,-108.64300,28,265,20420.99," StrTrk 566 9 1.52V -5C 5321Pa " +2022-08-22 22:36:53,2022-08-22 22:36:53,34.67067,-108.64783,26,269,20445.98," StrTrk 567 9 1.52V -5C 5304Pa " +2022-08-22 22:37:53,2022-08-22 22:37:53,34.67050,-108.65250,26,265,20467.93," StrTrk 568 9 1.52V -5C 5287Pa " +2022-08-22 22:38:53,2022-08-22 22:38:53,34.67033,-108.65733,28,270,20489.88," StrTrk 569 9 1.52V -5C 5262Pa " +2022-08-22 22:39:53,2022-08-22 22:39:53,34.67067,-108.66300,39,282,20493.84," StrTrk 570 9 1.51V -6C 5250Pa " +2022-08-22 22:40:53,2022-08-22 22:40:53,34.67117,-108.66867,31,272,20471.89," StrTrk 571 9 1.51V -5C 5283Pa " +2022-08-22 22:41:53,2022-08-22 22:41:53,34.67150,-108.67467,33,277,20483.78," StrTrk 572 9 1.52V -3C 5283Pa " +2022-08-22 22:42:53,2022-08-22 22:42:53,34.67217,-108.68083,33,278,20546.87," StrTrk 573 9 1.51V -4C 5224Pa " +2022-08-22 22:44:53,2022-08-22 22:44:53,34.67450,-108.69333,37,288,20625.82," StrTrk 575 9 1.52V -3C 5160Pa " +2022-08-22 22:46:53,2022-08-22 22:46:53,34.67767,-108.70550,33,283,20679.77," StrTrk 577 9 1.52V -5C 5107Pa " +2022-08-22 22:47:53,2022-08-22 22:47:53,34.67883,-108.71150,33,284,20695.92," StrTrk 578 9 1.52V -5C 5098Pa " +2022-08-22 22:48:53,2022-08-22 22:48:53,34.68017,-108.71733,33,285,20684.95," StrTrk 579 9 1.51V -2C 5118Pa " +2022-08-22 22:50:53,2022-08-22 22:50:53,34.68267,-108.72950,35,288,20617.89," StrTrk 581 9 1.51V -5C 5163Pa " +2022-08-22 22:52:54,2022-08-22 22:52:54,34.68500,-108.74200,33,282,20680.98," StrTrk 583 9 1.51V -7C 5081Pa " +2022-08-22 22:53:53,2022-08-22 22:53:53,34.68650,-108.74817,35,287,20609.97," StrTrk 584 9 1.52V -6C 5176Pa " +2022-08-22 22:54:53,2022-08-22 22:54:53,34.68800,-108.75450,35,282,20606.00," StrTrk 585 9 1.51V -5C 5160Pa " +2022-08-22 22:55:53,2022-08-22 22:55:53,34.68917,-108.76033,31,287,20566.99," StrTrk 586 9 1.51V -5C 5199Pa " +2022-08-22 22:56:53,2022-08-22 22:56:53,34.69050,-108.76633,33,282,20590.76," StrTrk 587 9 1.50V -2C 5188Pa " +2022-08-22 22:57:53,2022-08-22 22:57:53,34.69150,-108.77233,33,279,20612.71," StrTrk 588 9 1.51V -2C 5178Pa " +2022-08-22 22:58:53,2022-08-22 22:58:53,34.69233,-108.77850,33,280,20580.71," StrTrk 589 9 1.52V -4C 5183Pa " +2022-08-22 22:59:53,2022-08-22 22:59:53,34.69317,-108.78450,33,280,20552.97," StrTrk 590 9 1.52V -4C 5197Pa " +2022-08-22 23:00:54,2022-08-22 23:00:54,34.69383,-108.79017,30,277,20551.75," StrTrk 591 9 1.51V -4C 5223Pa " +2022-08-22 23:01:53,2022-08-22 23:01:53,34.69450,-108.79583,30,274,20521.88," StrTrk 592 9 1.52V -4C 5228Pa " +2022-08-22 23:02:53,2022-08-22 23:02:53,34.69483,-108.80150,31,276,20497.80," StrTrk 593 9 1.52V -2C 5269Pa " +2022-08-22 23:03:53,2022-08-22 23:03:53,34.69550,-108.80750,31,279,20496.89," StrTrk 594 9 1.51V 0C 5288Pa " +2022-08-22 23:04:53,2022-08-22 23:04:53,34.69633,-108.81350,31,279,20462.75," StrTrk 595 9 1.51V -1C 5313Pa " +2022-08-22 23:05:53,2022-08-22 23:05:53,34.69667,-108.81883,26,265,20408.80," StrTrk 596 9 1.52V -5C 5345Pa " +2022-08-22 23:06:53,2022-08-22 23:06:53,34.69550,-108.82333,24,251,20342.96," StrTrk 597 9 1.52V -8C 5381Pa " +2022-08-22 23:07:53,2022-08-22 23:07:53,34.69417,-108.82750,24,249,20353.93," StrTrk 598 9 1.51V -6C 5374Pa " +2022-08-22 23:08:53,2022-08-22 23:08:53,34.69300,-108.83167,22,247,20324.98," StrTrk 599 9 1.51V -6C 5406Pa " +2022-08-22 23:09:53,2022-08-22 23:09:53,34.69183,-108.83533,20,255,20283.83," StrTrk 600 9 1.51V -8C 5447Pa " +2022-08-22 23:10:53,2022-08-22 23:10:53,34.69100,-108.83917,20,259,20286.88," StrTrk 601 9 1.52V -09C 5390Pa " +2022-08-22 23:11:53,2022-08-22 23:11:53,34.69050,-108.84300,20,261,20295.72," StrTrk 602 9 1.51V -7C 5433Pa " +2022-08-22 23:12:53,2022-08-22 23:12:53,34.69017,-108.84717,24,265,20252.74," StrTrk 603 9 1.51V -7C 5471Pa " +2022-08-22 23:13:53,2022-08-22 23:13:53,34.69000,-108.85150,24,269,20248.78," StrTrk 604 9 1.51V -7C 5454Pa " +2022-08-22 23:14:53,2022-08-22 23:14:53,34.69000,-108.85617,26,267,20238.72," StrTrk 605 9 1.50V -7C 5461Pa " +2022-08-22 23:15:53,2022-08-22 23:15:53,34.69000,-108.86067,22,265,20252.74," StrTrk 606 9 1.50V -6C 5475Pa " +2022-08-22 23:16:53,2022-08-22 23:16:53,34.68967,-108.86500,26,274,20209.76," StrTrk 607 9 1.50V -6C 5503Pa " +2022-08-22 23:17:53,2022-08-22 23:17:53,34.69017,-108.87050,31,274,20189.95," StrTrk 608 9 1.49V -6C 5532Pa " +2022-08-22 23:18:53,2022-08-22 23:18:53,34.69033,-108.87633,31,271,20180.81," StrTrk 609 9 1.49V -6C 5523Pa " +2022-08-22 23:19:53,2022-08-22 23:19:53,34.69017,-108.88217,33,264,20135.70," StrTrk 610 9 1.49V -8C 5594Pa " +2022-08-22 23:20:53,2022-08-22 23:20:53,34.68950,-108.88817,31,261,20112.84," StrTrk 611 9 1.49V -09C 5537Pa " +2022-08-22 23:21:53,2022-08-22 23:21:53,34.68883,-108.89400,33,260,20099.73," StrTrk 612 9 1.50V -10C 5536Pa " +2022-08-22 23:22:53,2022-08-22 23:22:53,34.68800,-108.90000,33,263,20092.72," StrTrk 613 9 1.50V -12C 5527Pa " +2022-08-22 23:23:53,2022-08-22 23:23:53,34.68750,-108.90600,31,265,20075.96," StrTrk 614 9 1.51V -11C 5544Pa " +2022-08-22 23:26:53,2022-08-22 23:26:53,34.68600,-108.92317,31,263,20082.97," StrTrk 617 9 1.51V -13C 5576Pa " +2022-08-22 23:27:53,2022-08-22 23:27:53,34.68550,-108.92900,31,263,20082.97," StrTrk 618 9 1.52V -14C 5584Pa " +2022-08-22 23:29:53,2022-08-22 23:29:53,34.68383,-108.94083,31,257,20028.71," StrTrk 620 9 1.51V -13C 5659Pa " +2022-08-22 23:30:53,2022-08-22 23:30:53,34.68283,-108.94633,30,255,20008.90," StrTrk 621 9 1.51V -12C 5646Pa " +2022-08-22 23:31:53,2022-08-22 23:31:53,34.68167,-108.95200,30,253,20040.90," StrTrk 622 9 1.50V -11C 5615Pa " +2022-08-22 23:32:53,2022-08-22 23:32:53,34.68067,-108.95733,30,254,20005.85," StrTrk 623 9 1.51V -09C 5696Pa " +2022-08-22 23:33:53,2022-08-22 23:33:53,34.67950,-108.96233,28,252,19950.68," StrTrk 624 9 1.50V -10C 5709Pa " +2022-08-22 23:34:53,2022-08-22 23:34:53,34.67817,-108.96733,28,253,19959.83," StrTrk 625 9 1.50V -10C 5683Pa " +2022-08-22 23:35:53,2022-08-22 23:35:53,34.67683,-108.97250,28,254,19974.76," StrTrk 626 9 1.50V -10C 5732Pa " +2022-08-22 23:36:53,2022-08-22 23:36:53,34.67567,-108.97767,28,255,19992.75," StrTrk 627 9 1.50V -8C 5697Pa " +2022-08-22 23:37:53,2022-08-22 23:37:53,34.67450,-108.98283,28,251,19957.69," StrTrk 628 9 1.50V -09C 5732Pa " +2022-08-22 23:38:53,2022-08-22 23:38:53,34.67300,-108.98783,30,247,19930.87," StrTrk 629 9 1.49V -10C 5725Pa " +2022-08-22 23:39:53,2022-08-22 23:39:53,34.67133,-108.99283,30,248,19963.79," StrTrk 630 9 1.51V -09C 5721Pa " +2022-08-22 23:40:53,2022-08-22 23:40:53,34.66967,-108.99833,33,254,19996.71," StrTrk 631 9 1.49V -7C 5706Pa " +2022-08-22 23:41:55,2022-08-22 23:41:55,34.66817,-109.00383,31,247,19953.73," StrTrk 632 9 1.50V -09C 5690Pa " +2022-08-22 23:42:53,2022-08-22 23:42:53,34.66600,-109.00900,30,240,19891.86," StrTrk 633 9 1.50V -11C 5798Pa " +2022-08-22 23:43:55,2022-08-22 23:43:55,34.66400,-109.01383,30,246,19890.94," StrTrk 634 9 1.51V -11C 5803Pa " +2022-08-22 23:44:53,2022-08-22 23:44:53,34.66250,-109.01917,31,255,19920.81," StrTrk 635 9 1.50V -11C 5730Pa " +2022-08-22 23:45:53,2022-08-22 23:45:53,34.66117,-109.02450,31,252,19861.68," StrTrk 636 9 1.50V -10C 5806Pa " +2022-08-22 23:46:53,2022-08-22 23:46:53,34.65967,-109.03000,31,252,19829.68," StrTrk 637 9 1.49V -8C 5842Pa " +2022-08-22 23:47:53,2022-08-22 23:47:53,34.65850,-109.03533,30,254,19821.75," StrTrk 638 9 1.49V -8C 5878Pa " +2022-08-22 23:48:53,2022-08-22 23:48:53,34.65700,-109.04067,30,249,19814.74," StrTrk 639 9 1.49V -11C 5860Pa " +2022-08-22 23:49:53,2022-08-22 23:49:53,34.65533,-109.04583,30,250,19833.95," StrTrk 640 9 1.49V -10C 5842Pa " +2022-08-22 23:50:53,2022-08-22 23:50:53,34.65367,-109.05083,30,247,19837.91," StrTrk 641 9 1.49V -10C 5834Pa " +2022-08-22 23:51:53,2022-08-22 23:51:53,34.65233,-109.05600,30,255,19885.76," StrTrk 642 9 1.49V -11C 5802Pa " +2022-08-22 23:52:53,2022-08-22 23:52:53,34.65150,-109.06167,33,261,19908.93," StrTrk 643 9 1.49V -11C 5705Pa " +2022-08-22 23:54:53,2022-08-22 23:54:53,34.64933,-109.07367,31,259,19899.78," StrTrk 645 9 1.49V -8C 5801Pa " +2022-08-22 23:55:54,2022-08-22 23:55:54,34.64817,-109.07950,33,255,19928.74," StrTrk 646 9 1.50V -09C 5736Pa " +2022-08-22 23:56:53,2022-08-22 23:56:53,34.64717,-109.08533,31,257,19953.73," StrTrk 647 9 1.49V -09C 5761Pa " +2022-08-22 23:57:53,2022-08-22 23:57:53,34.64600,-109.09133,33,258,19989.70," StrTrk 648 9 1.50V -09C 5731Pa " +2022-08-22 23:58:53,2022-08-22 23:58:53,34.64500,-109.09750,33,261,20002.80," StrTrk 649 9 1.50V -10C 5667Pa " +2022-08-22 23:59:54,2022-08-22 23:59:54,34.64400,-109.10383,35,259,20037.86," StrTrk 650 9 1.49V -10C 5631Pa " +2022-08-23 00:00:53,2022-08-23 00:00:53,34.64317,-109.11050,35,262,20068.95," StrTrk 651 9 1.50V -8C 5633Pa " +2022-08-23 00:01:53,2022-08-23 00:01:53,34.64250,-109.11683,35,262,20034.81," StrTrk 652 9 1.50V -8C 5661Pa " +2022-08-23 00:02:53,2022-08-23 00:02:53,34.64167,-109.12333,35,263,20020.79," StrTrk 653 9 1.50V -09C 5686Pa " +2022-08-23 00:03:53,2022-08-23 00:03:53,34.64117,-109.12983,35,263,20041.82," StrTrk 654 9 1.50V -09C 5638Pa " +2022-08-23 00:04:53,2022-08-23 00:04:53,34.64067,-109.13633,35,263,19991.83," StrTrk 655 9 1.51V -09C 5678Pa " +2022-08-23 00:05:53,2022-08-23 00:05:53,34.64017,-109.14267,33,266,19957.69," StrTrk 656 9 1.51V -09C 5738Pa " +2022-08-23 00:06:53,2022-08-23 00:06:53,34.63967,-109.14883,33,263,19957.69," StrTrk 657 9 1.51V -8C 5711Pa " +2022-08-23 00:07:53,2022-08-23 00:07:53,34.63917,-109.15483,31,263,19916.85," StrTrk 658 9 1.51V -8C 5770Pa " +2022-08-23 00:08:53,2022-08-23 00:08:53,34.63850,-109.16083,33,262,19956.78," StrTrk 659 9 1.52V -09C 5744Pa " +2022-08-23 00:09:53,2022-08-23 00:09:53,34.63783,-109.16700,35,261,19974.76," StrTrk 660 9 1.51V -6C 5716Pa " +2022-08-23 00:10:54,2022-08-23 00:10:54,34.63700,-109.17350,35,261,19924.78," StrTrk 661 9 1.50V -5C 5784Pa " +2022-08-23 00:11:53,2022-08-23 00:11:53,34.63633,-109.18017,37,262,19920.81," StrTrk 662 9 1.51V -4C 5791Pa " +2022-08-23 00:12:53,2022-08-23 00:12:53,34.63533,-109.18667,35,259,19883.93," StrTrk 663 9 1.50V -6C 5807Pa " +2022-08-23 00:13:54,2022-08-23 00:13:54,34.63433,-109.19300,33,257,19873.87," StrTrk 664 9 1.51V -8C 5809Pa " +2022-08-23 00:14:53,2022-08-23 00:14:53,34.63333,-109.19917,35,260,19894.91," StrTrk 665 9 1.51V -8C 5782Pa " +2022-08-23 00:15:53,2022-08-23 00:15:53,34.63250,-109.20550,33,260,19850.71," StrTrk 666 9 1.50V -7C 5846Pa " +2022-08-23 00:16:53,2022-08-23 00:16:53,34.63133,-109.21133,31,257,19812.91," StrTrk 667 9 1.50V -09C 5905Pa " +2022-08-23 00:17:54,2022-08-23 00:17:54,34.63033,-109.21717,31,260,19817.79," StrTrk 668 9 1.51V -10C 5808Pa " +2022-08-23 00:18:53,2022-08-23 00:18:53,34.62967,-109.22317,31,262,19799.81," StrTrk 669 9 1.51V -09C 5892Pa " +2022-08-23 00:19:53,2022-08-23 00:19:53,34.62900,-109.22900,31,262,19801.94," StrTrk 670 9 1.51V -8C 5895Pa " +2022-08-23 00:20:53,2022-08-23 00:20:53,34.62800,-109.23467,30,255,19822.67," StrTrk 671 9 1.52V -7C 5875Pa " +2022-08-23 00:21:53,2022-08-23 00:21:53,34.62700,-109.23983,30,253,19788.84," StrTrk 672 9 1.52V -8C 5905Pa " +2022-08-23 00:22:53,2022-08-23 00:22:53,34.62567,-109.24500,28,251,19779.69," StrTrk 673 9 1.51V -10C 5896Pa " +2022-08-23 00:23:54,2022-08-23 00:23:54,34.62433,-109.25017,30,254,19813.83," StrTrk 674 9 1.51V -09C 5878Pa " +2022-08-23 00:24:53,2022-08-23 00:24:53,34.62317,-109.25517,28,253,19831.81," StrTrk 675 9 1.52V -09C 5851Pa " +2022-08-23 00:25:54,2022-08-23 00:25:54,34.62200,-109.26050,30,257,19849.80," StrTrk 676 9 1.52V -09C 5826Pa " +2022-08-23 00:26:53,2022-08-23 00:26:53,34.62100,-109.26583,28,255,19823.89," StrTrk 677 9 1.51V -09C 5847Pa " +2022-08-23 00:27:53,2022-08-23 00:27:53,34.62000,-109.27100,30,257,19826.94," StrTrk 678 9 1.52V -10C 5868Pa " +2022-08-23 00:28:53,2022-08-23 00:28:53,34.61900,-109.27633,28,256,19870.83," StrTrk 679 9 1.51V -09C 5795Pa " +2022-08-23 00:29:53,2022-08-23 00:29:53,34.61767,-109.28167,30,253,19838.82," StrTrk 680 9 1.51V -10C 5813Pa " +2022-08-23 00:30:54,2022-08-23 00:30:54,34.61650,-109.28683,28,254,19817.79," StrTrk 681 9 1.52V -10C 5931Pa " +2022-08-23 00:31:53,2022-08-23 00:31:53,34.61500,-109.29200,30,247,19890.94," StrTrk 682 9 1.52V -8C 5793Pa " +2022-08-23 00:32:53,2022-08-23 00:32:53,34.61333,-109.29733,31,250,19910.76," StrTrk 683 9 1.51V -8C 5765Pa " +2022-08-23 00:33:53,2022-08-23 00:33:53,34.61183,-109.30267,31,250,19912.89," StrTrk 684 9 1.51V -7C 5801Pa " +2022-08-23 00:34:54,2022-08-23 00:34:54,34.61000,-109.30783,30,248,19898.87," StrTrk 685 9 1.50V -7C 5798Pa " +2022-08-23 00:35:53,2022-08-23 00:35:53,34.60833,-109.31317,31,248,19871.74," StrTrk 686 9 1.51V -09C 5845Pa " +2022-08-23 00:36:53,2022-08-23 00:36:53,34.60667,-109.31850,31,250,19924.78," StrTrk 687 9 1.52V -8C 5768Pa " +2022-08-23 00:37:53,2022-08-23 00:37:53,34.60500,-109.32417,31,251,19973.85," StrTrk 688 9 1.52V -6C 5733Pa " +2022-08-23 00:38:53,2022-08-23 00:38:53,34.60350,-109.32967,30,251,19930.87," StrTrk 689 9 1.50V -5C 5772Pa " +2022-08-23 00:39:53,2022-08-23 00:39:53,34.60200,-109.33483,30,249,19895.82," StrTrk 690 9 1.51V -5C 5821Pa " +2022-08-23 00:40:53,2022-08-23 00:40:53,34.60050,-109.33983,28,249,19849.80," StrTrk 691 9 1.51V -6C 5864Pa " +2022-08-23 00:41:53,2022-08-23 00:41:53,34.59883,-109.34467,28,249,19824.80," StrTrk 692 9 1.50V -6C 5887Pa " +2022-08-23 00:42:53,2022-08-23 00:42:53,34.59750,-109.34950,26,249,19842.78," StrTrk 693 9 1.51V -7C 5852Pa " +2022-08-23 00:43:53,2022-08-23 00:43:53,34.59583,-109.35417,28,245,19820.84," StrTrk 694 9 1.51V -8C 5880Pa " +2022-08-23 00:44:53,2022-08-23 00:44:53,34.59400,-109.35900,28,246,19803.77," StrTrk 695 9 1.51V -09C 5888Pa " +2022-08-23 00:45:54,2022-08-23 00:45:54,34.59200,-109.36383,30,240,19817.79," StrTrk 696 9 1.51V -8C 5866Pa " +2022-08-23 00:46:53,2022-08-23 00:46:53,34.58967,-109.36883,31,241,19843.70," StrTrk 697 9 1.51V -7C 5833Pa " +2022-08-23 00:47:53,2022-08-23 00:47:53,34.58717,-109.37383,30,243,19851.93," StrTrk 698 9 1.52V -6C 5847Pa " +2022-08-23 00:48:53,2022-08-23 00:48:53,34.58500,-109.37883,30,242,19831.81," StrTrk 699 9 1.52V -6C 5864Pa " +2022-08-23 00:49:53,2022-08-23 00:49:53,34.58283,-109.38383,30,242,19853.76," StrTrk 700 9 1.52V -6C 5841Pa " +2022-08-23 00:50:53,2022-08-23 00:50:53,34.58067,-109.38883,30,243,19874.79," StrTrk 701 9 1.52V -6C 5821Pa " +2022-08-23 00:51:53,2022-08-23 00:51:53,34.57883,-109.39383,30,244,19895.82," StrTrk 702 9 1.52V -5C 5818Pa " +2022-08-23 00:52:53,2022-08-23 00:52:53,34.57717,-109.39883,28,250,19839.74," StrTrk 703 9 1.51V -6C 5857Pa " +2022-08-23 00:53:54,2022-08-23 00:53:54,34.57567,-109.40333,26,250,19805.90," StrTrk 704 9 1.52V -7C 5879Pa " +2022-08-23 00:54:53,2022-08-23 00:54:53,34.57417,-109.40783,26,249,19768.72," StrTrk 705 9 1.51V -7C 5924Pa " +2022-08-23 00:55:53,2022-08-23 00:55:53,34.57300,-109.41217,24,252,19718.73," StrTrk 706 9 1.51V -8C 5971Pa " +2022-08-23 00:56:53,2022-08-23 00:56:53,34.57217,-109.41667,24,254,19743.72," StrTrk 707 9 1.51V -8C 5947Pa " +2022-08-23 00:57:53,2022-08-23 00:57:53,34.57133,-109.42133,24,259,19721.78," StrTrk 708 9 1.50V -8C 5972Pa " +2022-08-23 00:59:53,2022-08-23 00:59:53,34.56967,-109.42933,20,252,19693.74," StrTrk 710 9 1.50V -09C 5979Pa " +2022-08-23 01:00:53,2022-08-23 01:00:53,34.56883,-109.43283,19,250,19676.67," StrTrk 711 9 1.50V -09C 6001Pa " +2022-08-23 01:01:53,2022-08-23 01:01:53,34.56767,-109.43617,19,245,19664.78," StrTrk 712 9 1.50V -10C 6058Pa " +2022-08-23 01:02:53,2022-08-23 01:02:53,34.56650,-109.43933,19,244,19642.84," StrTrk 713 9 1.50V -10C 6043Pa " +2022-08-23 01:03:54,2022-08-23 01:03:54,34.56533,-109.44267,19,244,19616.93," StrTrk 714 9 1.50V -10C 6040Pa " +2022-08-23 01:04:53,2022-08-23 01:04:53,34.56433,-109.44567,17,249,19604.74," StrTrk 715 9 1.49V -11C 6082Pa " +2022-08-23 01:05:53,2022-08-23 01:05:53,34.56350,-109.44867,17,251,19613.88," StrTrk 716 9 1.50V -11C 6006Pa " +2022-08-23 01:06:53,2022-08-23 01:06:53,34.56267,-109.45183,17,251,19612.66," StrTrk 717 9 1.49V -11C 6061Pa " +2022-08-23 01:07:53,2022-08-23 01:07:53,34.56200,-109.45500,17,255,19595.90," StrTrk 718 9 1.50V -12C 6117Pa " +2022-08-23 01:08:53,2022-08-23 01:08:53,34.56167,-109.45850,17,261,19600.77," StrTrk 719 9 1.50V -13C 6048Pa " +2022-08-23 01:09:53,2022-08-23 01:09:53,34.56133,-109.46183,19,263,19633.69," StrTrk 720 9 1.49V -13C 6035Pa " +2022-08-23 01:10:54,2022-08-23 01:10:54,34.56083,-109.46517,19,252,19610.83," StrTrk 721 9 1.49V -16C 6030Pa " +2022-08-23 01:11:54,2022-08-23 01:11:54,34.55933,-109.46833,19,229,19546.82," StrTrk 722 9 1.50V -16C 6094Pa " +2022-08-23 01:13:53,2022-08-23 01:13:53,34.55550,-109.47283,17,222,19433.74," StrTrk 724 9 1.49V -15C 6220Pa " +2022-08-23 01:14:53,2022-08-23 01:14:53,34.55333,-109.47517,19,217,19481.90," StrTrk 725 9 1.49V -14C 6162Pa " +2022-08-23 01:15:53,2022-08-23 01:15:53,34.55100,-109.47733,19,217,19536.77," StrTrk 726 9 1.49V -14C 6084Pa " +2022-08-23 01:16:54,2022-08-23 01:16:54,34.54867,-109.47933,19,216,19520.92," StrTrk 727 9 1.49V -14C 6123Pa " +2022-08-23 01:17:53,2022-08-23 01:17:53,34.54650,-109.48117,15,215,19499.88," StrTrk 728 9 1.49V -14C 6151Pa " +2022-08-23 01:18:53,2022-08-23 01:18:53,34.54467,-109.48300,15,218,19505.68," StrTrk 729 9 1.48V -14C 6131Pa " +2022-08-23 01:19:53,2022-08-23 01:19:53,34.54300,-109.48467,11,213,19472.76," StrTrk 730 9 1.49V -15C 6181Pa " +2022-08-23 01:20:53,2022-08-23 01:20:53,34.54150,-109.48567,9,212,19442.89," StrTrk 731 9 1.48V -16C 6209Pa " +2022-08-23 01:21:53,2022-08-23 01:21:53,34.54050,-109.48683,7,226,19419.72," StrTrk 732 9 1.48V -16C 6226Pa " +2022-08-23 01:22:53,2022-08-23 01:22:53,34.53967,-109.48800,7,232,19431.91," StrTrk 733 9 1.48V -17C 6221Pa " +2022-08-23 01:23:53,2022-08-23 01:23:53,34.53883,-109.48933,9,226,19460.87," StrTrk 734 9 1.48V -17C 6176Pa " +2022-08-23 01:24:53,2022-08-23 01:24:53,34.53767,-109.49083,11,221,19459.65," StrTrk 735 9 1.48V -17C 6191Pa " +2022-08-23 01:25:53,2022-08-23 01:25:53,34.53633,-109.49217,11,223,19416.67," StrTrk 736 9 1.48V -17C 6226Pa " +2022-08-23 01:26:53,2022-08-23 01:26:53,34.53517,-109.49367,11,224,19372.78," StrTrk 737 9 1.48V -16C 6294Pa " +2022-08-23 01:27:53,2022-08-23 01:27:53,34.53367,-109.49483,9,210,19330.72," StrTrk 738 9 1.47V -18C 6316Pa " +2022-08-23 01:28:54,2022-08-23 01:28:54,34.53250,-109.49583,9,211,19312.74," StrTrk 739 9 1.47V -18C 6333Pa " +2022-08-23 01:29:53,2022-08-23 01:29:53,34.53133,-109.49667,9,214,19328.89," StrTrk 740 9 1.47V -19C 6324Pa " +2022-08-23 01:30:53,2022-08-23 01:30:53,34.53000,-109.49767,9,212,19305.73," StrTrk 741 9 1.48V -18C 6330Pa " +2022-08-23 01:31:53,2022-08-23 01:31:53,34.52867,-109.49883,9,216,19254.83," StrTrk 742 9 1.49V -19C 6392Pa " +2022-08-23 01:32:53,2022-08-23 01:32:53,34.52767,-109.49983,7,222,19177.71," StrTrk 743 9 1.48V -20C 6469Pa " +2022-08-23 01:33:53,2022-08-23 01:33:53,34.52683,-109.50083,6,234,19151.80," StrTrk 744 9 1.48V -20C 6497Pa " +2022-08-23 01:34:53,2022-08-23 01:34:53,34.52650,-109.50167,6,242,19197.83," StrTrk 745 9 1.48V -19C 6451Pa " +2022-08-23 01:35:53,2022-08-23 01:35:53,34.52600,-109.50250,6,220,19207.89," StrTrk 746 9 1.47V -21C 6435Pa " +2022-08-23 01:36:53,2022-08-23 01:36:53,34.52483,-109.50317,7,202,19188.68," StrTrk 747 9 1.48V -23C 6449Pa " +2022-08-23 01:37:53,2022-08-23 01:37:53,34.52417,-109.50367,2,239,19132.91," StrTrk 748 9 1.47V -24C 6511Pa " +2022-08-23 01:38:53,2022-08-23 01:38:53,34.52450,-109.50417,6,300,19064.63," StrTrk 749 9 1.47V -23C 6595Pa " +2022-08-23 01:39:53,2022-08-23 01:39:53,34.52467,-109.50550,13,266,19011.90," StrTrk 750 9 1.45V -22C 6655Pa " +2022-08-23 01:41:53,2022-08-23 01:41:53,34.52350,-109.50850,6,243,18856.76," StrTrk 752 9 1.46V -24C 6830Pa " +2022-08-23 01:42:53,2022-08-23 01:42:53,34.52283,-109.50967,7,222,18837.86," StrTrk 753 9 1.45V -24C 6842Pa " +2022-08-23 01:43:53,2022-08-23 01:43:53,34.52167,-109.51067,9,212,18831.76," StrTrk 754 9 1.45V -24C 6856Pa " +2022-08-23 01:44:53,2022-08-23 01:44:53,34.52067,-109.51133,7,211,18766.84," StrTrk 755 9 1.45V -24C 6927Pa " +2022-08-23 01:45:53,2022-08-23 01:45:53,34.52017,-109.51233,7,251,18683.63," StrTrk 756 9 1.44V -27C 7012Pa " +2022-08-23 01:46:53,2022-08-23 01:46:53,34.51950,-109.51333,6,226,18627.85," StrTrk 757 9 1.44V -27C 7079Pa " +2022-08-23 01:47:53,2022-08-23 01:47:53,34.51867,-109.51433,9,216,18644.62," StrTrk 758 9 1.45V -26C 7062Pa " +2022-08-23 01:48:53,2022-08-23 01:48:53,34.51750,-109.51550,9,225,18643.70," StrTrk 759 9 1.44V -28C 7067Pa " +2022-08-23 01:49:53,2022-08-23 01:49:53,34.51650,-109.51700,11,228,18586.70," StrTrk 760 9 1.44V -28C 7134Pa " +2022-08-23 01:50:53,2022-08-23 01:50:53,34.51533,-109.51850,9,233,18517.82," StrTrk 761 9 1.45V -29C 7211Pa " +2022-08-23 01:51:53,2022-08-23 01:51:53,34.51450,-109.51933,6,190,18490.69," StrTrk 762 9 1.43V -30C 7250Pa " +2022-08-23 01:52:53,2022-08-23 01:52:53,34.51367,-109.51883,6,128,18473.62," StrTrk 763 9 1.43V -31C 7278Pa " +2022-08-23 01:53:53,2022-08-23 01:53:53,34.51317,-109.51767,7,114,18448.63," StrTrk 764 9 1.42V -31C 7307Pa " +2022-08-23 01:54:55,2022-08-23 01:54:55,34.51267,-109.51600,9,100,18399.86," StrTrk 765 9 1.42V -32C 7371Pa " +2022-08-23 01:55:53,2022-08-23 01:55:53,34.51283,-109.51417,11,75,18303.85," StrTrk 766 9 1.42V -33C 7498Pa " +2022-08-23 01:56:53,2022-08-23 01:56:53,34.51317,-109.51100,20,82,18196.86," StrTrk 767 9 1.41V -34C 7639Pa " +2022-08-23 01:57:54,2022-08-23 01:57:54,34.51333,-109.50700,22,86,18104.82," StrTrk 768 9 1.40V -36C 7758Pa " +2022-08-23 01:58:53,2022-08-23 01:58:53,34.51400,-109.50283,22,67,18009.72," StrTrk 769 9 1.40V -37C 7897Pa " +2022-08-23 01:59:54,2022-08-23 01:59:54,34.51600,-109.50000,19,26,17875.61," StrTrk 770 9 1.39V -39C 8091Pa " +2022-08-23 02:00:53,2022-08-23 02:00:53,34.51933,-109.50000,22,341,17694.86," StrTrk 771 9 1.39V -40C 8360Pa " +2022-08-23 02:01:54,2022-08-23 02:01:54,34.52233,-109.50300,35,311,17449.80," StrTrk 772 9 1.38V -42C 8737Pa " +2022-08-23 02:02:57,2022-08-23 02:02:57,34.52417,-109.50750,20,260,17222.72," StrTrk 773 9 1.36V -43C 9084Pa " +2022-08-23 02:03:53,2022-08-23 02:03:53,34.52350,-109.51050,13,270,17049.60," StrTrk 774 9 1.35V -44C 9367Pa " +2022-08-23 02:04:54,2022-08-23 02:04:54,34.52483,-109.51233,13,1,16899.64," StrTrk 775 8 1.34V -46C 9680Pa " +2022-08-23 02:07:54,2022-08-23 02:07:54,34.52850,-109.50267,28,91,16113.56," StrTrk 778 9 1.31V -50C 11220Pa " +2022-08-23 02:08:54,2022-08-23 02:08:54,34.52900,-109.49833,22,84,15944.70," StrTrk 779 9 1.29V -51C 11720Pa " +2022-08-23 02:09:54,2022-08-23 02:09:54,34.53017,-109.49633,0,47,15705.73," StrTrk 780 5 1.27V -51C 12212Pa " +2022-08-23 02:10:54,2022-08-23 02:10:54,34.53367,-109.49283,22,47,15473.48," StrTrk 781 5 1.24V -51C 12710Pa " +2022-08-23 02:11:54,2022-08-23 02:11:54,34.53717,-109.48917,37,48,15232.68," StrTrk 782 9 1.24V -52C 13279Pa " +2022-08-23 02:12:54,2022-08-23 02:12:54,34.54067,-109.48350,44,65,15000.73," StrTrk 783 9 1.22V -52C 13850Pa " +2022-08-23 02:13:54,2022-08-23 02:13:54,34.54333,-109.47767,37,79,14771.52," StrTrk 784 9 1.21V -52C 14292Pa " +2022-08-23 02:14:54,2022-08-23 02:14:54,34.54517,-109.47150,37,79,14549.63," StrTrk 785 9 1.21V -52C 14503Pa " +2022-08-23 02:15:54,2022-08-23 02:15:54,34.54650,-109.46433,37,88,14356.69," StrTrk 786 9 1.20V -52C 14707Pa " +2022-08-23 02:17:54,2022-08-23 02:17:54,34.55000,-109.44800,54,55,13963.50," StrTrk 788 9 1.19V -51C 15573Pa " +2022-08-23 02:19:54,2022-08-23 02:19:54,34.56083,-109.43017,63,59,13636.45," StrTrk 790 9 1.20V -50C 16208Pa " +2022-08-23 02:20:54,2022-08-23 02:20:54,34.56617,-109.42067,59,53,13459.36," StrTrk 791 9 1.21V -50C 16667Pa " +2022-08-23 02:21:54,2022-08-23 02:21:54,34.57100,-109.41133,65,58,13259.41," StrTrk 792 9 1.21V -49C 17381Pa " +2022-08-23 02:22:54,2022-08-23 02:22:54,34.57650,-109.40183,59,55,13036.60," StrTrk 793 9 1.22V -49C 18398Pa " +2022-08-23 02:24:54,2022-08-23 02:24:54,34.58733,-109.38400,59,59,12621.46," StrTrk 795 9 1.22V -47C 21381Pa " +2022-08-23 02:26:54,2022-08-23 02:26:54,34.59550,-109.36517,56,57,12245.34," StrTrk 797 9 1.23V -46C 24364Pa " +2022-08-23 02:27:54,2022-08-23 02:27:54,34.60017,-109.35717,52,51,12084.41," StrTrk 798 9 1.25V -45C 25436Pa " +2022-08-23 02:28:54,2022-08-23 02:28:54,34.60500,-109.34883,57,57,11939.32," StrTrk 799 9 1.24V -45C 26468Pa " +2022-08-23 02:29:54,2022-08-23 02:29:54,34.61000,-109.34050,59,53,11764.37," StrTrk 800 9 1.25V -44C 27512Pa " +2022-08-23 02:30:54,2022-08-23 02:30:54,34.61483,-109.33183,54,58,11593.37," StrTrk 801 9 1.26V -43C 28615Pa " +2022-08-23 02:32:54,2022-08-23 02:32:54,34.62367,-109.31433,56,57,11214.51," StrTrk 803 9 1.29V -41C 28762Pa " +2022-08-23 02:34:54,2022-08-23 02:34:54,34.63167,-109.29350,69,63,10816.44," StrTrk 805 9 1.30V -39C 28077Pa " +2022-08-23 02:36:54,2022-08-23 02:36:54,34.63883,-109.27150,59,67,10533.28," StrTrk 807 9 1.31V -37C 27341Pa " +2022-08-23 02:37:58,2022-08-23 02:37:58,34.64217,-109.26117,59,72,10418.37," StrTrk 808 9 1.32V -36C 27720Pa " +2022-08-23 02:38:54,2022-08-23 02:38:54,34.64500,-109.25167,57,68,10305.29," StrTrk 809 9 1.33V -35C 28146Pa " +2022-08-23 02:39:54,2022-08-23 02:39:54,34.64733,-109.24117,57,77,10177.27," StrTrk 810 9 1.35V -35C 28635Pa " +2022-08-23 02:40:54,2022-08-23 02:40:54,34.64900,-109.23017,65,82,10064.19," StrTrk 811 9 1.35V -34C 29092Pa " +2022-08-23 02:42:54,2022-08-23 02:42:54,34.65200,-109.21067,50,80,9800.23," StrTrk 813 9 1.37V -32C 30166Pa " +2022-08-23 02:44:58,2022-08-23 02:44:58,34.65367,-109.19417,41,88,9529.27," StrTrk 815 9 1.38V -31C 31301Pa " +2022-08-23 02:45:54,2022-08-23 02:45:54,34.65400,-109.18700,37,83,9408.26," StrTrk 816 9 1.38V -30C 31831Pa " +2022-08-23 02:46:54,2022-08-23 02:46:54,34.65467,-109.18083,33,81,9296.40," StrTrk 817 9 1.40V -29C 32316Pa " +2022-08-23 02:48:54,2022-08-23 02:48:54,34.65550,-109.16733,43,83,8995.26," StrTrk 819 9 1.40V -27C 33675Pa " +2022-08-23 02:50:54,2022-08-23 02:50:54,34.65717,-109.15467,28,68,8665.16," StrTrk 821 9 1.41V -25C 35203Pa " +2022-08-23 02:51:54,2022-08-23 02:51:54,34.65783,-109.14983,24,89,8521.29," StrTrk 822 9 1.42V -24C 35878Pa " +2022-08-23 02:52:54,2022-08-23 02:52:54,34.65750,-109.14550,20,100,8398.15," StrTrk 823 9 1.42V -23C 36468Pa " +2022-08-23 02:53:54,2022-08-23 02:53:54,34.65717,-109.14167,17,88,8293.30," StrTrk 824 9 1.44V -22C 36975Pa " +2022-08-23 02:54:54,2022-08-23 02:54:54,34.65717,-109.13950,9,97,8194.24," StrTrk 825 9 1.43V -21C 37446Pa " +2022-08-23 02:55:54,2022-08-23 02:55:54,34.65767,-109.13733,9,68,8104.33," StrTrk 826 9 1.44V -21C 37906Pa " +2022-08-23 02:56:54,2022-08-23 02:56:54,34.65783,-109.13550,6,100,7996.12," StrTrk 827 9 1.45V -20C 38469Pa " +2022-08-23 02:57:54,2022-08-23 02:58:25,34.65733,-109.13417,7,137,7883.35," StrTrk 828 9 1.45V -19C 39037Pa " +2022-08-23 02:58:54,2022-08-23 02:58:54,34.65667,-109.13333,4,182,7751.37," StrTrk 829 9 1.45V -18C 39700Pa " +2022-08-23 02:59:54,2022-08-23 02:59:54,34.65567,-109.13317,6,206,7636.15," StrTrk 830 9 1.45V -17C 40317Pa " +2022-08-23 03:00:54,2022-08-23 03:00:54,34.65483,-109.13350,6,234,7527.34," StrTrk 831 9 1.47V -16C 40881Pa " +2022-08-23 03:01:54,2022-08-23 03:01:54,34.65333,-109.13383,13,180,7413.35," StrTrk 832 9 1.47V -16C 41480Pa " +2022-08-23 03:02:54,2022-08-23 03:02:54,34.65033,-109.13383,20,177,7322.21," StrTrk 833 9 1.47V -15C 41983Pa " +2022-08-23 03:03:54,2022-08-23 03:03:54,34.64650,-109.13350,30,160,7216.14," StrTrk 834 9 1.47V -14C 42539Pa " +2022-08-23 03:05:54,2022-08-23 03:05:54,34.63850,-109.13050,30,165,6980.22," StrTrk 836 9 1.47V -13C 43806Pa " +2022-08-23 03:06:54,2022-08-23 03:06:54,34.63467,-109.12883,31,164,6835.14," StrTrk 837 9 1.48V -12C 44673Pa " +2022-08-23 03:07:54,2022-08-23 03:07:54,34.63100,-109.12750,20,171,6675.12," StrTrk 838 9 1.48V -11C 45605Pa " +2022-08-23 03:08:54,2022-08-23 03:08:54,34.62833,-109.12650,17,169,6519.06," StrTrk 839 9 1.48V -10C 46516Pa " +2022-08-23 03:09:54,2022-08-23 03:09:54,34.62583,-109.12567,13,158,6390.13," StrTrk 840 9 1.48V -09C 47284Pa " +2022-08-23 03:10:54,2022-08-23 03:10:54,34.62283,-109.12533,20,171,6287.11," StrTrk 841 9 1.49V -8C 47918Pa " +2022-08-23 03:11:54,2022-08-23 03:11:54,34.61933,-109.12517,26,173,6194.15," StrTrk 842 9 1.49V -8C 48466Pa " +2022-08-23 03:12:54,2022-08-23 03:12:54,34.61533,-109.12483,28,181,6111.24," StrTrk 843 9 1.50V -7C 48987Pa " +2022-08-23 03:14:54,2022-08-23 03:14:54,34.60667,-109.12417,33,170,5884.16," StrTrk 845 9 1.50V -6C 50446Pa " +2022-08-23 03:15:54,2022-08-23 03:15:54,34.60167,-109.12333,35,172,5732.98," StrTrk 846 9 1.50V -6C 51406Pa " +2022-08-23 03:16:54,2022-08-23 03:16:54,34.59617,-109.12200,35,165,5575.10," StrTrk 847 9 1.51V -5C 52437Pa " +2022-08-23 03:18:54,2022-08-23 03:18:54,34.58617,-109.11917,30,168,5316.02," StrTrk 849 9 1.51V -4C 54192Pa " +2022-08-23 03:19:54,2022-08-23 03:19:54,34.58150,-109.11800,28,163,5198.06," StrTrk 850 9 1.51V -4C 55002Pa " +2022-08-23 03:21:54,2022-08-23 03:21:54,34.57350,-109.11583,24,161,4922.22," StrTrk 852 9 1.51V -2C 56913Pa " +2022-08-23 03:22:54,2022-08-23 03:22:54,34.57050,-109.11483,22,167,4778.04," StrTrk 853 9 1.51V -1C 57943Pa " +2022-08-23 03:23:54,2022-08-23 03:23:54,34.56750,-109.11383,17,162,4639.06," StrTrk 854 9 1.52V 0C 58950Pa " +2022-08-23 03:24:54,2022-08-23 03:24:54,34.56450,-109.11333,24,176,4507.08," StrTrk 855 9 1.51V 0C 59902Pa " +2022-08-23 03:25:54,2022-08-23 03:25:54,34.56083,-109.11367,28,187,4386.07," StrTrk 856 9 1.52V 0C 60800Pa " +2022-08-23 03:26:54,2022-08-23 03:26:54,34.55700,-109.11383,20,179,4271.16," StrTrk 857 9 1.52V 1C 61679Pa " +2022-08-23 03:27:54,2022-08-23 03:27:54,34.55367,-109.11383,22,180,4155.03," StrTrk 858 9 1.53V 2C 62561Pa " +2022-08-23 03:29:55,2022-08-23 03:29:55,34.54833,-109.11400,19,172,3920.95," StrTrk 860 9 1.54V 4C 64342Pa " +2022-08-23 03:30:55,2022-08-23 03:30:55,34.54583,-109.11383,17,181,3795.98," StrTrk 861 9 1.53V 5C 65324Pa " +2022-08-23 03:32:25,2022-08-23 03:32:25,34.54300,-109.11333,17,159,3664.00," StrTrk 862 9 1.53V 6C 66362Pa " +2022-08-23 03:33:55,2022-08-23 03:33:55,34.53750,-109.11167,17,174,3408.88," StrTrk 864 9 1.54V 8C 68407Pa " +2022-08-23 03:35:55,2022-08-23 03:35:55,34.53400,-109.11000,9,165,3175.10," StrTrk 866 9 1.55V 10C 70333Pa " +2022-08-23 03:36:55,2022-08-23 03:36:55,34.53283,-109.10917,6,142,3063.85," StrTrk 867 9 1.54V 11C 71281Pa " +2022-08-23 03:37:55,2022-08-23 03:37:55,34.53217,-109.10850,7,134,2948.03," StrTrk 868 9 1.55V 12C 72200Pa " +2022-08-23 03:38:55,2022-08-23 03:38:55,34.53183,-109.10767,4,143,2841.04," StrTrk 869 9 1.55V 13C 73124Pa " +2022-08-23 03:40:55,2022-08-23 03:40:55,34.53117,-109.10733,7,268,2655.11," StrTrk 871 9 1.55V 15C 74776Pa " +2022-08-23 03:43:55,2022-08-23 03:43:55,34.53817,-109.11833,35,306,2190.90," StrTrk 874 9 1.57V 17C 78874Pa " +2022-08-23 03:46:55,2022-08-23 03:46:55,34.54683,-109.13400,26,278,1838.86," StrTrk 877 9 1.58V 20C 82159Pa " diff --git a/balloon_data/SHAB3V-APRS.csv b/balloon_data/SHAB3V-APRS.csv new file mode 100644 index 0000000..b09f1b8 --- /dev/null +++ b/balloon_data/SHAB3V-APRS.csv @@ -0,0 +1,577 @@ +time,lasttime,lat,lng,speed,course,altitude,comment +2020-11-20 14:58:50,2020-11-20 15:04:50,33.67633,-114.21017,0,341,268.83," StrTrk 25 9 1.67V 14C 98956Pa " +2020-11-20 15:30:50,2020-11-20 15:34:50,33.67650,-114.21017,0,7,269.75," StrTrk 55 9 1.63V 21C 98972Pa " +2020-11-20 15:46:50,2020-11-20 15:46:50,33.67633,-114.21000,2,130,269.75," StrTrk 67 9 1.64V 24C 98967Pa " +2020-11-20 15:47:50,2020-11-20 15:47:50,33.67617,-114.20950,4,120,281.94," StrTrk 68 9 1.64V 23C 98808Pa " +2020-11-20 15:48:50,2020-11-20 15:48:50,33.67567,-114.20867,9,133,295.96," StrTrk 69 9 1.63V 22C 98613Pa " +2020-11-20 15:49:49,2020-11-20 15:49:49,33.67450,-114.20750,13,137,326.75," StrTrk 70 9 1.64V 23C 98304Pa " +2020-11-20 15:51:50,2020-11-20 15:51:50,33.67067,-114.20417,17,138,413.92," StrTrk 72 9 1.63V 24C 97342Pa " +2020-11-20 15:52:50,2020-11-20 15:52:50,33.66850,-114.20283,17,174,460.86," StrTrk 73 9 1.63V 25C 96777Pa " +2020-11-20 15:53:49,2020-11-20 15:53:49,33.66633,-114.20283,13,182,505.97," StrTrk 74 9 1.64V 24C 96263Pa " +2020-11-20 15:55:50,2020-11-20 15:55:50,33.66117,-114.20350,19,188,623.93," StrTrk 76 9 1.64V 24C 94858Pa " +2020-11-20 15:57:49,2020-11-20 15:57:49,33.65650,-114.20450,11,200,737.01," StrTrk 78 9 1.64V 23C 93666Pa " +2020-11-20 15:58:49,2020-11-20 15:59:24,33.65467,-114.20550,13,209,783.95," StrTrk 79 9 1.65V 23C 93134Pa " +2020-11-20 15:59:49,2020-11-20 15:59:49,33.65267,-114.20650,17,196,847.04," StrTrk 80 9 1.64V 24C 92462Pa " +2020-11-20 16:00:49,2020-11-20 16:00:49,33.65050,-114.20767,13,216,904.95," StrTrk 81 9 1.65V 24C 91840Pa " +2020-11-20 16:01:48,2020-11-20 16:01:48,33.64917,-114.20950,13,232,956.77," StrTrk 82 9 1.64V 24C 91306Pa " +2020-11-20 16:02:48,2020-11-20 16:02:48,33.64817,-114.21117,9,237,1000.05," StrTrk 83 9 1.65V 24C 90812Pa " +2020-11-20 16:03:48,2020-11-20 16:03:48,33.64767,-114.21250,6,251,1057.05," StrTrk 84 9 1.64V 24C 90225Pa " +2020-11-20 16:04:49,2020-11-20 16:04:49,33.64750,-114.21367,4,283,1114.04," StrTrk 85 9 1.64V 24C 89595Pa " +2020-11-20 16:05:48,2020-11-20 16:05:48,33.64833,-114.21400,9,354,1178.05," StrTrk 86 9 1.65V 24C 88952Pa " +2020-11-20 16:06:49,2020-11-20 16:06:49,33.65017,-114.21417,13,1,1232.92," StrTrk 87 9 1.65V 24C 88375Pa " +2020-11-20 16:07:48,2020-11-20 16:07:48,33.65183,-114.21367,13,23,1285.95," StrTrk 88 9 1.65V 25C 87843Pa " +2020-11-20 16:08:49,2020-11-20 16:08:49,33.65300,-114.21267,9,49,1342.95," StrTrk 89 9 1.65V 25C 87241Pa " +2020-11-20 16:09:49,2020-11-20 16:09:49,33.65417,-114.21133,9,33,1403.91," StrTrk 90 9 1.64V 25C 86611Pa " +2020-11-20 16:10:48,2020-11-20 16:10:48,33.65533,-114.20967,15,70,1471.88," StrTrk 91 9 1.64V 24C 85931Pa " +2020-11-20 16:11:48,2020-11-20 16:11:48,33.65633,-114.20667,20,63,1545.03," StrTrk 92 9 1.65V 24C 85209Pa " +2020-11-20 16:12:48,2020-11-20 16:12:48,33.65783,-114.20317,22,60,1605.08," StrTrk 93 9 1.65V 24C 84620Pa " +2020-11-20 16:13:48,2020-11-20 16:14:23,33.66000,-114.19950,26,52,1662.07," StrTrk 94 9 1.65V 23C 84029Pa " +2020-11-20 16:14:48,2020-11-20 16:14:48,33.66233,-114.19583,24,52,1719.99," StrTrk 95 9 1.66V 23C 83432Pa " +2020-11-20 16:15:48,2020-11-20 16:15:48,33.66467,-114.19200,24,52,1794.05," StrTrk 96 9 1.65V 22C 82761Pa " +2020-11-20 16:16:48,2020-11-20 16:16:48,33.66717,-114.18833,28,51,1876.04," StrTrk 97 9 1.65V 22C 81938Pa " +2020-11-20 16:17:49,2020-11-20 16:17:49,33.66983,-114.18467,22,46,1958.95," StrTrk 98 9 1.65V 21C 81149Pa " +2020-11-20 16:18:48,2020-11-20 16:18:48,33.67233,-114.18133,24,43,2027.83," StrTrk 99 9 1.65V 21C 80515Pa " +2020-11-20 16:19:48,2020-11-20 16:19:48,33.67517,-114.17850,22,35,2091.84," StrTrk 100 9 1.64V 20C 79906Pa " +2020-11-20 16:20:47,2020-11-20 16:20:47,33.67817,-114.17600,20,31,2157.98," StrTrk 101 9 1.63V 20C 79268Pa " +2020-11-20 16:21:47,2020-11-20 16:22:25,33.68100,-114.17400,17,30,2232.96," StrTrk 102 9 1.64V 19C 78565Pa " +2020-11-20 16:22:48,2020-11-20 16:22:48,33.68350,-114.17217,22,37,2317.09," StrTrk 103 9 1.63V 19C 77788Pa " +2020-11-20 16:23:48,2020-11-20 16:23:48,33.68550,-114.16917,19,56,2407.92," StrTrk 104 9 1.63V 20C 76940Pa " +2020-11-20 16:24:47,2020-11-20 16:24:47,33.68733,-114.16667,15,45,2496.92," StrTrk 105 9 1.63V 19C 76169Pa " +2020-11-20 16:25:47,2020-11-20 16:25:47,33.68967,-114.16400,24,44,2573.12," StrTrk 106 9 1.63V 18C 75445Pa " +2020-11-20 16:26:48,2020-11-20 16:26:48,33.69217,-114.16117,19,42,2652.98," StrTrk 107 9 1.63V 18C 74733Pa " +2020-11-20 16:28:47,2020-11-20 16:28:47,33.69617,-114.15500,26,62,2827.93," StrTrk 109 9 1.63V 18C 73157Pa " +2020-11-20 16:29:47,2020-11-20 16:30:18,33.69817,-114.15117,22,51,2919.07," StrTrk 110 9 1.63V 17C 72377Pa " +2020-11-20 16:30:47,2020-11-20 16:30:47,33.70050,-114.14750,28,61,3001.98," StrTrk 111 9 1.62V 16C 71634Pa " +2020-11-20 16:31:47,2020-11-20 16:31:47,33.70233,-114.14350,24,61,3080.92," StrTrk 112 9 1.62V 16C 70979Pa " +2020-11-20 16:32:47,2020-11-20 16:32:47,33.70400,-114.13900,26,61,3165.04," StrTrk 113 9 1.62V 16C 70236Pa " +2020-11-20 16:33:47,2020-11-20 16:33:47,33.70617,-114.13533,24,52,3243.07," StrTrk 114 9 1.62V 16C 69587Pa " +2020-11-20 16:34:47,2020-11-20 16:34:47,33.70850,-114.13200,22,47,3318.97," StrTrk 115 9 1.62V 15C 68940Pa " +2020-11-20 16:35:47,2020-11-20 16:35:47,33.71083,-114.12867,22,58,3397.91," StrTrk 116 9 1.62V 15C 68267Pa " +2020-11-20 16:36:47,2020-11-20 16:36:47,33.71183,-114.12517,22,72,3493.92," StrTrk 117 9 1.62V 18C 67489Pa " +2020-11-20 16:37:49,2020-11-20 16:37:49,33.71317,-114.12117,20,69,3609.14," StrTrk 118 9 1.62V 17C 66548Pa " +2020-11-20 16:38:48,2020-11-20 16:38:48,33.71400,-114.11717,26,76,3712.16," StrTrk 119 9 1.62V 16C 65712Pa " +2020-11-20 16:39:48,2020-11-20 16:39:48,33.71467,-114.11333,19,73,3810.00," StrTrk 120 9 1.62V 17C 64927Pa " +2020-11-20 16:40:47,2020-11-20 16:40:47,33.71517,-114.10950,22,83,3919.12," StrTrk 121 9 1.62V 17C 64056Pa " +2020-11-20 16:41:47,2020-11-20 16:41:47,33.71550,-114.10567,22,74,4036.16," StrTrk 122 9 1.61V 16C 63169Pa " +2020-11-20 16:42:47,2020-11-20 16:42:47,33.71600,-114.10083,30,88,4137.05," StrTrk 123 9 1.60V 15C 62395Pa " +2020-11-20 16:43:48,2020-11-20 16:43:48,33.71583,-114.09583,28,96,4239.16," StrTrk 124 9 1.61V 15C 61585Pa " +2020-11-20 16:44:47,2020-11-20 16:44:47,33.71567,-114.09033,33,92,4340.05," StrTrk 125 9 1.60V 14C 60806Pa " +2020-11-20 16:45:47,2020-11-20 16:45:47,33.71617,-114.08500,28,77,4450.08," StrTrk 126 9 1.60V 13C 59988Pa " +2020-11-20 16:46:47,2020-11-20 16:46:47,33.71700,-114.08083,22,85,4559.20," StrTrk 127 9 1.60V 12C 59195Pa " +2020-11-20 16:47:48,2020-11-20 16:47:48,33.71717,-114.07600,31,92,4657.95," StrTrk 128 9 1.59V 12C 58448Pa " +2020-11-20 16:48:47,2020-11-20 16:48:47,33.71650,-114.06983,35,94,4760.06," StrTrk 129 9 1.60V 11C 57715Pa " +2020-11-20 16:49:47,2020-11-20 16:49:47,33.71633,-114.06383,31,92,4849.98," StrTrk 130 9 1.60V 09C 57058Pa " +2020-11-20 16:50:47,2020-11-20 16:50:47,33.71633,-114.05817,31,88,4942.94," StrTrk 131 9 1.60V 7C 56400Pa " +2020-11-20 16:51:47,2020-11-20 16:51:47,33.71683,-114.05217,33,81,5034.99," StrTrk 132 9 1.59V 6C 55748Pa " +2020-11-20 16:53:48,2020-11-20 16:53:48,33.71783,-114.03967,37,89,5254.14," StrTrk 134 9 1.59V 8C 54205Pa " +2020-11-20 16:54:47,2020-11-20 16:54:47,33.71817,-114.03300,41,91,5365.09," StrTrk 135 9 1.58V 7C 53448Pa " +2020-11-20 16:55:47,2020-11-20 16:55:47,33.71783,-114.02550,44,88,5481.22," StrTrk 136 9 1.59V 7C 52658Pa " +2020-11-20 16:56:47,2020-11-20 16:56:47,33.71833,-114.01750,46,84,5603.14," StrTrk 137 9 1.58V 6C 51850Pa " +2020-11-20 16:57:47,2020-11-20 16:57:47,33.71833,-114.00867,50,89,5723.23," StrTrk 138 9 1.58V 5C 51037Pa " +2020-11-20 16:58:47,2020-11-20 16:58:47,33.71883,-114.00000,46,90,5840.27," StrTrk 139 9 1.57V 3C 50288Pa " +2020-11-20 16:59:47,2020-11-20 16:59:47,33.71883,-113.99083,48,87,5965.24," StrTrk 140 9 1.57V 3C 49477Pa " +2020-11-20 17:00:47,2020-11-20 17:00:47,33.71900,-113.98150,54,85,6079.24," StrTrk 141 9 1.56V 2C 48725Pa " +2020-11-20 17:01:47,2020-11-20 17:01:47,33.71983,-113.97200,57,81,6194.15," StrTrk 142 9 1.57V 1C 48020Pa " +2020-11-20 17:02:47,2020-11-20 17:02:47,33.72067,-113.96133,61,79,6311.19," StrTrk 143 9 1.57V 1C 47277Pa " +2020-11-20 17:03:49,2020-11-20 17:03:49,33.72317,-113.95067,63,69,6418.17," StrTrk 144 9 1.56V 0C 46616Pa " +2020-11-20 17:04:47,2020-11-20 17:04:47,33.72550,-113.93933,61,79,6531.25," StrTrk 145 9 1.56V 0C 45933Pa " +2020-11-20 17:05:47,2020-11-20 17:05:47,33.72717,-113.92783,59,83,6648.30," StrTrk 146 9 1.56V 0C 45243Pa " +2020-11-20 17:06:47,2020-11-20 17:07:20,33.72850,-113.91767,56,81,6754.06," StrTrk 147 9 1.56V -1C 44585Pa " +2020-11-20 17:07:48,2020-11-20 17:07:48,33.72917,-113.90800,56,89,6870.19," StrTrk 148 9 1.56V -1C 43926Pa " +2020-11-20 17:08:47,2020-11-20 17:08:47,33.72867,-113.89817,54,94,6994.25," StrTrk 149 9 1.56V -2C 43200Pa " +2020-11-20 17:10:48,2020-11-20 17:10:48,33.72917,-113.87750,59,86,7260.34," StrTrk 151 9 1.55V -3C 41690Pa " +2020-11-20 17:11:47,2020-11-20 17:11:47,33.73017,-113.86600,69,81,7391.10," StrTrk 152 9 1.55V -4C 40952Pa " +2020-11-20 17:12:47,2020-11-20 17:12:47,33.73150,-113.85333,76,86,7521.24," StrTrk 153 9 1.54V -5C 40245Pa " +2020-11-20 17:13:47,2020-11-20 17:13:47,33.73250,-113.83900,78,84,7656.27," StrTrk 154 9 1.55V -6C 39520Pa " +2020-11-20 17:14:47,2020-11-20 17:14:47,33.73467,-113.82467,81,79,7782.15," StrTrk 155 9 1.54V -6C 38842Pa " +2020-11-20 17:15:47,2020-11-20 17:15:47,33.73700,-113.81000,81,77,7907.12," StrTrk 156 9 1.53V -6C 38190Pa " +2020-11-20 17:16:47,2020-11-20 17:16:47,33.73967,-113.79550,80,80,8026.30," StrTrk 157 9 1.54V -6C 37569Pa " +2020-11-20 17:17:47,2020-11-20 17:17:47,33.74100,-113.78050,85,87,8157.36," StrTrk 158 9 1.53V -7C 36887Pa " +2020-11-20 17:18:47,2020-11-20 17:18:47,33.74167,-113.76483,87,90,8283.24," StrTrk 159 9 1.54V -7C 36247Pa " +2020-11-20 17:19:47,2020-11-20 17:19:47,33.74217,-113.74900,87,85,8417.36," StrTrk 160 9 1.53V -7C 35571Pa " +2020-11-20 17:20:47,2020-11-20 17:20:47,33.74267,-113.73300,87,88,8558.17," StrTrk 161 9 1.53V -8C 34874Pa " +2020-11-20 17:21:47,2020-11-20 17:21:47,33.74300,-113.71700,89,87,8705.39," StrTrk 162 9 1.53V -09C 34182Pa " +2020-11-20 17:22:47,2020-11-20 17:22:47,33.74317,-113.70067,85,86,8852.31," StrTrk 163 9 1.53V -11C 33482Pa " +2020-11-20 17:24:47,2020-11-20 17:24:47,33.74367,-113.66783,93,86,9145.22," StrTrk 165 9 1.52V -12C 32123Pa " +2020-11-20 17:25:47,2020-11-20 17:25:47,33.74417,-113.65117,94,89,9295.18," StrTrk 166 9 1.52V -13C 31437Pa " +2020-11-20 17:26:47,2020-11-20 17:26:47,33.74467,-113.63483,91,88,9438.44," StrTrk 167 9 1.52V -14C 30801Pa " +2020-11-20 17:27:47,2020-11-20 17:27:47,33.74450,-113.61800,94,91,9594.19," StrTrk 168 9 1.52V -15C 30123Pa " +2020-11-20 17:28:47,2020-11-20 17:28:47,33.74400,-113.60100,91,90,9751.47," StrTrk 169 9 1.51V -16C 29455Pa " +2020-11-20 17:29:47,2020-11-20 17:29:47,33.74367,-113.58433,98,93,9908.44," StrTrk 170 9 1.51V -17C 28791Pa " +2020-11-20 17:30:47,2020-11-20 17:30:47,33.74217,-113.56650,106,96,10070.29," StrTrk 171 9 1.50V -18C 28112Pa " +2020-11-20 17:31:47,2020-11-20 17:31:47,33.74067,-113.54733,102,95,10240.37," StrTrk 172 9 1.50V -19C 27425Pa " +2020-11-20 17:32:47,2020-11-20 17:32:47,33.73950,-113.52817,113,93,10401.30," StrTrk 173 9 1.49V -21C 26788Pa " +2020-11-20 17:33:47,2020-11-20 17:33:47,33.73817,-113.50733,119,96,10563.45," StrTrk 174 9 1.49V -21C 26146Pa " +2020-11-20 17:34:47,2020-11-20 17:34:47,33.73550,-113.48550,124,99,10724.39," StrTrk 175 9 1.48V -22C 25531Pa " +2020-11-20 17:35:47,2020-11-20 17:35:47,33.73233,-113.46367,120,97,10879.23," StrTrk 176 9 1.48V -23C 24929Pa " +2020-11-20 17:36:47,2020-11-20 17:36:47,33.72967,-113.44200,119,99,11038.33," StrTrk 177 9 1.48V -24C 24351Pa " +2020-11-20 17:37:47,2020-11-20 17:37:47,33.72650,-113.41967,128,98,11195.30," StrTrk 178 9 1.48V -25C 23768Pa " +2020-11-20 17:38:47,2020-11-20 17:38:47,33.72267,-113.39683,130,104,11354.41," StrTrk 179 9 1.47V -26C 23212Pa " +2020-11-20 17:39:47,2020-11-20 17:39:47,33.71867,-113.37333,131,101,11516.26," StrTrk 180 9 1.46V -27C 22643Pa " +2020-11-20 17:40:47,2020-11-20 17:40:47,33.71483,-113.34800,144,99,11663.48," StrTrk 181 9 1.47V -27C 22101Pa " +2020-11-20 17:41:47,2020-11-20 17:41:47,33.71067,-113.32250,141,103,11829.29," StrTrk 182 9 1.45V -29C 21551Pa " +2020-11-20 17:42:47,2020-11-20 17:42:47,33.70567,-113.29800,131,102,11997.54," StrTrk 183 9 1.45V -29C 20996Pa " +2020-11-20 17:43:47,2020-11-20 17:43:47,33.70150,-113.27467,131,100,12165.48," StrTrk 184 9 1.46V -31C 20440Pa " +2020-11-20 17:44:47,2020-11-20 17:44:47,33.69817,-113.25150,130,99,12348.36," StrTrk 185 9 1.45V -31C 19858Pa " +2020-11-20 17:45:47,2020-11-20 17:45:47,33.69550,-113.22883,120,97,12525.45," StrTrk 186 9 1.44V -32C 19288Pa " +2020-11-20 17:46:47,2020-11-20 17:46:47,33.69383,-113.20717,117,99,12707.42," StrTrk 187 9 1.45V -33C 18750Pa " +2020-11-20 17:47:47,2020-11-20 17:47:47,33.69150,-113.18750,115,96,12883.59," StrTrk 188 9 1.44V -33C 18228Pa " +2020-11-20 17:48:47,2020-11-20 17:48:47,33.69000,-113.16733,115,90,13050.62," StrTrk 189 9 1.42V -34C 17728Pa " +2020-11-20 17:49:47,2020-11-20 17:49:47,33.69067,-113.14700,115,89,13204.55," StrTrk 190 9 1.42V -34C 17287Pa " +2020-11-20 17:50:47,2020-11-20 17:50:47,33.68950,-113.12517,124,93,13383.46," StrTrk 191 9 1.42V -34C 16798Pa " +2020-11-20 17:51:47,2020-11-20 17:51:47,33.68833,-113.10267,124,95,13556.59," StrTrk 192 9 1.42V -35C 16326Pa " +2020-11-20 17:52:47,2020-11-20 17:52:47,33.68733,-113.08267,111,91,13737.64," StrTrk 193 9 1.41V -35C 15861Pa " +2020-11-20 17:53:47,2020-11-20 17:53:47,33.68650,-113.06317,107,93,13914.42," StrTrk 194 9 1.42V -36C 15415Pa " +2020-11-20 17:54:47,2020-11-20 17:54:47,33.68617,-113.04650,83,85,14085.42," StrTrk 195 9 1.42V -34C 14967Pa " +2020-11-20 17:55:47,2020-11-20 17:55:47,33.68800,-113.03183,87,81,14233.55," StrTrk 196 9 1.41V -35C 14618Pa " +2020-11-20 17:56:47,2020-11-20 17:56:47,33.68983,-113.01667,93,81,14388.69," StrTrk 197 9 1.41V -35C 14231Pa " +2020-11-20 17:57:47,2020-11-20 17:57:47,33.69367,-113.00117,93,69,14539.57," StrTrk 198 9 1.40V -33C 13898Pa " +2020-11-20 17:58:47,2020-11-20 17:58:47,33.69950,-112.98517,96,61,14694.71," StrTrk 199 9 1.41V -33C 13537Pa " +2020-11-20 17:59:47,2020-11-20 17:59:47,33.70533,-112.96850,100,77,14864.49," StrTrk 200 9 1.39V -34C 13161Pa " +2020-11-20 18:00:47,2020-11-20 18:00:47,33.70817,-112.94983,106,79,15027.55," StrTrk 201 9 1.39V -35C 12806Pa " +2020-11-20 18:01:47,2020-11-20 18:01:47,33.71233,-112.93200,104,78,15209.52," StrTrk 202 9 1.39V -36C 12429Pa " +2020-11-20 18:02:47,2020-11-20 18:02:47,33.71500,-112.91400,96,84,15401.54," StrTrk 203 9 1.39V -37C 12012Pa " +2020-11-20 18:03:47,2020-11-20 18:03:47,33.71750,-112.89783,87,75,15584.73," StrTrk 204 9 1.40V -37C 11662Pa " +2020-11-20 18:04:47,2020-11-20 18:04:47,33.72067,-112.88150,96,80,15745.66," StrTrk 205 9 1.40V -38C 11341Pa " +2020-11-20 18:05:47,2020-11-20 18:05:47,33.72317,-112.86450,85,76,15918.48," StrTrk 206 9 1.40V -37C 11028Pa " +2020-11-20 18:06:47,2020-11-20 18:06:47,33.72567,-112.85050,87,76,16067.53," StrTrk 207 9 1.39V -37C 10738Pa " +2020-11-20 18:07:47,2020-11-20 18:07:47,33.72783,-112.83450,91,79,16239.74," StrTrk 208 9 1.38V -35C 10437Pa " +2020-11-20 18:08:47,2020-11-20 18:08:47,33.72817,-112.81700,89,93,16401.59," StrTrk 209 9 1.38V -37C 10137Pa " +2020-11-20 18:09:47,2020-11-20 18:09:47,33.72950,-112.80317,72,75,16565.58," StrTrk 210 9 1.38V -36C 9851Pa " +2020-11-20 18:10:47,2020-11-20 18:10:47,33.73317,-112.79083,70,65,16732.61," StrTrk 211 9 1.38V -34C 9581Pa " +2020-11-20 18:11:50,2020-11-20 18:11:50,33.73900,-112.77900,83,58,16903.60," StrTrk 212 9 1.37V -34C 9299Pa " +2020-11-20 18:12:47,2020-11-20 18:12:47,33.74283,-112.76567,80,77,17067.58," StrTrk 213 9 1.37V -36C 9031Pa " +2020-11-20 18:13:47,2020-11-20 18:13:47,33.74683,-112.74967,94,72,17234.61," StrTrk 214 9 1.37V -36C 8775Pa " +2020-11-20 18:14:47,2020-11-20 18:15:36,33.74850,-112.73333,83,84,17411.70," StrTrk 215 9 1.37V -37C 8502Pa " +2020-11-20 18:15:51,2020-11-20 18:15:51,33.74983,-112.71767,85,96,17589.70," StrTrk 216 9 1.38V -36C 8257Pa " +2020-11-20 18:16:47,2020-11-20 18:16:47,33.74767,-112.70500,67,105,17739.66," StrTrk 217 9 1.39V -38C 8025Pa " +2020-11-20 18:17:47,2020-11-20 18:17:47,33.74517,-112.69550,44,98,17891.76," StrTrk 218 9 1.39V -38C 7813Pa " +2020-11-20 18:18:47,2020-11-20 18:18:47,33.74500,-112.68850,35,74,18034.71," StrTrk 219 9 1.38V -36C 7620Pa " +2020-11-20 18:19:50,2020-11-20 18:19:50,33.74767,-112.68283,37,54,18182.84," StrTrk 220 9 1.38V -35C 7430Pa " +2020-11-20 18:20:47,2020-11-20 18:20:47,33.75117,-112.67533,59,65,18331.89," StrTrk 221 9 1.37V -34C 7235Pa " +2020-11-20 18:21:47,2020-11-20 18:21:47,33.75517,-112.66483,65,67,18474.84," StrTrk 222 9 1.37V -33C 7056Pa " +2020-11-20 18:22:47,2020-11-20 18:22:47,33.75833,-112.65350,65,75,18637.61," StrTrk 223 9 1.37V -33C 6858Pa " +2020-11-20 18:23:47,2020-11-20 18:23:47,33.76117,-112.64200,59,73,18779.64," StrTrk 224 9 1.37V -32C 6693Pa " +2020-11-20 18:24:50,2020-11-20 18:24:50,33.76117,-112.63200,52,94,18921.68," StrTrk 225 9 1.39V -34C 6518Pa " +2020-11-20 18:25:47,2020-11-20 18:25:47,33.76067,-112.62367,41,94,19078.65," StrTrk 226 9 1.39V -34C 6343Pa " +2020-11-20 18:26:47,2020-11-20 18:26:47,33.76033,-112.61383,61,98,19226.78," StrTrk 227 9 1.39V -32C 6196Pa " +2020-11-20 18:27:47,2020-11-20 18:27:47,33.75883,-112.60350,67,100,19382.84," StrTrk 228 9 1.38V -32C 6023Pa " +2020-11-20 18:28:47,2020-11-20 18:28:47,33.75683,-112.59233,63,107,19484.95," StrTrk 229 9 1.39V -33C 5917Pa " +2020-11-20 18:29:47,2020-11-20 18:29:47,33.75333,-112.58267,48,118,19593.76," StrTrk 230 9 1.40V -34C 5794Pa " +2020-11-20 18:30:47,2020-11-20 18:30:47,33.75067,-112.57600,33,112,19711.72," StrTrk 231 9 1.42V -33C 5680Pa " +2020-11-20 18:31:47,2020-11-20 18:31:47,33.74967,-112.57067,30,104,19823.89," StrTrk 232 9 1.42V -32C 5578Pa " +2020-11-20 18:32:47,2020-11-20 18:32:47,33.74733,-112.56517,39,120,19930.87," StrTrk 233 9 1.43V -31C 5480Pa " +2020-11-20 18:33:47,2020-11-20 18:33:47,33.74383,-112.55883,44,128,20037.86," StrTrk 234 9 1.43V -29C 5384Pa " +2020-11-20 18:34:47,2020-11-20 18:34:47,33.74000,-112.55317,31,127,20130.82," StrTrk 235 9 1.44V -28C 5300Pa " +2020-11-20 18:35:47,2020-11-20 18:35:47,33.73750,-112.54833,30,114,20215.86," StrTrk 236 9 1.44V -27C 5233Pa " +2020-11-20 18:36:47,2020-11-20 18:36:47,33.73600,-112.54300,33,113,20302.73," StrTrk 237 9 1.44V -27C 5159Pa " +2020-11-20 18:37:47,2020-11-20 18:37:47,33.73383,-112.53750,33,106,20401.79," StrTrk 238 9 1.45V -26C 5077Pa " +2020-11-20 18:38:47,2020-11-20 18:38:47,33.73250,-112.53133,37,112,20497.80," StrTrk 239 9 1.46V -26C 4993Pa " +2020-11-20 18:39:47,2020-11-20 18:39:47,33.73000,-112.52567,31,116,20583.75," StrTrk 240 9 1.45V -26C 4916Pa " +2020-11-20 18:40:47,2020-11-20 18:40:47,33.72817,-112.52100,26,111,20659.95," StrTrk 241 9 1.46V -25C 4865Pa " +2020-11-20 18:41:47,2020-11-20 18:41:47,33.72683,-112.51617,26,96,20740.73," StrTrk 242 9 1.47V -25C 4791Pa " +2020-11-20 18:42:47,2020-11-20 18:42:47,33.72633,-112.51167,22,103,20818.75," StrTrk 243 9 1.45V -24C 4730Pa " +2020-11-20 18:43:47,2020-11-20 18:43:47,33.72550,-112.50767,20,109,20898.00," StrTrk 244 9 1.46V -25C 4654Pa " +2020-11-20 18:44:47,2020-11-20 18:44:47,33.72400,-112.50417,24,121,20966.89," StrTrk 245 9 1.46V -24C 4618Pa " +2020-11-20 18:45:47,2020-11-20 18:45:47,33.72150,-112.50067,26,131,21046.74," StrTrk 246 9 1.47V -23C 4549Pa " +2020-11-20 18:46:47,2020-11-20 18:46:47,33.71800,-112.49700,31,142,21103.74," StrTrk 247 9 1.48V -22C 4523Pa " +2020-11-20 18:47:47,2020-11-20 18:47:47,33.71450,-112.49350,24,136,21179.94," StrTrk 248 9 1.48V -19C 4478Pa " +2020-11-20 18:48:47,2020-11-20 18:48:47,33.71183,-112.49100,20,140,21240.90," StrTrk 249 9 1.48V -19C 4431Pa " +2020-11-20 18:49:47,2020-11-20 18:49:47,33.70983,-112.48933,11,142,21298.81," StrTrk 250 9 1.47V -19C 4395Pa " +2020-11-20 18:50:47,2020-11-20 18:50:47,33.70883,-112.48800,7,124,21336.00," StrTrk 251 9 1.48V -18C 4366Pa " +2020-11-20 18:51:47,2020-11-20 18:51:47,33.70850,-112.48700,6,94,21372.88," StrTrk 252 9 1.47V -16C 4352Pa " +2020-11-20 18:52:47,2020-11-20 18:52:47,33.70850,-112.48583,6,103,21425.92," StrTrk 253 9 1.48V -18C 4307Pa " +2020-11-20 18:53:47,2020-11-20 18:53:47,33.70833,-112.48450,7,108,21439.02," StrTrk 254 9 1.48V -16C 4312Pa " +2020-11-20 18:54:47,2020-11-20 18:54:47,33.70767,-112.48283,9,119,21444.81," StrTrk 255 9 1.49V -16C 4298Pa " +2020-11-20 18:55:47,2020-11-20 18:55:47,33.70700,-112.48117,11,122,21457.92," StrTrk 256 9 1.49V -16C 4289Pa " +2020-11-20 18:56:47,2020-11-20 18:56:47,33.70583,-112.47917,13,131,21476.82," StrTrk 257 9 1.49V -15C 4281Pa " +2020-11-20 18:57:47,2020-11-20 18:57:47,33.70450,-112.47733,13,128,21485.96," StrTrk 258 9 1.50V -14C 4285Pa " +2020-11-20 18:58:47,2020-11-20 18:58:47,33.70317,-112.47567,13,141,21483.83," StrTrk 259 9 1.50V -14C 4290Pa " +2020-11-20 18:59:47,2020-11-20 18:59:47,33.70150,-112.47433,13,146,21466.76," StrTrk 260 9 1.50V -13C 4302Pa " +2020-11-20 19:00:47,2020-11-20 19:00:47,33.69967,-112.47300,15,150,21485.96," StrTrk 261 9 1.51V -12C 4299Pa " +2020-11-20 19:01:47,2020-11-20 19:01:47,33.69750,-112.47167,17,159,21524.98," StrTrk 262 9 1.52V -12C 4261Pa " +2020-11-20 19:02:47,2020-11-20 19:03:21,33.69517,-112.47033,15,155,21546.01," StrTrk 263 9 1.52V -8C 4280Pa " +2020-11-20 19:03:47,2020-11-20 19:03:47,33.69283,-112.46950,17,157,21548.75," StrTrk 264 9 1.52V -7C 4285Pa " +2020-11-20 19:04:47,2020-11-20 19:04:47,33.69017,-112.46833,20,165,21551.80," StrTrk 265 9 1.52V -09C 4276Pa " +2020-11-20 19:05:47,2020-11-20 19:05:47,33.68750,-112.46717,19,163,21569.78," StrTrk 266 9 1.52V -09C 4253Pa " +2020-11-20 19:06:47,2020-11-20 19:06:47,33.68483,-112.46617,17,157,21575.88," StrTrk 267 9 1.51V -09C 4256Pa " +2020-11-20 19:07:47,2020-11-20 19:07:47,33.68200,-112.46533,19,168,21561.86," StrTrk 268 9 1.51V -8C 4269Pa " +2020-11-20 19:08:47,2020-11-20 19:08:47,33.67950,-112.46450,17,169,21564.90," StrTrk 269 9 1.52V -6C 4278Pa " +2020-11-20 19:09:47,2020-11-20 19:09:47,33.67700,-112.46400,15,166,21582.89," StrTrk 270 9 1.52V -6C 4265Pa " +2020-11-20 19:10:47,2020-11-20 19:10:47,33.67450,-112.46350,13,170,21594.78," StrTrk 271 9 1.53V -7C 4251Pa " +2020-11-20 19:11:47,2020-11-20 19:11:47,33.67250,-112.46300,13,170,21592.95," StrTrk 272 9 1.53V -8C 4246Pa " +2020-11-20 19:12:47,2020-11-20 19:12:47,33.67050,-112.46233,13,164,21574.05," StrTrk 273 9 1.54V -10C 4248Pa " +2020-11-20 19:13:47,2020-11-20 19:13:47,33.66833,-112.46167,17,174,21608.80," StrTrk 274 9 1.53V -8C 4231Pa " +2020-11-20 19:14:47,2020-11-20 19:14:47,33.66650,-112.46100,11,155,21595.99," StrTrk 275 9 1.54V -10C 4231Pa " +2020-11-20 19:15:47,2020-11-20 19:15:47,33.66450,-112.46017,9,162,21599.96," StrTrk 276 9 1.54V -8C 4241Pa " +2020-11-20 19:16:47,2020-11-20 19:16:47,33.66300,-112.45967,9,159,21593.86," StrTrk 277 9 1.53V -6C 4258Pa " +2020-11-20 19:17:47,2020-11-20 19:17:47,33.66150,-112.45917,11,166,21632.88," StrTrk 278 9 1.53V -5C 4232Pa " +2020-11-20 19:18:47,2020-11-20 19:18:47,33.66033,-112.45867,6,176,21675.85," StrTrk 279 9 1.53V -6C 4205Pa " +2020-11-20 19:19:47,2020-11-20 19:19:47,33.65900,-112.45850,9,169,21678.90," StrTrk 280 9 1.54V -6C 4197Pa " +2020-11-20 19:20:47,2020-11-20 19:20:47,33.65750,-112.45833,7,167,21678.90," StrTrk 281 9 1.54V -5C 4203Pa " +2020-11-20 19:21:47,2020-11-20 19:21:47,33.65600,-112.45800,11,173,21635.92," StrTrk 282 9 1.54V -5C 4234Pa " +2020-11-20 19:22:47,2020-11-20 19:22:47,33.65450,-112.45783,7,169,21631.05," StrTrk 283 9 1.55V -6C 4241Pa " +2020-11-20 19:23:47,2020-11-20 19:23:47,33.65300,-112.45767,7,170,21636.84," StrTrk 284 9 1.54V -6C 4233Pa " +2020-11-20 19:24:47,2020-11-20 19:24:47,33.65150,-112.45750,7,167,21635.92," StrTrk 285 9 1.54V -5C 4244Pa " +2020-11-20 19:25:47,2020-11-20 19:25:47,33.65017,-112.45717,7,165,21631.05," StrTrk 286 9 1.55V -4C 4248Pa " +2020-11-20 19:26:47,2020-11-20 19:26:47,33.64867,-112.45683,9,170,21631.05," StrTrk 287 9 1.56V -4C 4245Pa " +2020-11-20 19:27:47,2020-11-20 19:27:47,33.64733,-112.45650,7,169,21635.01," StrTrk 288 9 1.56V -4C 4248Pa " +2020-11-20 19:28:47,2020-11-20 19:28:47,33.64600,-112.45617,9,170,21624.95," StrTrk 289 9 1.55V -2C 4260Pa " +2020-11-20 19:29:47,2020-11-20 19:29:47,33.64467,-112.45600,7,169,21626.78," StrTrk 290 9 1.55V 0C 4265Pa " +2020-11-20 19:30:47,2020-11-20 19:30:47,33.64333,-112.45583,7,176,21618.85," StrTrk 291 9 1.55V 1C 4283Pa " +2020-11-20 19:31:47,2020-11-20 19:31:47,33.64200,-112.45583,7,175,21625.86," StrTrk 292 9 1.55V 0C 4282Pa " +2020-11-20 19:32:47,2020-11-20 19:32:47,33.64083,-112.45550,7,169,21617.03," StrTrk 293 9 1.55V 0C 4275Pa " +2020-11-20 19:33:47,2020-11-20 19:33:47,33.63967,-112.45517,7,159,21622.82," StrTrk 294 9 1.55V 0C 4284Pa " +2020-11-20 19:34:47,2020-11-20 19:34:47,33.63867,-112.45450,7,145,21642.93," StrTrk 295 9 1.56V 1C 4277Pa " +2020-11-20 19:35:47,2020-11-20 19:35:47,33.63767,-112.45367,7,144,21635.92," StrTrk 296 9 1.56V 3C 4297Pa " +2020-11-20 19:36:47,2020-11-20 19:36:47,33.63667,-112.45283,11,146,21578.93," StrTrk 297 9 1.56V 3C 4337Pa " +2020-11-20 19:37:47,2020-11-20 19:37:47,33.63600,-112.45067,13,65,21410.98," StrTrk 298 9 1.55V -1C 4419Pa " +2020-11-20 19:38:47,2020-11-20 19:38:47,33.63567,-112.44900,15,147,21220.79," StrTrk 299 9 1.55V -6C 4523Pa " +2020-11-20 19:39:47,2020-11-20 19:39:47,33.63233,-112.44667,24,149,21034.86," StrTrk 300 9 1.55V -8C 4658Pa " +2020-11-20 19:40:47,2020-11-20 19:40:47,33.62983,-112.44383,19,119,20889.77," StrTrk 301 9 1.53V -11C 4756Pa " +2020-11-20 19:41:47,2020-11-20 19:41:47,33.62883,-112.44033,20,106,20837.96," StrTrk 302 9 1.53V -12C 4778Pa " +2020-11-20 19:42:47,2020-11-20 19:42:47,33.62783,-112.43650,22,105,20848.02," StrTrk 303 9 1.53V -11C 4770Pa " +2020-11-20 19:43:47,2020-11-20 19:43:47,33.62700,-112.43233,24,105,20805.95," StrTrk 304 9 1.54V -10C 4814Pa " +2020-11-20 19:44:47,2020-11-20 19:44:47,33.62600,-112.42783,26,104,20756.88," StrTrk 305 9 1.53V -10C 4869Pa " +2020-11-20 19:45:47,2020-11-20 19:45:47,33.62500,-112.42333,26,102,20752.92," StrTrk 306 9 1.54V -8C 4879Pa " +2020-11-20 19:46:47,2020-11-20 19:46:47,33.62417,-112.41867,26,103,20775.78," StrTrk 307 9 1.54V -7C 4869Pa " +2020-11-20 19:47:48,2020-11-20 19:47:48,33.62333,-112.41417,24,103,20765.72," StrTrk 308 9 1.54V -7C 4877Pa " +2020-11-20 19:48:47,2020-11-20 19:48:47,33.62233,-112.40967,26,105,20755.97," StrTrk 309 9 1.54V -5C 4900Pa " +2020-11-20 19:49:47,2020-11-20 19:49:47,33.62133,-112.40483,28,105,20721.83," StrTrk 310 9 1.53V -4C 4935Pa " +2020-11-20 19:50:47,2020-11-20 19:50:47,33.62017,-112.40033,24,110,20692.87," StrTrk 311 9 1.53V -3C 4953Pa " +2020-11-20 19:51:47,2020-11-20 19:51:47,33.61867,-112.39600,24,111,20696.83," StrTrk 312 9 1.53V -2C 4974Pa " +2020-11-20 19:52:47,2020-11-20 19:52:47,33.61733,-112.39183,24,110,20678.85," StrTrk 313 9 1.53V -2C 4972Pa " +2020-11-20 19:53:47,2020-11-20 19:53:47,33.61617,-112.38767,24,111,20669.71," StrTrk 314 9 1.53V -2C 4982Pa " +2020-11-20 19:54:47,2020-11-20 19:54:47,33.61483,-112.38350,24,110,20682.81," StrTrk 315 9 1.53V -3C 4964Pa " +2020-11-20 19:55:47,2020-11-20 19:55:47,33.61350,-112.37917,24,109,20686.78," StrTrk 316 9 1.53V -5C 4952Pa " +2020-11-20 19:56:47,2020-11-20 19:56:47,33.61250,-112.37500,24,106,20692.87," StrTrk 317 9 1.54V -6C 4933Pa " +2020-11-20 19:57:47,2020-11-20 19:57:47,33.61150,-112.37067,22,106,20669.71," StrTrk 318 9 1.54V -8C 4946Pa " +2020-11-20 19:58:47,2020-11-20 19:58:47,33.61050,-112.36700,20,108,20651.72," StrTrk 319 9 1.53V -10C 4943Pa " +2020-11-20 19:59:47,2020-11-20 19:59:47,33.60950,-112.36333,20,107,20654.77," StrTrk 320 9 1.54V -7C 4958Pa " +2020-11-20 20:00:47,2020-11-20 20:00:47,33.60850,-112.35983,20,109,20617.89," StrTrk 321 9 1.54V -10C 4978Pa " +2020-11-20 20:01:47,2020-11-20 20:01:47,33.60733,-112.35633,19,113,20598.99," StrTrk 322 9 1.54V -10C 4995Pa " +2020-11-20 20:02:47,2020-11-20 20:02:47,33.60617,-112.35317,19,113,20613.93," StrTrk 323 9 1.55V -11C 4979Pa " +2020-11-20 20:03:47,2020-11-20 20:03:47,33.60500,-112.35017,19,113,20615.76," StrTrk 324 9 1.55V -10C 4981Pa " +2020-11-20 20:04:47,2020-11-20 20:04:47,33.60400,-112.34717,17,112,20614.84," StrTrk 325 9 1.55V -10C 4978Pa " +2020-11-20 20:05:47,2020-11-20 20:05:47,33.60300,-112.34383,19,112,20592.90," StrTrk 326 9 1.54V -11C 5005Pa " +2020-11-20 20:06:47,2020-11-20 20:06:47,33.60167,-112.34050,20,116,20582.84," StrTrk 327 9 1.55V -11C 4995Pa " +2020-11-20 20:07:47,2020-11-20 20:07:47,33.60033,-112.33700,20,114,20583.75," StrTrk 328 9 1.54V -11C 4999Pa " +2020-11-20 20:08:47,2020-11-20 20:08:47,33.59917,-112.33350,20,114,20578.88," StrTrk 329 9 1.54V -11C 5005Pa " +2020-11-20 20:09:47,2020-11-20 20:09:47,33.59783,-112.33017,19,112,20570.95," StrTrk 330 9 1.55V -10C 5019Pa " +2020-11-20 20:10:47,2020-11-20 20:10:47,33.59683,-112.32667,19,110,20552.97," StrTrk 331 9 1.55V -11C 5021Pa " +2020-11-20 20:11:47,2020-11-20 20:11:47,33.59567,-112.32317,20,109,20558.76," StrTrk 332 9 1.54V -11C 5027Pa " +2020-11-20 20:12:47,2020-11-20 20:12:47,33.59467,-112.31983,19,106,20612.71," StrTrk 333 9 1.54V -09C 4984Pa " +2020-11-20 20:13:47,2020-11-20 20:13:47,33.59400,-112.31650,19,108,20617.89," StrTrk 334 9 1.54V -09C 4975Pa " +2020-11-20 20:14:47,2020-11-20 20:14:47,33.59300,-112.31283,20,109,20594.73," StrTrk 335 9 1.54V -8C 5010Pa " +2020-11-20 20:15:47,2020-11-20 20:15:47,33.59183,-112.30900,22,108,20593.81," StrTrk 336 9 1.53V -7C 5008Pa " +2020-11-20 20:16:47,2020-11-20 20:16:47,33.59067,-112.30500,24,110,20572.78," StrTrk 337 9 1.54V -09C 5024Pa " +2020-11-20 20:17:47,2020-11-20 20:17:47,33.58933,-112.30067,24,109,20602.96," StrTrk 338 9 1.54V -8C 5003Pa " +2020-11-20 20:18:47,2020-11-20 20:18:47,33.58817,-112.29667,24,111,20594.73," StrTrk 339 9 1.54V -10C 4998Pa " +2020-11-20 20:19:47,2020-11-20 20:19:47,33.58667,-112.29217,28,112,20581.92," StrTrk 340 9 1.53V -11C 4994Pa " +2020-11-20 20:20:47,2020-11-20 20:20:47,33.58500,-112.28750,28,114,20585.89," StrTrk 341 9 1.54V -11C 4997Pa " +2020-11-20 20:21:47,2020-11-20 20:21:47,33.58317,-112.28300,28,115,20591.98," StrTrk 342 9 1.53V -11C 4997Pa " +2020-11-20 20:22:47,2020-11-20 20:22:47,33.58133,-112.27850,26,116,20602.96," StrTrk 343 9 1.54V -10C 4984Pa " +2020-11-20 20:23:47,2020-11-20 20:23:47,33.57950,-112.27400,28,115,20603.87," StrTrk 344 9 1.53V -11C 4975Pa " +2020-11-20 20:24:47,2020-11-20 20:24:47,33.57767,-112.26950,28,115,20592.90," StrTrk 345 9 1.54V -11C 4985Pa " +2020-11-20 20:25:47,2020-11-20 20:25:47,33.57583,-112.26467,30,115,20578.88," StrTrk 346 9 1.53V -11C 4997Pa " +2020-11-20 20:26:47,2020-11-20 20:26:47,33.57383,-112.26000,28,117,20587.72," StrTrk 347 9 1.54V -10C 4989Pa " +2020-11-20 20:27:47,2020-11-20 20:27:47,33.57200,-112.25533,26,118,20603.87," StrTrk 348 9 1.55V -10C 4980Pa " +2020-11-20 20:28:47,2020-11-20 20:28:47,33.57000,-112.25100,26,117,20591.98," StrTrk 349 9 1.54V -10C 4996Pa " +2020-11-20 20:29:47,2020-11-20 20:29:47,33.56817,-112.24667,26,117,20574.91," StrTrk 350 9 1.55V -10C 5004Pa " +2020-11-20 20:31:47,2020-11-20 20:31:47,33.56433,-112.23850,22,112,20661.78," StrTrk 352 9 1.54V -10C 4928Pa " +2020-11-20 20:32:47,2020-11-20 20:32:47,33.56317,-112.23433,30,105,20760.84," StrTrk 353 9 1.54V -8C 4872Pa " +2020-11-20 20:33:47,2020-11-20 20:33:47,33.56233,-112.22950,28,104,20825.76," StrTrk 354 9 1.53V -8C 4805Pa " +2020-11-20 20:34:47,2020-11-20 20:34:47,33.56183,-112.22500,20,97,20900.75," StrTrk 355 9 1.53V -10C 4733Pa " +2020-11-20 20:35:47,2020-11-20 20:35:47,33.56067,-112.22117,24,116,20978.77," StrTrk 356 9 1.52V -10C 4674Pa " +2020-11-20 20:36:47,2020-11-20 20:36:47,33.55833,-112.21817,24,151,21074.79," StrTrk 357 9 1.52V -10C 4609Pa " +2020-11-20 20:37:47,2020-11-20 20:37:47,33.55550,-112.21667,17,151,21118.98," StrTrk 358 9 1.52V -09C 4581Pa " +2020-11-20 20:38:47,2020-11-20 20:38:47,33.55333,-112.21500,15,148,21165.01," StrTrk 359 9 1.52V -09C 4546Pa " +2020-11-20 20:39:47,2020-11-20 20:39:47,33.55167,-112.21317,13,126,21224.75," StrTrk 360 9 1.51V -8C 4497Pa " +2020-11-20 20:40:48,2020-11-20 20:40:48,33.55100,-112.21133,9,100,21271.99," StrTrk 361 9 1.52V -8C 4475Pa " +2020-11-20 20:41:47,2020-11-20 20:41:47,33.55117,-112.20933,13,77,21315.88," StrTrk 362 9 1.52V -10C 4417Pa " +2020-11-20 20:42:47,2020-11-20 20:42:47,33.55217,-112.20650,19,65,21346.97," StrTrk 363 9 1.52V -09C 4405Pa " +2020-11-20 20:43:47,2020-11-20 20:43:47,33.55350,-112.20333,20,62,21376.84," StrTrk 364 9 1.52V -8C 4385Pa " +2020-11-20 20:44:47,2020-11-20 20:44:47,33.55433,-112.20017,17,77,21418.91," StrTrk 365 9 1.51V -8C 4355Pa " +2020-11-20 20:45:47,2020-11-20 20:45:47,33.55433,-112.19717,17,93,21444.81," StrTrk 366 9 1.51V -09C 4335Pa " +2020-11-20 20:46:47,2020-11-20 20:46:47,33.55400,-112.19450,15,103,21462.80," StrTrk 367 9 1.52V -8C 4332Pa " +2020-11-20 20:47:47,2020-11-20 20:47:47,33.55350,-112.19167,17,103,21457.01," StrTrk 368 9 1.51V -8C 4338Pa " +2020-11-20 20:48:47,2020-11-20 20:48:47,33.55300,-112.18933,11,109,21483.83," StrTrk 369 9 1.51V -09C 4300Pa " +2020-11-20 20:49:47,2020-11-20 20:49:47,33.55250,-112.18717,9,94,21514.00," StrTrk 370 9 1.51V -10C 4282Pa " +2020-11-20 20:50:47,2020-11-20 20:50:47,33.55233,-112.18517,11,95,21537.78," StrTrk 371 9 1.51V -10C 4270Pa " +2020-11-20 20:51:47,2020-11-20 20:51:47,33.55217,-112.18317,11,95,21519.79," StrTrk 372 9 1.53V -10C 4280Pa " +2020-11-20 20:52:47,2020-11-20 20:52:47,33.55200,-112.18100,9,97,21521.01," StrTrk 373 9 1.51V -7C 4295Pa " +2020-11-20 20:53:47,2020-11-20 20:54:24,33.55183,-112.17900,11,96,21517.97," StrTrk 374 9 1.53V -6C 4303Pa " +2020-11-20 20:54:47,2020-11-20 20:54:47,33.55167,-112.17700,9,96,21521.93," StrTrk 375 9 1.53V -7C 4297Pa " +2020-11-20 20:55:47,2020-11-20 20:55:47,33.55150,-112.17533,9,97,21533.82," StrTrk 376 9 1.52V -8C 4272Pa " +2020-11-20 20:56:47,2020-11-20 20:56:47,33.55133,-112.17350,9,98,21528.02," StrTrk 377 9 1.53V -8C 4283Pa " +2020-11-20 20:57:47,2020-11-20 20:57:47,33.55117,-112.17167,9,94,21540.83," StrTrk 378 9 1.53V -8C 4274Pa " +2020-11-20 20:58:47,2020-11-20 20:59:18,33.55117,-112.16983,9,89,21522.84," StrTrk 379 9 1.53V -7C 4294Pa " +2020-11-20 21:00:47,2020-11-20 21:00:47,33.55100,-112.16633,7,95,21613.98," StrTrk 381 9 1.52V -1C 4261Pa " +2020-11-20 21:01:47,2020-11-20 21:01:47,33.55100,-112.16467,7,94,21604.83," StrTrk 382 9 1.53V -4C 4253Pa " +2020-11-20 21:02:47,2020-11-20 21:02:47,33.55100,-112.16333,7,90,21608.80," StrTrk 383 9 1.54V -4C 4248Pa " +2020-11-20 21:03:47,2020-11-20 21:03:47,33.55100,-112.16200,7,97,21608.80," StrTrk 384 9 1.53V -3C 4252Pa " +2020-11-20 21:04:47,2020-11-20 21:04:47,33.55117,-112.16083,6,85,21589.90," StrTrk 385 9 1.53V -2C 4276Pa " +2020-11-20 21:05:47,2020-11-20 21:05:47,33.55133,-112.15950,7,83,21594.78," StrTrk 386 9 1.54V -2C 4272Pa " +2020-11-20 21:06:47,2020-11-20 21:06:47,33.55150,-112.15800,7,86,21601.79," StrTrk 387 9 1.54V -2C 4271Pa " +2020-11-20 21:07:47,2020-11-20 21:07:47,33.55150,-112.15650,7,86,21618.85," StrTrk 388 9 1.55V -1C 4263Pa " +2020-11-20 21:08:48,2020-11-20 21:08:48,33.55167,-112.15483,7,83,21617.03," StrTrk 389 9 1.55V -1C 4266Pa " +2020-11-20 21:09:47,2020-11-20 21:09:47,33.55167,-112.15333,7,78,21607.88," StrTrk 390 9 1.55V -2C 4262Pa " +2020-11-20 21:10:47,2020-11-20 21:10:47,33.55200,-112.15200,7,74,21588.98," StrTrk 391 9 1.56V -1C 4281Pa " +2020-11-20 21:11:48,2020-11-20 21:11:48,33.55233,-112.15067,6,73,21586.85," StrTrk 392 9 1.55V -2C 4280Pa " +2020-11-20 21:12:47,2020-11-20 21:12:47,33.55267,-112.14950,7,80,21554.85," StrTrk 393 9 1.55V -2C 4306Pa " +2020-11-20 21:13:47,2020-11-20 21:13:47,33.55300,-112.14817,7,74,21557.89," StrTrk 394 9 1.55V -2C 4306Pa " +2020-11-20 21:14:47,2020-11-20 21:14:47,33.55333,-112.14683,7,76,21569.78," StrTrk 395 9 1.56V -2C 4297Pa " +2020-11-20 21:15:47,2020-11-20 21:15:47,33.55383,-112.14533,7,68,21580.75," StrTrk 396 9 1.55V -1C 4291Pa " +2020-11-20 21:16:47,2020-11-20 21:16:47,33.55417,-112.14400,7,76,21594.78," StrTrk 397 9 1.56V 0C 4301Pa " +2020-11-20 21:17:47,2020-11-20 21:17:47,33.55450,-112.14267,6,78,21587.76," StrTrk 398 9 1.56V 2C 4310Pa " +2020-11-20 21:18:47,2020-11-20 21:18:47,33.55467,-112.14150,6,87,21599.96," StrTrk 399 9 1.55V 4C 4314Pa " +2020-11-20 21:19:47,2020-11-20 21:19:47,33.55483,-112.14050,6,81,21587.76," StrTrk 400 9 1.54V 4C 4319Pa " +2020-11-20 21:20:47,2020-11-20 21:20:47,33.55500,-112.13933,6,76,21607.88," StrTrk 401 9 1.55V 4C 4303Pa " +2020-11-20 21:21:47,2020-11-20 21:21:47,33.55517,-112.13833,6,74,21628.00," StrTrk 402 9 1.55V 2C 4282Pa " +2020-11-20 21:22:47,2020-11-20 21:22:47,33.55550,-112.13700,7,73,21632.88," StrTrk 403 9 1.55V 1C 4268Pa " +2020-11-20 21:23:47,2020-11-20 21:23:47,33.55583,-112.13567,7,67,21614.89," StrTrk 404 9 1.55V 0C 4276Pa " +2020-11-20 21:24:47,2020-11-20 21:24:47,33.55633,-112.13417,9,68,21611.84," StrTrk 405 9 1.55V 0C 4268Pa " +2020-11-20 21:25:47,2020-11-20 21:25:47,33.55683,-112.13233,9,71,21617.03," StrTrk 406 9 1.56V 0C 4266Pa " +2020-11-20 21:26:47,2020-11-20 21:26:47,33.55733,-112.13067,9,70,21608.80," StrTrk 407 9 1.55V -1C 4265Pa " +2020-11-20 21:27:47,2020-11-20 21:27:47,33.55800,-112.12883,9,71,21628.00," StrTrk 408 9 1.56V -2C 4244Pa " +2020-11-20 21:28:47,2020-11-20 21:28:47,33.55850,-112.12700,9,68,21643.85," StrTrk 409 9 1.56V -1C 4240Pa " +2020-11-20 21:29:47,2020-11-20 21:29:47,33.55900,-112.12550,7,72,21635.92," StrTrk 410 9 1.56V -3C 4233Pa " +2020-11-20 21:30:47,2020-11-20 21:30:47,33.55950,-112.12417,7,67,21626.78," StrTrk 411 9 1.56V -2C 4245Pa " +2020-11-20 21:31:47,2020-11-20 21:31:47,33.55967,-112.12167,20,65,21437.80," StrTrk 412 9 1.55V -5C 4364Pa " +2020-11-20 21:32:47,2020-11-20 21:32:47,33.56033,-112.11867,11,100,21243.95," StrTrk 413 9 1.55V -7C 4493Pa " +2020-11-20 21:33:47,2020-11-20 21:33:47,33.55883,-112.11650,19,120,21084.84," StrTrk 414 9 1.56V -09C 4605Pa " +2020-11-20 21:34:47,2020-11-20 21:34:47,33.55783,-112.11267,22,103,20985.78," StrTrk 415 9 1.53V -10C 4665Pa " +2020-11-20 21:35:47,2020-11-20 21:35:47,33.55683,-112.10850,26,108,20939.76," StrTrk 416 9 1.54V -09C 4718Pa " +2020-11-20 21:36:47,2020-11-20 21:36:47,33.55550,-112.10400,26,108,20928.79," StrTrk 417 9 1.54V -5C 4754Pa " +2020-11-20 21:37:47,2020-11-20 21:37:47,33.55400,-112.09950,28,113,20879.71," StrTrk 418 9 1.53V -7C 4767Pa " +2020-11-20 21:38:47,2020-11-20 21:38:47,33.55217,-112.09467,30,114,20899.83," StrTrk 419 9 1.53V -7C 4761Pa " +2020-11-20 21:39:47,2020-11-20 21:39:47,33.55033,-112.08967,28,114,20876.97," StrTrk 420 9 1.53V -7C 4778Pa " +2020-11-20 21:40:47,2020-11-20 21:40:47,33.54867,-112.08550,24,116,20858.99," StrTrk 421 9 1.53V -10C 4769Pa " +2020-11-20 21:41:47,2020-11-20 21:42:29,33.54717,-112.08150,24,114,20838.87," StrTrk 422 9 1.53V -09C 4789Pa " +2020-11-20 21:42:47,2020-11-20 21:42:47,33.54550,-112.07767,22,116,20805.95," StrTrk 423 9 1.52V -8C 4828Pa " +2020-11-20 21:43:47,2020-11-20 21:43:47,33.54383,-112.07383,24,119,20794.98," StrTrk 424 9 1.53V -8C 4832Pa " +2020-11-20 21:44:47,2020-11-20 21:44:47,33.54200,-112.07000,24,121,20799.86," StrTrk 425 9 1.53V -8C 4835Pa " +2020-11-20 21:45:47,2020-11-20 21:45:47,33.54000,-112.06633,24,122,20813.88," StrTrk 426 9 1.53V -8C 4822Pa " +2020-11-20 21:46:47,2020-11-20 21:46:47,33.53817,-112.06250,24,119,20818.75," StrTrk 427 9 1.53V -09C 4811Pa " +2020-11-20 21:47:47,2020-11-20 21:47:47,33.53633,-112.05900,22,124,20799.86," StrTrk 428 9 1.54V -11C 4813Pa " +2020-11-20 21:48:47,2020-11-20 21:48:47,33.53433,-112.05567,22,123,20824.85," StrTrk 429 9 1.54V -11C 4788Pa " +2020-11-20 21:49:47,2020-11-20 21:49:47,33.53250,-112.05233,24,127,20814.79," StrTrk 430 9 1.53V -12C 4785Pa " +2020-11-20 21:50:47,2020-11-20 21:50:47,33.53050,-112.04900,22,128,20818.75," StrTrk 431 9 1.53V -10C 4802Pa " +2020-11-20 21:51:47,2020-11-20 21:51:47,33.52850,-112.04600,20,130,20829.73," StrTrk 432 9 1.53V -8C 4807Pa " +2020-11-20 21:52:47,2020-11-20 21:52:47,33.52650,-112.04300,19,122,20836.74," StrTrk 433 9 1.53V -8C 4798Pa " +2020-11-20 21:53:47,2020-11-20 21:53:47,33.52500,-112.03967,19,113,20824.85," StrTrk 434 9 1.54V -5C 4827Pa " +2020-11-20 21:54:47,2020-11-20 21:54:47,33.52350,-112.03633,19,120,20773.95," StrTrk 435 9 1.53V -6C 4873Pa " +2020-11-20 21:55:47,2020-11-20 21:55:47,33.52183,-112.03300,22,115,20799.86," StrTrk 436 9 1.53V -4C 4852Pa " +2020-11-20 21:56:47,2020-11-20 21:56:47,33.52050,-112.02950,19,116,20788.88," StrTrk 437 9 1.53V -3C 4872Pa " +2020-11-20 21:57:47,2020-11-20 21:57:47,33.51933,-112.02633,19,115,20790.71," StrTrk 438 9 1.52V -3C 4871Pa " +2020-11-20 21:58:47,2020-11-20 21:58:47,33.51800,-112.02317,19,116,20765.72," StrTrk 439 9 1.53V -1C 4903Pa " +2020-11-20 21:59:47,2020-11-20 21:59:47,33.51650,-112.02000,19,119,20762.98," StrTrk 440 9 1.52V 0C 4906Pa " +2020-11-20 22:00:47,2020-11-20 22:00:47,33.51483,-112.01700,19,123,20752.00," StrTrk 441 9 1.52V 0C 4929Pa " +2020-11-20 22:01:47,2020-11-20 22:01:47,33.51317,-112.01417,19,122,20762.98," StrTrk 442 9 1.51V 1C 4925Pa " +2020-11-20 22:02:47,2020-11-20 22:02:47,33.51167,-112.01100,20,120,20753.83," StrTrk 443 9 1.51V -1C 4920Pa " +2020-11-20 22:03:47,2020-11-20 22:03:47,33.51000,-112.00783,19,126,20724.88," StrTrk 444 9 1.51V -1C 4936Pa " +2020-11-20 22:04:47,2020-11-20 22:04:47,33.50817,-112.00517,19,128,20730.97," StrTrk 445 9 1.50V 0C 4946Pa " +2020-11-20 22:05:47,2020-11-20 22:05:47,33.50650,-112.00183,20,118,20753.83," StrTrk 446 9 1.51V 0C 4918Pa " +2020-11-20 22:06:47,2020-11-20 22:06:47,33.50517,-111.99850,20,114,20736.76," StrTrk 447 9 1.52V -4C 4918Pa " +2020-11-20 22:07:47,2020-11-20 22:07:47,33.50367,-111.99517,20,124,20673.97," StrTrk 448 9 1.51V -5C 4950Pa " +2020-11-20 22:08:47,2020-11-20 22:08:47,33.50167,-111.99217,20,125,20695.01," StrTrk 449 9 1.52V -5C 4928Pa " +2020-11-20 22:09:47,2020-11-20 22:09:47,33.50000,-111.98867,22,121,20725.79," StrTrk 450 9 1.53V -5C 4909Pa " +2020-11-20 22:10:47,2020-11-20 22:10:47,33.49817,-111.98550,20,125,20718.78," StrTrk 451 9 1.52V -8C 4891Pa " +2020-11-20 22:11:47,2020-11-20 22:11:47,33.49617,-111.98233,22,127,20706.89," StrTrk 452 9 1.53V -09C 4905Pa " +2020-11-20 22:12:47,2020-11-20 22:12:47,33.49400,-111.97933,20,132,20684.95," StrTrk 453 9 1.53V -09C 4917Pa " +2020-11-20 22:13:47,2020-11-20 22:13:47,33.49167,-111.97650,20,134,20707.81," StrTrk 454 9 1.53V -8C 4900Pa " +2020-11-20 22:14:47,2020-11-20 22:14:47,33.48950,-111.97350,20,131,20712.99," StrTrk 455 9 1.53V -7C 4904Pa " +2020-11-20 22:15:47,2020-11-20 22:15:47,33.48733,-111.97050,24,127,20649.90," StrTrk 456 9 1.53V -09C 4949Pa " +2020-11-20 22:16:47,2020-11-20 22:16:47,33.48500,-111.96700,24,127,20642.88," StrTrk 457 9 1.54V -8C 4957Pa " +2020-11-20 22:17:47,2020-11-20 22:17:47,33.48283,-111.96350,24,125,20638.92," StrTrk 458 9 1.53V -6C 4973Pa " +2020-11-20 22:18:47,2020-11-20 22:18:47,33.48067,-111.95983,24,126,20643.80," StrTrk 459 9 1.52V -6C 4977Pa " +2020-11-20 22:19:47,2020-11-20 22:19:47,33.47833,-111.95650,22,128,20660.87," StrTrk 460 9 1.52V -6C 4957Pa " +2020-11-20 22:20:47,2020-11-20 22:20:47,33.47617,-111.95300,24,124,20621.85," StrTrk 461 9 1.52V -5C 4995Pa " +2020-11-20 22:21:47,2020-11-20 22:21:47,33.47400,-111.94933,24,125,20625.82," StrTrk 462 9 1.53V -6C 4986Pa " +2020-11-20 22:22:47,2020-11-20 22:22:47,33.47200,-111.94567,24,124,20622.77," StrTrk 463 9 1.53V -6C 4993Pa " +2020-11-20 22:23:47,2020-11-20 22:23:47,33.46967,-111.94183,26,125,20606.00," StrTrk 464 9 1.53V -8C 4999Pa " +2020-11-20 22:24:47,2020-11-20 22:24:47,33.46733,-111.93800,24,128,20642.88," StrTrk 465 9 1.53V -5C 4983Pa " +2020-11-20 22:25:47,2020-11-20 22:25:47,33.46517,-111.93450,26,127,20647.76," StrTrk 466 9 1.53V -6C 4973Pa " +2020-11-20 22:26:47,2020-11-20 22:26:47,33.46267,-111.93050,28,125,20618.81," StrTrk 467 9 1.53V -6C 4993Pa " +2020-11-20 22:27:47,2020-11-20 22:27:47,33.46033,-111.92683,24,129,20659.95," StrTrk 468 9 1.53V -7C 4946Pa " +2020-11-20 22:28:47,2020-11-20 22:28:47,33.45800,-111.92350,24,126,20648.98," StrTrk 469 9 1.52V -7C 4959Pa " +2020-11-20 22:29:47,2020-11-20 22:29:47,33.45567,-111.91950,26,125,20626.73," StrTrk 470 9 1.52V -09C 4971Pa " +2020-11-20 22:30:47,2020-11-20 22:30:47,33.45333,-111.91550,28,124,20626.73," StrTrk 471 9 1.52V -8C 4975Pa " +2020-11-20 22:31:47,2020-11-20 22:31:47,33.45100,-111.91117,31,120,20660.87," StrTrk 472 9 1.52V -09C 4941Pa " +2020-11-20 22:32:47,2020-11-20 22:32:47,33.44900,-111.90750,24,120,20749.87," StrTrk 473 9 1.52V -10C 4854Pa " +2020-11-20 22:33:47,2020-11-20 22:33:47,33.44733,-111.90300,33,111,20812.96," StrTrk 474 9 1.52V -09C 4819Pa " +2020-11-20 22:34:47,2020-11-20 22:34:47,33.44567,-111.89817,26,106,20887.94," StrTrk 475 9 1.51V -09C 4744Pa " +2020-11-20 22:35:47,2020-11-20 22:35:47,33.44467,-111.89367,22,112,20971.76," StrTrk 476 9 1.51V -09C 4693Pa " +2020-11-20 22:36:47,2020-11-20 22:36:47,33.44300,-111.89067,15,135,21004.99," StrTrk 477 9 1.51V -11C 4648Pa " +2020-11-20 22:37:47,2020-11-20 22:37:47,33.44133,-111.88900,11,153,21052.84," StrTrk 478 9 1.50V -12C 4601Pa " +2020-11-20 22:38:47,2020-11-20 22:38:47,33.44017,-111.88717,13,123,21105.88," StrTrk 479 9 1.51V -11C 4560Pa " +2020-11-20 22:39:47,2020-11-20 22:39:47,33.43950,-111.88483,13,96,21151.90," StrTrk 480 9 1.51V -10C 4542Pa " +2020-11-20 22:40:47,2020-11-20 22:40:47,33.43950,-111.88250,11,89,21218.96," StrTrk 481 9 1.50V -09C 4500Pa " +2020-11-20 22:41:47,2020-11-20 22:41:47,33.43983,-111.87983,19,78,21297.90," StrTrk 482 9 1.50V -09C 4444Pa " +2020-11-20 22:42:47,2020-11-20 22:42:47,33.44050,-111.87583,22,76,21328.99," StrTrk 483 9 1.51V -7C 4425Pa " +2020-11-20 22:43:47,2020-11-20 22:43:47,33.44150,-111.87167,24,70,21358.86," StrTrk 484 9 1.51V -8C 4398Pa " +2020-11-20 22:44:47,2020-11-20 22:44:47,33.44300,-111.86717,26,68,21389.95," StrTrk 485 9 1.51V -09C 4372Pa " +2020-11-20 22:45:47,2020-11-20 22:45:47,33.44433,-111.86250,26,71,21453.04," StrTrk 486 9 1.50V -7C 4334Pa " +2020-11-20 22:46:47,2020-11-20 22:46:47,33.44500,-111.85817,20,85,21489.92," StrTrk 487 9 1.51V -09C 4302Pa " +2020-11-20 22:47:47,2020-11-20 22:47:47,33.44533,-111.85417,22,88,21515.83," StrTrk 488 9 1.51V -8C 4294Pa " +2020-11-20 22:48:47,2020-11-20 22:48:47,33.44550,-111.85033,19,88,21516.75," StrTrk 489 9 1.50V -09C 4270Pa " +2020-11-20 22:49:47,2020-11-20 22:49:47,33.44567,-111.84683,19,86,21482.00," StrTrk 490 9 1.51V -8C 4316Pa " +2020-11-20 22:50:47,2020-11-20 22:50:47,33.44583,-111.84333,17,87,21514.92," StrTrk 491 9 1.50V -7C 4293Pa " +2020-11-20 22:51:47,2020-11-20 22:51:47,33.44617,-111.84017,17,82,21542.04," StrTrk 492 9 1.51V -8C 4270Pa " +2020-11-20 22:52:47,2020-11-20 22:52:47,33.44650,-111.83700,17,86,21544.79," StrTrk 493 9 1.52V -8C 4267Pa " +2020-11-20 22:53:47,2020-11-20 22:53:47,33.44683,-111.83383,19,80,21548.75," StrTrk 494 9 1.51V -6C 4276Pa " +2020-11-20 22:54:47,2020-11-20 22:54:47,33.44700,-111.83050,19,90,21521.01," StrTrk 495 9 1.51V -7C 4288Pa " +2020-11-20 22:55:47,2020-11-20 22:55:47,33.44700,-111.82717,17,81,21579.84," StrTrk 496 9 1.52V -7C 4248Pa " +2020-11-20 22:56:47,2020-11-20 22:56:47,33.44733,-111.82383,19,87,21588.98," StrTrk 497 9 1.53V -7C 4239Pa " +2020-11-20 22:57:47,2020-11-20 22:57:47,33.44733,-111.82033,19,94,21593.86," StrTrk 498 9 1.51V -5C 4256Pa " +2020-11-20 22:58:47,2020-11-20 22:58:47,33.44717,-111.81683,19,93,21628.00," StrTrk 499 9 1.52V -4C 4237Pa " +2020-11-20 22:59:47,2020-11-20 22:59:47,33.44717,-111.81333,19,91,21569.78," StrTrk 500 9 1.51V -5C 4269Pa " +2020-11-20 23:00:47,2020-11-20 23:00:47,33.44717,-111.80967,19,92,21561.86," StrTrk 501 9 1.52V -3C 4285Pa " +2020-11-20 23:01:47,2020-11-20 23:01:47,33.44717,-111.80633,19,89,21567.95," StrTrk 502 9 1.52V -1C 4295Pa " +2020-11-20 23:03:47,2020-11-20 23:03:47,33.44733,-111.79983,17,86,21595.99," StrTrk 504 9 1.51V 0C 4282Pa " +2020-11-20 23:04:47,2020-11-20 23:04:47,33.44733,-111.79667,17,91,21563.99," StrTrk 505 9 1.50V 0C 4309Pa " +2020-11-20 23:05:47,2020-11-20 23:05:47,33.44733,-111.79333,19,91,21556.98," StrTrk 506 9 1.51V 0C 4326Pa " +2020-11-20 23:06:47,2020-11-20 23:06:47,33.44717,-111.78983,19,94,21547.84," StrTrk 507 9 1.50V 0C 4308Pa " +2020-11-20 23:07:47,2020-11-20 23:07:47,33.44717,-111.78650,19,82,21585.94," StrTrk 508 9 1.51V 0C 4296Pa " +2020-11-20 23:08:47,2020-11-20 23:08:47,33.44733,-111.78300,20,91,21578.93," StrTrk 509 9 1.51V -3C 4282Pa " +2020-11-20 23:09:47,2020-11-20 23:09:47,33.44733,-111.77933,19,86,21612.76," StrTrk 510 9 1.51V -4C 4252Pa " +2020-11-20 23:10:47,2020-11-20 23:10:47,33.44767,-111.77600,20,82,21646.90," StrTrk 511 9 1.52V -5C 4212Pa " +2020-11-20 23:11:47,2020-11-20 23:11:47,33.44783,-111.77233,19,85,21608.80," StrTrk 512 9 1.51V -7C 4225Pa " +2020-11-20 23:12:47,2020-11-20 23:12:47,33.44783,-111.76867,20,90,21606.05," StrTrk 513 9 1.52V -4C 4244Pa " +2020-11-20 23:13:47,2020-11-20 23:13:47,33.44783,-111.76500,20,94,21596.91," StrTrk 514 9 1.52V -3C 4271Pa " +2020-11-20 23:14:47,2020-11-20 23:14:47,33.44750,-111.76117,20,93,21595.99," StrTrk 515 9 1.52V -2C 4272Pa " +2020-11-20 23:15:47,2020-11-20 23:15:47,33.44733,-111.75733,20,91,21579.84," StrTrk 516 9 1.51V -1C 4288Pa " +2020-11-20 23:16:47,2020-11-20 23:16:47,33.44733,-111.75350,20,90,21526.80," StrTrk 517 9 1.51V 0C 4331Pa " +2020-11-20 23:17:47,2020-11-20 23:17:47,33.44733,-111.74950,22,91,21499.98," StrTrk 518 9 1.51V 1C 4364Pa " +2020-11-20 23:18:47,2020-11-20 23:18:47,33.44733,-111.74533,22,90,21491.75," StrTrk 519 9 1.51V 1C 4369Pa " +2020-11-20 23:19:47,2020-11-20 23:20:19,33.44733,-111.74083,24,88,21496.02," StrTrk 520 9 1.51V 0C 4366Pa " +2020-11-20 23:20:47,2020-11-20 23:20:47,33.44733,-111.73617,26,88,21478.04," StrTrk 521 9 1.50V 0C 4380Pa " +2020-11-20 23:21:47,2020-11-20 23:21:47,33.44750,-111.73150,26,84,21441.77," StrTrk 522 9 1.50V 0C 4397Pa " +2020-11-20 23:22:47,2020-11-20 23:22:47,33.44800,-111.72667,26,83,21446.03," StrTrk 523 9 1.51V -1C 4383Pa " +2020-11-20 23:23:47,2020-11-20 23:23:47,33.44850,-111.72183,26,81,21451.82," StrTrk 524 9 1.50V -2C 4381Pa " +2020-11-20 23:24:47,2020-11-20 23:24:47,33.44917,-111.71700,26,78,21448.78," StrTrk 525 9 1.51V -2C 4371Pa " +2020-11-20 23:25:47,2020-11-20 23:25:47,33.44983,-111.71217,26,77,21437.80," StrTrk 526 9 1.51V -3C 4381Pa " +2020-11-20 23:26:47,2020-11-20 23:26:47,33.45067,-111.70750,26,79,21429.88," StrTrk 527 9 1.51V -2C 4388Pa " +2020-11-20 23:27:47,2020-11-20 23:27:47,33.45133,-111.70283,26,78,21425.00," StrTrk 528 9 1.51V -5C 4368Pa " +2020-11-20 23:28:47,2020-11-20 23:28:47,33.45200,-111.69800,26,80,21459.75," StrTrk 529 9 1.52V -6C 4342Pa " +2020-11-20 23:29:47,2020-11-20 23:29:47,33.45250,-111.69367,22,85,21476.82," StrTrk 530 9 1.52V -5C 4340Pa " +2020-11-20 23:30:47,2020-11-20 23:30:47,33.45300,-111.68917,26,77,21407.02," StrTrk 531 9 1.51V -6C 4393Pa " +2020-11-20 23:31:47,2020-11-20 23:31:47,33.45367,-111.68500,17,85,21245.78," StrTrk 532 9 1.51V -8C 4501Pa " +2020-11-20 23:32:47,2020-11-20 23:32:47,33.45283,-111.68283,15,140,21069.91," StrTrk 533 9 1.52V -11C 4597Pa " +2020-11-20 23:33:47,2020-11-20 23:33:47,33.45100,-111.67967,33,103,20887.94," StrTrk 534 9 1.51V -14C 4722Pa " +2020-11-20 23:34:47,2020-11-20 23:34:47,33.44950,-111.67383,31,112,20735.85," StrTrk 535 9 1.50V -15C 4846Pa " +2020-11-20 23:35:47,2020-11-20 23:35:47,33.44733,-111.66867,33,115,20614.84," StrTrk 536 9 1.50V -17C 4938Pa " +2020-11-20 23:36:47,2020-11-20 23:36:47,33.44517,-111.66317,33,116,20587.72," StrTrk 537 9 1.50V -15C 4968Pa " +2020-11-20 23:37:47,2020-11-20 23:37:47,33.44300,-111.65767,33,113,20606.00," StrTrk 538 9 1.49V -14C 4960Pa " +2020-11-20 23:38:47,2020-11-20 23:38:47,33.44083,-111.65217,31,117,20556.93," StrTrk 539 9 1.49V -12C 5011Pa " +2020-11-20 23:39:47,2020-11-20 23:39:47,33.43867,-111.64700,31,116,20524.93," StrTrk 540 9 1.49V -12C 5044Pa " +2020-11-20 23:40:47,2020-11-20 23:40:47,33.43683,-111.64167,31,109,20499.93," StrTrk 541 9 1.50V -12C 5065Pa " +2020-11-20 23:41:47,2020-11-20 23:41:47,33.43550,-111.63617,30,106,20469.76," StrTrk 542 9 1.48V -11C 5100Pa " +2020-11-20 23:42:47,2020-11-20 23:42:47,33.43400,-111.63083,31,107,20462.75," StrTrk 543 9 1.48V -09C 5114Pa " +2020-11-20 23:43:47,2020-11-20 23:43:47,33.43250,-111.62517,31,106,20443.85," StrTrk 544 9 1.48V -13C 5098Pa " +2020-11-20 23:44:47,2020-11-20 23:44:47,33.43150,-111.61983,30,103,20429.83," StrTrk 545 9 1.49V -14C 5119Pa " +2020-11-20 23:45:47,2020-11-20 23:45:47,33.43033,-111.61450,30,104,20425.87," StrTrk 546 9 1.48V -14C 5117Pa " +2020-11-20 23:46:47,2020-11-20 23:46:47,33.42950,-111.60900,31,98,20378.93," StrTrk 547 9 1.49V -14C 5155Pa " +2020-11-20 23:47:47,2020-11-20 23:47:47,33.42900,-111.60317,31,96,20381.98," StrTrk 548 9 1.49V -14C 5153Pa " +2020-11-20 23:48:47,2020-11-20 23:48:47,33.42850,-111.59750,31,94,20366.74," StrTrk 549 9 1.49V -15C 5160Pa " +2020-11-20 23:49:47,2020-11-20 23:49:47,33.42817,-111.59167,33,95,20368.87," StrTrk 550 9 1.49V -16C 5150Pa " +2020-11-20 23:50:47,2020-11-20 23:50:47,33.42767,-111.58583,30,95,20344.79," StrTrk 551 9 1.49V -19C 5157Pa " +2020-11-20 23:51:47,2020-11-20 23:51:47,33.42733,-111.58033,30,95,20346.92," StrTrk 552 9 1.50V -22C 5135Pa " +2020-11-20 23:52:47,2020-11-20 23:52:47,33.42683,-111.57500,28,98,20331.99," StrTrk 553 9 1.49V -22C 5151Pa " +2020-11-20 23:53:47,2020-11-20 23:53:47,33.42600,-111.57000,28,103,20313.70," StrTrk 554 9 1.50V -22C 5163Pa " +2020-11-20 23:54:47,2020-11-20 23:54:47,33.42500,-111.56500,28,105,20291.76," StrTrk 555 9 1.50V -22C 5184Pa " +2020-11-20 23:55:47,2020-11-20 23:55:47,33.42383,-111.56017,28,106,20263.71," StrTrk 556 9 1.49V -21C 5221Pa " +2020-11-20 23:56:47,2020-11-20 23:57:19,33.42250,-111.55533,26,110,20210.98," StrTrk 557 9 1.49V -23C 5250Pa " +2020-11-20 23:57:47,2020-11-20 23:57:47,33.42100,-111.55083,26,110,20218.91," StrTrk 558 9 1.50V -20C 5263Pa " +2020-11-20 23:58:47,2020-11-20 23:58:47,33.41950,-111.54633,28,111,20186.90," StrTrk 559 9 1.49V -19C 5302Pa " +2020-11-20 23:59:47,2020-11-20 23:59:47,33.41800,-111.54117,31,107,20132.95," StrTrk 560 9 1.50V -20C 5341Pa " +2020-11-21 00:00:47,2020-11-21 00:00:47,33.41633,-111.53533,33,108,20122.90," StrTrk 561 9 1.49V -20C 5347Pa " +2020-11-21 00:01:47,2020-11-21 00:01:47,33.41517,-111.53000,26,104,20194.83," StrTrk 562 9 1.48V -21C 5280Pa " +2020-11-21 00:02:47,2020-11-21 00:02:47,33.41417,-111.52483,30,97,20257.92," StrTrk 563 9 1.49V -20C 5234Pa " +2020-11-21 00:03:47,2020-11-21 00:03:47,33.41383,-111.51900,33,95,20295.72," StrTrk 564 9 1.48V -19C 5194Pa " +2020-11-21 00:04:47,2020-11-21 00:05:20,33.41283,-111.51300,35,104,20321.93," StrTrk 565 9 1.48V -20C 5165Pa " +2020-11-21 00:05:47,2020-11-21 00:05:47,33.41133,-111.50767,30,116,20384.72," StrTrk 566 9 1.47V -20C 5122Pa " +2020-11-21 00:06:47,2020-11-21 00:07:18,33.40933,-111.50267,30,120,20450.86," StrTrk 567 9 1.47V -21C 5053Pa " +2020-11-21 00:07:47,2020-11-21 00:07:47,33.40700,-111.49800,30,124,20463.97," StrTrk 568 9 1.47V -20C 5037Pa " +2020-11-21 00:08:47,2020-11-21 00:08:47,33.40450,-111.49383,28,126,20474.94," StrTrk 569 9 1.46V -20C 5039Pa " +2020-11-21 00:09:47,2020-11-21 00:09:47,33.40200,-111.49017,22,126,20476.77," StrTrk 570 9 1.46V -20C 5025Pa " +2020-11-21 00:10:47,2020-11-21 00:10:47,33.39983,-111.48650,26,128,20458.79," StrTrk 571 9 1.47V -21C 5044Pa " +2020-11-21 00:11:47,2020-11-21 00:11:47,33.39733,-111.48317,22,130,20482.86," StrTrk 572 9 1.47V -20C 5035Pa " +2020-11-21 00:12:47,2020-11-21 00:12:47,33.39500,-111.47983,22,132,20480.73," StrTrk 573 9 1.46V -19C 5045Pa " +2020-11-21 00:13:47,2020-11-21 00:13:47,33.39250,-111.47650,24,129,20465.80," StrTrk 574 9 1.46V -21C 5046Pa " +2020-11-21 00:14:47,2020-11-21 00:14:47,33.39017,-111.47300,24,128,20483.78," StrTrk 575 9 1.47V -21C 5028Pa " +2020-11-21 00:15:47,2020-11-21 00:15:47,33.38783,-111.46933,28,126,20438.97," StrTrk 576 9 1.47V -23C 5052Pa " +2020-11-21 00:16:47,2020-11-21 00:16:47,33.38567,-111.46500,30,118,20381.98," StrTrk 577 9 1.47V -23C 5098Pa " +2020-11-21 00:17:47,2020-11-21 00:17:47,33.38367,-111.46017,28,116,20349.97," StrTrk 578 9 1.46V -25C 5113Pa " +2020-11-21 00:18:47,2020-11-21 00:18:47,33.38167,-111.45583,26,114,20283.83," StrTrk 579 9 1.46V -26C 5172Pa " +2020-11-21 00:19:47,2020-11-21 00:19:47,33.38017,-111.45067,30,105,20258.84," StrTrk 580 9 1.45V -27C 5188Pa " +2020-11-21 00:20:47,2020-11-21 00:20:47,33.37933,-111.44517,31,95,20244.82," StrTrk 581 9 1.45V -27C 5203Pa " +2020-11-21 00:21:47,2020-11-21 00:21:47,33.37900,-111.43933,30,96,20182.94," StrTrk 582 9 1.45V -29C 5250Pa " +2020-11-21 00:22:47,2020-11-21 00:23:28,33.37800,-111.43450,26,107,20082.97," StrTrk 583 9 1.44V -31C 5329Pa " +2020-11-21 00:23:47,2020-11-21 00:23:47,33.37667,-111.42933,33,105,19983.91," StrTrk 584 9 1.44V -31C 5423Pa " +2020-11-21 00:24:47,2020-11-21 00:24:47,33.37600,-111.42300,37,90,19882.71," StrTrk 585 9 1.44V -32C 5517Pa " +2020-11-21 00:25:47,2020-11-21 00:25:47,33.37700,-111.41567,44,70,19780.91," StrTrk 586 9 1.42V -33C 5605Pa " +2020-11-21 00:26:47,2020-11-21 00:26:47,33.37883,-111.40883,37,77,19708.67," StrTrk 587 9 1.42V -34C 5668Pa " +2020-11-21 00:27:47,2020-11-21 00:27:47,33.37883,-111.40267,31,103,19601.69," StrTrk 588 9 1.41V -36C 5763Pa " +2020-11-21 00:28:48,2020-11-21 00:28:48,33.37700,-111.39750,31,111,19478.85," StrTrk 589 9 1.40V -38C 5901Pa " +2020-11-21 00:29:47,2020-11-21 00:29:47,33.37550,-111.39250,24,107,19338.65," StrTrk 590 9 1.40V -39C 6047Pa " +2020-11-21 00:30:47,2020-11-21 00:30:47,33.37450,-111.38850,31,101,19180.76," StrTrk 591 9 1.40V -40C 6226Pa " +2020-11-21 00:31:47,2020-11-21 00:31:47,33.37383,-111.38167,52,103,18941.80," StrTrk 592 9 1.39V -43C 6456Pa " +2020-11-21 00:32:50,2020-11-21 00:32:50,33.37083,-111.37083,76,102,18739.71," StrTrk 593 9 1.37V -45C 6739Pa " +2020-11-21 00:33:47,2020-11-21 00:33:47,33.36917,-111.35783,81,93,18467.83," StrTrk 594 9 1.35V -47C 7029Pa " +2020-11-21 00:34:47,2020-11-21 00:34:47,33.37083,-111.34600,56,77,18273.67," StrTrk 595 9 1.35V -48C 7341Pa " +2020-11-21 00:35:47,2020-11-21 00:35:47,33.37150,-111.33467,59,96,18042.64," StrTrk 596 9 1.33V -49C 7667Pa " +2020-11-21 00:36:47,2020-11-21 00:36:47,33.36933,-111.32217,74,96,17777.76," StrTrk 597 9 1.33V -50C 8041Pa " +2020-11-21 00:37:47,2020-11-21 00:38:23,33.36817,-111.30667,98,92,17383.66," StrTrk 598 9 1.32V -51C 8679Pa " +2020-11-21 00:38:50,2020-11-21 00:38:50,33.36800,-111.28917,98,96,16957.55," StrTrk 599 8 1.31V -51C 9416Pa " +2020-11-21 00:39:47,2020-11-21 00:39:47,33.36933,-111.27183,96,87,16520.77," StrTrk 600 9 1.30V -52C 10398Pa " +2020-11-21 00:40:47,2020-11-21 00:40:47,33.37083,-111.25433,106,86,16104.72," StrTrk 601 9 1.29V -52C 11060Pa " +2020-11-21 00:41:47,2020-11-21 00:41:47,33.37317,-111.23683,111,80,15731.64," StrTrk 602 9 1.27V -52C 11839Pa " +2020-11-21 00:42:47,2020-11-21 00:42:47,33.37450,-111.21733,117,81,15327.48," StrTrk 603 9 1.26V -52C 12297Pa " +2020-11-21 00:44:47,2020-11-21 00:44:47,33.37500,-111.18067,98,92,14646.55," StrTrk 605 9 1.25V -51C 10890Pa " +2020-11-21 00:45:47,2020-11-21 00:45:47,33.37400,-111.16300,96,83,14319.50," StrTrk 606 9 1.26V -51C 9127Pa " +2020-11-21 00:46:47,2020-11-21 00:46:47,33.37400,-111.14483,100,96,13954.66," StrTrk 607 9 1.24V -51C 5992Pa " +2020-11-21 00:48:47,2020-11-21 00:48:47,33.36867,-111.10283,120,99,13305.43," StrTrk 609 9 1.24V -51C 0999Pa " +2020-11-21 00:49:47,2020-11-21 00:49:47,33.36300,-111.08067,137,112,12976.56," StrTrk 610 9 1.25V -51C 0999Pa " +2020-11-21 00:50:47,2020-11-21 00:50:47,33.35483,-111.05433,156,109,12677.55," StrTrk 611 9 1.25V -50C 0999Pa " +2020-11-21 00:51:47,2020-11-21 00:51:47,33.34617,-111.02700,167,111,12399.57," StrTrk 612 9 1.23V -50C 0999Pa " +2020-11-21 00:53:47,2020-11-21 00:53:47,33.33167,-110.97650,130,102,11817.40," StrTrk 614 9 1.25V -49C 0999Pa " +2020-11-21 00:54:47,2020-11-21 00:54:47,33.32633,-110.95300,141,103,11532.41," StrTrk 615 9 1.25V -48C 3306Pa " +2020-11-21 00:56:47,2020-11-21 00:56:47,33.31717,-110.90583,135,104,10997.49," StrTrk 617 9 1.26V -45C 25321Pa " +2020-11-21 00:57:47,2020-11-21 00:57:47,33.31250,-110.88233,131,107,10717.38," StrTrk 618 9 1.27V -44C 36558Pa " +2020-11-21 00:58:47,2020-11-21 00:58:47,33.30783,-110.85983,120,103,10456.47," StrTrk 619 9 1.29V -43C 43325Pa " +2020-11-21 00:59:47,2020-11-21 00:59:47,33.30417,-110.83900,113,99,10184.28," StrTrk 620 9 1.30V -41C 45207Pa " +2020-11-21 01:00:47,2020-11-21 01:00:47,33.30183,-110.82000,104,97,9910.27," StrTrk 621 9 1.31V -40C 36931Pa " +2020-11-21 01:01:50,2020-11-21 01:01:50,33.29917,-110.80283,102,100,9645.40," StrTrk 622 9 1.32V -39C 31099Pa " +2020-11-21 01:02:47,2020-11-21 01:02:47,33.29600,-110.78667,89,97,9391.19," StrTrk 623 9 1.33V -38C 31586Pa " +2020-11-21 01:03:47,2020-11-21 01:03:47,33.29450,-110.77183,81,94,9163.20," StrTrk 624 9 1.34V -36C 32636Pa " +2020-11-21 01:04:47,2020-11-21 01:04:47,33.29467,-110.75750,87,90,8929.42," StrTrk 625 9 1.35V -35C 33670Pa " +2020-11-21 01:05:47,2020-11-21 01:05:47,33.29500,-110.74217,98,79,8703.26," StrTrk 626 9 1.37V -33C 34719Pa " +2020-11-21 01:06:50,2020-11-21 01:06:50,33.29533,-110.72717,78,93,8491.12," StrTrk 627 9 1.37V -32C 35767Pa " +2020-11-21 01:07:47,2020-11-21 01:07:47,33.29567,-110.71283,81,87,8265.26," StrTrk 628 9 1.38V -30C 36859Pa " +2020-11-21 01:08:47,2020-11-21 01:08:47,33.29633,-110.69900,67,90,8024.16," StrTrk 629 9 1.40V -29C 38054Pa " +2020-11-21 01:09:47,2020-11-21 01:09:47,33.29733,-110.68550,69,88,7797.09," StrTrk 630 9 1.41V -27C 39245Pa " +2020-11-21 01:10:47,2020-11-21 01:10:47,33.29817,-110.67217,74,91,7568.18," StrTrk 631 9 1.43V -25C 40433Pa " +2020-11-21 01:11:47,2020-11-21 01:11:47,33.29867,-110.65917,72,84,7333.18," StrTrk 632 9 1.44V -24C 41706Pa " +2020-11-21 01:12:47,2020-11-21 01:12:47,33.29867,-110.64717,72,87,7104.28," StrTrk 633 9 1.44V -22C 43006Pa " +2020-11-21 01:13:47,2020-11-21 01:13:47,33.29900,-110.63433,74,84,6881.16," StrTrk 634 9 1.45V -20C 44253Pa " +2020-11-21 01:14:47,2020-11-21 01:14:47,33.29917,-110.62100,69,81,6655.31," StrTrk 635 9 1.46V -18C 45566Pa " +2020-11-21 01:15:47,2020-11-21 01:15:47,33.30033,-110.60850,65,85,6438.29," StrTrk 636 9 1.48V -17C 46887Pa " +2020-11-21 01:18:47,2020-11-21 01:18:47,33.29867,-110.57750,54,113,5794.25," StrTrk 639 9 1.49V -13C 50930Pa " +2020-11-21 01:19:48,2020-11-21 01:19:48,33.29750,-110.57017,37,95,5591.25," StrTrk 640 9 1.50V -11C 52286Pa " +2020-11-21 01:20:47,2020-11-21 01:21:23,33.29717,-110.56350,39,99,5373.01," StrTrk 641 9 1.50V -10C 53679Pa " +2020-11-21 01:21:47,2020-11-21 01:21:47,33.29700,-110.55700,28,98,5169.10," StrTrk 642 9 1.50V -8C 55075Pa " +2020-11-21 01:22:47,2020-11-21 01:22:47,33.29700,-110.55167,19,77,4972.20," StrTrk 643 9 1.51V -6C 56466Pa " +2020-11-21 01:23:47,2020-11-21 01:23:47,33.29700,-110.54750,9,102,4778.96," StrTrk 644 9 1.51V -5C 57845Pa " +2020-11-21 01:24:49,2020-11-21 01:24:49,33.29650,-110.54383,28,95,4595.16," StrTrk 645 9 1.52V -3C 59178Pa " +2020-11-21 01:25:47,2020-11-21 01:25:47,33.29583,-110.54117,19,94,4404.06," StrTrk 646 9 1.53V -2C 60584Pa " +2020-11-21 01:26:47,2020-11-21 01:26:47,33.29567,-110.53850,22,116,4201.06," StrTrk 647 9 1.52V -1C 62123Pa " +2020-11-21 01:27:49,2020-11-21 01:27:49,33.29600,-110.53600,19,75,3995.93," StrTrk 648 9 1.53V 0C 63701Pa " +2020-11-21 01:28:48,2020-11-21 01:29:24,33.29683,-110.53350,11,32,3826.15," StrTrk 649 9 1.53V 1C 65042Pa " +2020-11-21 01:30:47,2020-11-21 01:30:47,33.30317,-110.52867,33,349,3531.11," StrTrk 651 9 1.54V 2C 67458Pa " +2020-11-21 01:32:48,2020-11-21 01:32:48,33.31250,-110.52700,13,3,3193.08," StrTrk 653 9 1.54V 3C 70277Pa " +2020-11-21 01:33:48,2020-11-21 01:33:48,33.31500,-110.52550,22,43,2968.14," StrTrk 654 9 1.55V 5C 72156Pa " +2020-11-21 01:34:48,2020-11-21 01:34:48,33.31633,-110.52417,17,63,2795.93," StrTrk 655 9 1.55V 6C 73708Pa " +2020-11-21 01:40:48,2020-11-21 01:40:48,33.31700,-110.51017,17,100,1912.92," StrTrk 661 9 1.58V 14C 81727Pa " +2020-11-21 01:43:54,2020-11-21 01:43:54,33.31650,-110.50333,13,162,1425.85," StrTrk 664 9 1.59V 19C 86501Pa " +2020-11-21 01:44:48,2020-11-21 01:44:48,33.31633,-110.50300,4,322,1255.78," StrTrk 665 9 1.59V 20C 88212Pa " diff --git a/balloon_data/SHAB7V-APRS.csv b/balloon_data/SHAB7V-APRS.csv new file mode 100644 index 0000000..00e688e --- /dev/null +++ b/balloon_data/SHAB7V-APRS.csv @@ -0,0 +1,1572 @@ +time,lasttime,lat,lng,speed,course,altitude,comment +2021-11-06 04:37:45,2021-11-06 04:38:21,32.23650,-110.95217,6,0,780.59,"004TxC 28.70C 931.09hPa 7.84V 05S SpaceTREx SHAB-7V" +2021-11-06 04:38:39,2021-11-06 04:38:39,32.23650,-110.95233,2,0,782.42,"005TxC 29.00C 931.05hPa 7.84V 06S SpaceTREx SHAB-7V" +2021-11-06 04:38:57,2021-11-06 04:39:15,32.23650,-110.95217,0,0,777.24,"007TxC 29.50C 931.21hPa 7.84V 06S SpaceTREx SHAB-7V" +2021-11-06 04:39:33,2021-11-06 04:39:33,32.23683,-110.95200,2,0,766.88,"008TxC 29.70C 931.18hPa 7.84V 06S SpaceTREx SHAB-7V" +2021-11-07 15:09:51,2021-11-07 15:12:15,32.26083,-109.84367,0,78,1277.72,"047TxC 29.20C 874.36hPa 7.38V 06S SpaceTREx SHAB-7V" +2021-11-07 15:12:34,2021-11-07 15:12:34,32.26100,-109.84367,4,78,1297.23,"056TxC 34.50C 868.59hPa 7.38V 07S SpaceTREx SHAB-7V" +2021-11-07 15:12:52,2021-11-07 15:12:52,32.26100,-109.84350,4,27,1327.10,"057TxC 34.70C 870.74hPa 7.38V 06S SpaceTREx SHAB-7V" +2021-11-07 15:13:10,2021-11-07 15:13:10,32.26117,-109.84350,4,8,1366.72,"058TxC 33.10C 868.84hPa 7.38V 06S SpaceTREx SHAB-7V" +2021-11-07 15:13:29,2021-11-07 15:13:29,32.26150,-109.84333,6,4,1369.16,"059TxC 31.70C 867.06hPa 7.39V 07S SpaceTREx SHAB-7V" +2021-11-07 15:13:48,2021-11-07 15:13:48,32.26167,-109.84350,0,4,1372.21,"060TxC 28.60C 858.98hPa 7.38V 06S SpaceTREx SHAB-7V" +2021-11-07 15:14:04,2021-11-07 15:14:04,32.26183,-109.84350,2,4,1394.76,"061TxC 31.80C 864.62hPa 7.39V 09S SpaceTREx SHAB-7V" +2021-11-07 15:14:22,2021-11-07 15:14:22,32.26217,-109.84350,11,336,1371.90,"062TxC 31.60C 863.20hPa 7.39V 06S SpaceTREx SHAB-7V" +2021-11-07 15:14:40,2021-11-07 15:14:40,32.26267,-109.84383,11,336,1427.38,"063TxC 32.60C 862.22hPa 7.39V 07S SpaceTREx SHAB-7V" +2021-11-07 15:14:58,2021-11-07 15:14:58,32.26300,-109.84417,11,330,1436.22,"064TxC 30.00C 854.38hPa 7.39V 08S SpaceTREx SHAB-7V" +2021-11-07 15:15:17,2021-11-07 15:17:44,32.26350,-109.84450,13,326,1455.12,"065TxC 29.90C 856.35hPa 7.39V 08S SpaceTREx SHAB-7V" +2021-11-07 15:17:58,2021-11-07 15:17:58,32.26750,-109.84783,15,319,1620.01,"074TxC 28.60C 843.70hPa 7.41V 08S SpaceTREx SHAB-7V" +2021-11-07 15:18:16,2021-11-07 15:18:16,32.26800,-109.84833,13,319,1645.31,"075TxC 28.10C 841.72hPa 7.41V 06S SpaceTREx SHAB-7V" +2021-11-07 15:18:34,2021-11-07 15:18:34,32.26867,-109.84883,17,319,1646.83,"076TxC 28.40C 839.79hPa 7.41V 08S SpaceTREx SHAB-7V" +2021-11-07 15:18:52,2021-11-07 15:18:52,32.26917,-109.84950,17,320,1686.76,"077TxC 27.90C 837.95hPa 7.41V 07S SpaceTREx SHAB-7V" +2021-11-07 15:19:10,2021-11-07 15:19:10,32.26983,-109.85017,19,314,1693.16,"078TxC 27.30C 835.96hPa 7.41V 08S SpaceTREx SHAB-7V" +2021-11-07 15:19:28,2021-11-07 15:19:28,32.27033,-109.85083,17,313,1700.17,"079TxC 27.00C 833.68hPa 7.41V 08S SpaceTREx SHAB-7V" +2021-11-07 15:19:46,2021-11-07 15:19:46,32.27100,-109.85167,20,307,1734.62,"080TxC 26.70C 831.48hPa 7.41V 08S SpaceTREx SHAB-7V" +2021-11-07 15:20:04,2021-11-07 15:20:04,32.27150,-109.85250,15,310,1747.72,"081TxC 23.80C 820.83hPa 7.41V 09S SpaceTREx SHAB-7V" +2021-11-07 15:20:40,2021-11-07 15:20:40,32.27233,-109.85350,11,315,1805.94,"083TxC 28.40C 817.51hPa 7.41V 06S SpaceTREx SHAB-7V" +2021-11-07 15:20:58,2021-11-07 15:20:58,32.27250,-109.85400,9,297,1836.72,"084TxC 33.80C 822.41hPa 7.41V 08S SpaceTREx SHAB-7V" +2021-11-07 15:21:16,2021-11-07 15:21:16,32.27283,-109.85450,15,297,1878.18,"085TxC 31.60C 819.43hPa 7.42V 08S SpaceTREx SHAB-7V" +2021-11-07 15:22:10,2021-11-07 15:22:10,32.27333,-109.85617,7,300,1936.09,"088TxC 29.50C 807.97hPa 7.42V 07S SpaceTREx SHAB-7V" +2021-11-07 15:22:29,2021-11-07 15:22:29,32.27367,-109.85650,7,319,1963.22,"089TxC 30.00C 810.27hPa 7.42V 07S SpaceTREx SHAB-7V" +2021-11-07 15:22:46,2021-11-07 15:22:46,32.27383,-109.85683,6,302,1972.97,"090TxC 24.70C 798.06hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:23:22,2021-11-07 15:23:22,32.27417,-109.85733,6,338,2027.53,"092TxC 30.40C 803.43hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:23:40,2021-11-07 15:23:40,32.27450,-109.85750,6,335,2047.95,"093TxC 29.90C 800.82hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:23:58,2021-11-07 15:23:58,32.27467,-109.85750,6,343,2090.62,"094TxC 28.10C 792.52hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:24:16,2021-11-07 15:24:16,32.27500,-109.85767,6,341,2120.80,"095TxC 29.20C 793.59hPa 7.44V 07S SpaceTREx SHAB-7V" +2021-11-07 15:24:34,2021-11-07 15:24:34,32.27533,-109.85767,6,344,2145.18,"096TxC 30.60C 792.84hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:24:52,2021-11-07 15:24:52,32.27550,-109.85783,6,14,2164.99,"097TxC 30.30C 790.52hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:25:28,2021-11-07 15:25:28,32.27633,-109.85750,7,18,2211.63,"099TxC 27.80C 785.65hPa 7.44V 07S SpaceTREx SHAB-7V" +2021-11-07 15:25:46,2021-11-07 15:25:46,32.27683,-109.85733,9,13,2231.44,"100TxC 22.50C 773.89hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:26:04,2021-11-07 15:26:04,32.27717,-109.85717,9,1,2271.06,"101TxC 27.80C 780.98hPa 7.44V 07S SpaceTREx SHAB-7V" +2021-11-07 15:26:22,2021-11-07 15:26:22,32.27767,-109.85700,13,6,2284.17,"102TxC 26.90C 778.81hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:26:40,2021-11-07 15:26:40,32.27817,-109.85700,9,25,2305.81,"103TxC 23.40C 767.34hPa 7.44V 08S SpaceTREx SHAB-7V" +2021-11-07 15:26:58,2021-11-07 15:26:58,32.27867,-109.85650,11,34,2326.84,"104TxC 26.20C 768.01hPa 7.44V 06S SpaceTREx SHAB-7V" +2021-11-07 15:27:34,2021-11-07 15:27:34,32.27983,-109.85583,15,21,2372.56,"106TxC 27.10C 769.68hPa 7.46V 07S SpaceTREx SHAB-7V" +2021-11-07 15:27:55,2021-11-07 15:27:55,32.28033,-109.85550,17,27,2415.54,"107TxC 24.80C 759.19hPa 7.46V 07S SpaceTREx SHAB-7V" +2021-11-07 15:28:10,2021-11-07 15:28:10,32.28100,-109.85517,15,34,2442.06,"108TxC 27.00C 757.81hPa 7.44V 07S SpaceTREx SHAB-7V" +2021-11-07 15:28:28,2021-11-07 15:28:28,32.28150,-109.85467,17,24,2467.36,"109TxC 29.00C 762.38hPa 7.46V 08S SpaceTREx SHAB-7V" +2021-11-07 15:28:47,2021-11-07 15:28:47,32.28233,-109.85433,17,23,2490.52,"110TxC 27.40C 760.04hPa 7.46V 07S SpaceTREx SHAB-7V" +2021-11-07 15:29:04,2021-11-07 15:29:04,32.28300,-109.85400,17,23,2505.15,"111TxC 28.60C 758.07hPa 7.46V 07S SpaceTREx SHAB-7V" +2021-11-07 15:29:22,2021-11-07 15:29:22,32.28367,-109.85350,19,33,2538.98,"112TxC 24.30C 746.90hPa 7.46V 08S SpaceTREx SHAB-7V" +2021-11-07 15:29:40,2021-11-07 15:29:40,32.28417,-109.85300,17,35,2575.56,"113TxC 25.50C 745.55hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 15:31:28,2021-11-07 15:31:28,32.28917,-109.84950,20,29,2744.72,"119TxC 28.10C 737.21hPa 7.46V 07S SpaceTREx SHAB-7V" +2021-11-07 15:31:47,2021-11-07 15:31:47,32.29000,-109.84900,20,25,2773.98,"120TxC 25.80C 727.87hPa 7.46V 08S SpaceTREx SHAB-7V" +2021-11-07 15:32:40,2021-11-07 15:32:40,32.29283,-109.84717,24,31,2869.39,"123TxC 19.00C 712.40hPa 7.46V 09S SpaceTREx SHAB-7V" +2021-11-07 15:32:59,2021-11-07 15:32:59,32.29383,-109.84650,26,32,2904.13,"124TxC 25.70C 723.19hPa 7.47V 05S SpaceTREx SHAB-7V" +2021-11-07 15:33:16,2021-11-07 15:33:16,32.29467,-109.84583,19,34,2915.11,"125TxC 25.50C 721.01hPa 7.47V 09S SpaceTREx SHAB-7V" +2021-11-07 15:33:36,2021-11-07 15:33:36,32.29533,-109.84517,20,32,2942.54,"126TxC 23.70C 717.89hPa 7.47V 07S SpaceTREx SHAB-7V" +2021-11-07 15:33:52,2021-11-07 15:33:52,32.29617,-109.84467,17,29,2980.64,"127TxC 22.40C 715.22hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 15:34:10,2021-11-07 15:34:10,32.29667,-109.84417,15,42,3010.20,"128TxC 25.10C 713.80hPa 7.47V 08S SpaceTREx SHAB-7V" +2021-11-07 15:34:46,2021-11-07 15:34:46,32.29767,-109.84300,11,33,3059.58,"130TxC 23.40C 708.21hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 15:35:06,2021-11-07 15:35:06,32.29817,-109.84267,11,39,3083.36,"131TxC 23.20C 705.89hPa 7.47V 08S SpaceTREx SHAB-7V" +2021-11-07 15:35:58,2021-11-07 15:35:58,32.29967,-109.84150,13,42,3189.43,"134TxC 23.50C 698.19hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 15:36:16,2021-11-07 15:36:16,32.30017,-109.84100,13,47,3221.43,"135TxC 20.90C 688.54hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 15:36:34,2021-11-07 15:36:34,32.30050,-109.84050,15,22,3235.45,"136TxC 19.90C 686.59hPa 7.49V 08S SpaceTREx SHAB-7V" +2021-11-07 15:36:53,2021-11-07 15:36:53,32.30100,-109.84000,11,55,3260.45,"137TxC 25.70C 691.35hPa 7.47V 09S SpaceTREx SHAB-7V" +2021-11-07 15:37:12,2021-11-07 15:37:12,32.30133,-109.83967,13,35,3294.89,"138TxC 25.40C 688.79hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 15:38:06,2021-11-07 15:38:06,32.30317,-109.83750,24,51,3383.89,"141TxC 17.10C 670.45hPa 7.49V 08S SpaceTREx SHAB-7V" +2021-11-07 15:38:24,2021-11-07 15:38:24,32.30367,-109.83667,17,57,3407.66,"142TxC 22.90C 677.96hPa 7.49V 05S SpaceTREx SHAB-7V" +2021-11-07 15:38:42,2021-11-07 15:38:42,32.30400,-109.83600,13,61,3443.94,"143TxC 23.70C 675.88hPa 7.49V 07S SpaceTREx SHAB-7V" +2021-11-07 15:39:00,2021-11-07 15:39:00,32.30433,-109.83533,9,67,3474.42,"144TxC 22.10C 673.09hPa 7.49V 05S SpaceTREx SHAB-7V" +2021-11-07 15:39:36,2021-11-07 15:39:36,32.30483,-109.83433,9,47,3535.07,"146TxC 19.90C 667.55hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 15:39:54,2021-11-07 15:39:54,32.30500,-109.83383,11,60,3560.37,"147TxC 20.50C 665.49hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 15:40:29,2021-11-07 15:40:29,32.30550,-109.83267,13,60,3603.04,"149TxC 22.60C 661.96hPa 7.49V 07S SpaceTREx SHAB-7V" +2021-11-07 15:40:48,2021-11-07 15:40:48,32.30567,-109.83183,13,87,3632.61,"150TxC 21.20C 659.16hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 15:41:07,2021-11-07 15:41:07,32.30583,-109.83100,15,77,3663.39,"151TxC 21.90C 656.98hPa 7.49V 07S SpaceTREx SHAB-7V" +2021-11-07 15:41:24,2021-11-07 15:41:24,32.30617,-109.83033,9,81,3696.92,"152TxC 20.40C 652.92hPa 7.49V 07S SpaceTREx SHAB-7V" +2021-11-07 15:41:41,2021-11-07 15:41:41,32.30617,-109.82967,13,90,3722.83,"153TxC 22.00C 652.93hPa 7.49V 07S SpaceTREx SHAB-7V" +2021-11-07 15:41:59,2021-11-07 15:41:59,32.30617,-109.82900,9,88,3750.87,"154TxC 21.50C 650.43hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 15:42:17,2021-11-07 15:42:17,32.30617,-109.82850,13,90,3785.62,"155TxC 20.70C 647.66hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 15:42:35,2021-11-07 15:42:35,32.30633,-109.82767,17,68,3812.44,"156TxC 20.40C 645.21hPa 7.49V 08S SpaceTREx SHAB-7V" +2021-11-07 15:42:54,2021-11-07 15:42:54,32.30650,-109.82683,15,75,3838.04,"157TxC 15.50C 633.59hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:43:12,2021-11-07 15:43:12,32.30683,-109.82600,19,77,3866.69,"158TxC 20.50C 640.71hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:43:29,2021-11-07 15:43:29,32.30700,-109.82483,19,80,3907.23,"159TxC 22.30C 638.82hPa 7.49V 05S SpaceTREx SHAB-7V" +2021-11-07 15:43:48,2021-11-07 15:43:48,32.30717,-109.82383,17,70,3930.09,"160TxC 20.70C 636.11hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:44:05,2021-11-07 15:44:05,32.30733,-109.82283,19,67,3955.39,"161TxC 19.20C 633.09hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:44:23,2021-11-07 15:44:23,32.30767,-109.82183,20,76,4005.38,"162TxC 19.10C 630.58hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 15:44:59,2021-11-07 15:44:59,32.30783,-109.81983,19,73,4057.80,"164TxC 19.40C 625.92hPa 7.51V 05S SpaceTREx SHAB-7V" +2021-11-07 15:45:17,2021-11-07 15:45:17,32.30783,-109.81883,20,89,4086.45,"165TxC 18.90C 623.23hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:45:53,2021-11-07 15:45:53,32.30817,-109.81700,15,86,4155.03,"167TxC 17.60C 617.98hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:46:14,2021-11-07 15:46:14,32.30817,-109.81617,19,83,4201.97,"168TxC 15.10C 607.70hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 15:46:29,2021-11-07 15:46:29,32.30817,-109.81517,20,90,4222.39,"169TxC 20.10C 612.79hPa 7.49V 04S SpaceTREx SHAB-7V" +2021-11-07 15:46:49,2021-11-07 15:46:49,32.30833,-109.81400,20,80,4263.54,"170TxC 18.00C 609.18hPa 7.49V 07S SpaceTREx SHAB-7V" +2021-11-07 15:47:07,2021-11-07 15:47:07,32.30850,-109.81283,24,85,4316.27,"171TxC 17.80C 605.96hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:47:25,2021-11-07 15:47:25,32.30867,-109.81150,24,78,4352.54,"172TxC 18.80C 604.00hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:47:44,2021-11-07 15:47:44,32.30883,-109.81017,22,85,4379.67,"173TxC 18.10C 601.14hPa 7.49V 08S SpaceTREx SHAB-7V" +2021-11-07 15:48:01,2021-11-07 15:48:01,32.30883,-109.80883,24,83,4417.77,"174TxC 17.70C 598.47hPa 7.51V 05S SpaceTREx SHAB-7V" +2021-11-07 15:48:19,2021-11-07 15:48:19,32.30900,-109.80750,20,86,4455.87,"175TxC 16.60C 595.73hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:48:37,2021-11-07 15:48:37,32.30900,-109.80633,24,90,4495.19,"176TxC 11.60C 582.95hPa 7.31V 06S SpaceTREx SHAB-7V" +2021-11-07 15:48:56,2021-11-07 15:48:56,32.30883,-109.80500,24,90,4522.01,"177TxC 17.60C 590.55hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:49:13,2021-11-07 15:49:13,32.30900,-109.80367,20,84,4553.41,"178TxC 18.60C 588.68hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:49:31,2021-11-07 15:49:31,32.30917,-109.80233,26,79,4589.98,"179TxC 18.50C 584.67hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:49:49,2021-11-07 15:49:49,32.30933,-109.80117,22,77,4629.30,"180TxC 10.00C 574.25hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:50:09,2021-11-07 15:50:09,32.30950,-109.79983,24,74,4661.92,"181TxC 15.10C 574.21hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:50:28,2021-11-07 15:50:28,32.30983,-109.79850,28,74,4700.02,"182TxC 18.60C 578.06hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:50:44,2021-11-07 15:50:44,32.31017,-109.79700,26,80,4728.67,"183TxC 16.80C 574.92hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:51:19,2021-11-07 15:51:19,32.31083,-109.79367,33,80,4796.64,"185TxC 10.50C 560.38hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:51:55,2021-11-07 15:51:55,32.31133,-109.79017,33,87,4867.35,"187TxC 10.70C 556.92hPa 7.51V 08S SpaceTREx SHAB-7V" +2021-11-07 15:52:13,2021-11-07 15:52:13,32.31133,-109.78833,35,92,4902.10,"188TxC 12.10C 553.50hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:52:31,2021-11-07 15:52:31,32.31117,-109.78617,35,96,4944.47,"189TxC 19.50C 561.51hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:52:49,2021-11-07 15:52:49,32.31117,-109.78417,39,91,4962.45,"190TxC 17.20C 558.43hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:53:07,2021-11-07 15:53:07,32.31117,-109.78200,41,87,5012.74,"191TxC 17.10C 555.06hPa 7.51V 08S SpaceTREx SHAB-7V" +2021-11-07 15:53:25,2021-11-07 15:53:25,32.31117,-109.77983,39,89,5045.05,"192TxC 17.40C 553.63hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:53:43,2021-11-07 15:53:43,32.31117,-109.77783,37,91,5077.36,"193TxC 16.10C 551.09hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:54:19,2021-11-07 15:54:19,32.31083,-109.77383,39,92,5127.35,"195TxC 16.20C 546.79hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:54:37,2021-11-07 15:54:37,32.31083,-109.77167,35,98,5161.79,"196TxC 18.50C 545.57hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:54:57,2021-11-07 15:54:57,32.31083,-109.76983,35,90,5196.23,"197TxC 11.90C 533.35hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:55:12,2021-11-07 15:55:12,32.31083,-109.76783,41,88,5238.29,"198TxC 16.80C 540.17hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:55:31,2021-11-07 15:55:31,32.31067,-109.76583,35,86,5255.36,"199TxC 15.00C 537.70hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:55:48,2021-11-07 15:55:48,32.31067,-109.76383,39,86,5283.40,"200TxC 13.90C 533.54hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:56:24,2021-11-07 15:56:24,32.31100,-109.75983,35,83,5360.82,"202TxC 15.70C 530.84hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:56:43,2021-11-07 15:56:43,32.31100,-109.75783,39,90,5398.92,"203TxC 7.50C 515.83hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 15:57:02,2021-11-07 15:57:02,32.31117,-109.75583,35,83,5430.32,"204TxC 15.00C 526.07hPa 7.51V 08S SpaceTREx SHAB-7V" +2021-11-07 15:57:19,2021-11-07 15:57:19,32.31133,-109.75400,41,88,5466.28,"205TxC 10.10C 515.44hPa 7.51V 08S SpaceTREx SHAB-7V" +2021-11-07 15:57:39,2021-11-07 15:57:39,32.31133,-109.75200,35,83,5508.96,"206TxC 13.00C 516.35hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:57:56,2021-11-07 15:57:56,32.31150,-109.75000,37,88,5539.13,"207TxC 11.00C 512.09hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:58:13,2021-11-07 15:58:16,32.31167,-109.74817,37,82,5569.61,"208TxC 14.10C 516.61hPa 7.51V 07S Spac TREx SHAB-7V" +2021-11-07 15:58:31,2021-11-07 15:58:31,32.31200,-109.74617,35,83,5601.00,"209TxC 13.10C 508.53hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:59:07,2021-11-07 15:59:07,32.31217,-109.74250,35,83,5666.23,"211TxC 14.40C 510.44hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:59:25,2021-11-07 15:59:25,32.31233,-109.74067,35,81,5697.93,"212TxC 3.80C 506.02hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 15:59:43,2021-11-07 15:59:43,32.31250,-109.73867,37,84,5724.75,"213TxC 14.90C 506.21hPa 7.51V 08S SpaceTREx SHAB-7V" +2021-11-07 16:00:01,2021-11-07 16:00:01,32.31267,-109.73683,33,86,5757.67,"214TxC 14.00C 504.06hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:00:37,2021-11-07 16:00:37,32.31317,-109.73283,37,80,5825.34,"216TxC 12.80C 499.37hPa 7.49V 08S SpaceTREx SHAB-7V" +2021-11-07 16:00:56,2021-11-07 16:00:56,32.31350,-109.73067,43,75,5861.91,"217TxC 11.90C 496.90hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:01:30,2021-11-07 16:01:30,32.31433,-109.72667,43,71,5934.46,"219TxC 13.00C 493.24hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:01:49,2021-11-07 16:01:49,32.31467,-109.72467,43,76,5951.22,"220TxC 8.40C 484.64hPa 7.49V 08S SpaceTREx SHAB-7V" +2021-11-07 16:02:07,2021-11-07 16:02:07,32.31517,-109.72250,41,74,5979.57,"221TxC 12.00C 488.73hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:02:26,2021-11-07 16:02:26,32.31567,-109.72050,39,77,6030.16,"222TxC 10.40C 485.82hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:03:02,2021-11-07 16:03:02,32.31667,-109.71633,41,69,6113.37,"224TxC 9.90C 480.46hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:03:37,2021-11-07 16:03:37,32.31800,-109.71183,46,68,6176.77,"226TxC 9.70C 476.26hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:03:55,2021-11-07 16:03:55,32.31867,-109.70967,43,74,6202.68,"227TxC 9.80C 474.26hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:04:13,2021-11-07 16:04:13,32.31950,-109.70733,46,66,6258.46,"228TxC 8.10C 471.11hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:04:31,2021-11-07 16:04:31,32.32050,-109.70500,52,64,6293.82,"229TxC 7.10C 468.12hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:04:49,2021-11-07 16:04:49,32.32133,-109.70250,52,62,6331.92,"230TxC -0.10C 451.91hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:05:25,2021-11-07 16:05:25,32.32317,-109.69733,50,70,6389.83,"232TxC 5.60C 461.09hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:06:02,2021-11-07 16:06:02,32.32500,-109.69217,52,69,6465.72,"234TxC 5.40C 456.82hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:06:19,2021-11-07 16:06:19,32.32583,-109.68950,52,69,6501.38,"235TxC 5.90C 454.74hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:06:37,2021-11-07 16:06:37,32.32667,-109.68683,56,67,6539.48,"236TxC 5.00C 450.43hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:06:55,2021-11-07 16:06:55,32.32767,-109.68417,56,68,6582.77,"237TxC 6.20C 450.42hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:07:14,2021-11-07 16:07:14,32.32850,-109.68117,59,67,6621.48,"238TxC 7.00C 448.02hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:07:33,2021-11-07 16:07:33,32.32950,-109.67783,61,73,6664.76,"239TxC -0.70C 440.87hPa 7.51V 07S SpaceTREx SHAB-7V" +2021-11-07 16:07:51,2021-11-07 16:07:51,32.33033,-109.67450,67,68,6691.88,"240TxC 8.40C 444.08hPa 7.51V 05S SpaceTREx SHAB-7V" +2021-11-07 16:08:28,2021-11-07 16:08:28,32.33217,-109.66800,65,75,6754.37,"242TxC 7.40C 439.81hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:08:45,2021-11-07 16:08:45,32.33333,-109.66450,65,75,6801.31,"243TxC 5.10C 436.87hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:09:03,2021-11-07 16:09:03,32.33400,-109.66100,70,72,6818.68,"244TxC 3.90C 434.39hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:09:21,2021-11-07 16:09:21,32.33500,-109.65750,65,76,6860.44,"245TxC 3.00C 432.01hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:09:39,2021-11-07 16:09:39,32.33583,-109.65400,67,74,6904.94,"246TxC 2.40C 429.30hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:09:57,2021-11-07 16:09:57,32.33667,-109.65033,67,75,6946.70,"247TxC 2.20C 427.24hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:10:15,2021-11-07 16:10:15,32.33750,-109.64683,72,73,6983.88,"248TxC 1.40C 424.69hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:10:33,2021-11-07 16:10:33,32.33833,-109.64317,70,74,7004.91,"249TxC 0.80C 422.37hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:10:52,2021-11-07 16:10:52,32.33917,-109.63950,72,75,7065.57,"250TxC 3.00C 421.27hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:11:28,2021-11-07 16:11:28,32.34083,-109.63167,76,75,7135.98,"252TxC 4.10C 417.05hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:11:45,2021-11-07 16:11:45,32.34183,-109.62783,74,74,7186.27,"253TxC -12.50C 418.20hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:12:04,2021-11-07 16:12:04,32.34267,-109.62400,72,76,7227.42,"254TxC 1.70C 409.55hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:12:39,2021-11-07 16:12:39,32.34450,-109.61650,72,76,7301.18,"256TxC 1.70C 406.21hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:12:57,2021-11-07 16:12:57,32.34567,-109.61283,72,71,7361.53,"257TxC 1.70C 403.96hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:13:16,2021-11-07 16:13:16,32.34650,-109.60900,74,71,7395.36,"258TxC 1.50C 401.49hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:13:33,2021-11-07 16:13:33,32.34750,-109.60550,70,72,7440.47,"259TxC -6.30C 387.58hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:13:51,2021-11-07 16:13:51,32.34850,-109.60183,70,68,7484.06,"260TxC 3.10C 397.79hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:14:09,2021-11-07 16:14:09,32.34950,-109.59850,67,72,7522.77,"261TxC 0.30C 394.17hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:14:27,2021-11-07 16:14:27,32.35050,-109.59500,67,71,7566.05,"262TxC 1.20C 392.08hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:14:45,2021-11-07 16:14:45,32.35133,-109.59150,69,69,7611.47,"263TxC -0.40C 389.33hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:15:03,2021-11-07 16:15:03,32.35233,-109.58817,65,70,7641.95,"264TxC 1.40C 387.82hPa 7.51V 06S SpaceTREx SHAB-7V" +2021-11-07 16:15:21,2021-11-07 16:15:21,32.35333,-109.58483,70,71,7686.14,"265TxC -2.70C 377.99hPa 7.51V 05S SpaceTREx SHAB-7V" +2021-11-07 16:15:39,2021-11-07 16:15:39,32.35433,-109.58133,67,73,7746.49,"266TxC 1.40C 383.25hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:16:51,2021-11-07 16:16:51,32.35783,-109.56667,70,75,7917.79,"270TxC -2.00C 372.24hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:17:09,2021-11-07 16:17:09,32.35867,-109.56300,72,74,7951.93,"271TxC -0.30C 370.70hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:17:46,2021-11-07 16:17:46,32.36017,-109.55517,74,80,8045.50,"273TxC -12.80C 352.76hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:18:03,2021-11-07 16:18:03,32.36067,-109.55133,76,80,8089.09,"274TxC -6.00C 357.83hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:18:21,2021-11-07 16:18:21,32.36100,-109.54733,72,82,8138.46,"275TxC -2.10C 361.46hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:18:58,2021-11-07 16:18:58,32.36200,-109.53933,76,79,8195.46,"277TxC -1.70C 357.55hPa 7.49V 05S SpaceTREx SHAB-7V" +2021-11-07 16:19:15,2021-11-07 16:19:15,32.36267,-109.53533,76,79,8239.66,"278TxC -2.40C 354.66hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:19:51,2021-11-07 16:19:51,32.36433,-109.52683,85,76,8321.04,"280TxC -3.30C 350.76hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:20:10,2021-11-07 16:20:10,32.36533,-109.52250,81,76,8373.47,"281TxC -22.80C 324.18hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:20:27,2021-11-07 16:20:27,32.36617,-109.51800,87,76,8401.81,"282TxC -3.20C 347.15hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:20:46,2021-11-07 16:20:46,32.36700,-109.51367,83,77,8449.67,"283TxC -5.70C 344.01hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:21:03,2021-11-07 16:21:03,32.36783,-109.50917,85,78,8485.33,"284TxC -4.20C 341.58hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:21:40,2021-11-07 16:21:40,32.36967,-109.50000,87,76,8562.14,"286TxC -5.00C 338.54hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:21:57,2021-11-07 16:21:57,32.37050,-109.49533,91,74,8588.35,"287TxC -11.30C 326.82hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:22:51,2021-11-07 16:22:51,32.37333,-109.48150,80,77,8710.88,"290TxC -8.20C 329.99hPa 7.49V 06S SpaceTREx SHAB-7V" +2021-11-07 16:23:27,2021-11-07 16:23:27,32.37483,-109.47350,70,75,8781.90,"292TxC -7.50C 326.69hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:23:45,2021-11-07 16:23:45,32.37583,-109.46967,70,75,8825.79,"293TxC -6.90C 324.91hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:24:03,2021-11-07 16:24:03,32.37667,-109.46600,70,72,8848.95,"294TxC -8.50C 322.44hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:24:21,2021-11-07 16:24:21,32.37750,-109.46250,67,73,8892.24,"295TxC -10.10C 319.86hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:24:57,2021-11-07 16:24:57,32.37933,-109.45583,65,70,8961.73,"297TxC -8.70C 317.02hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:25:15,2021-11-07 16:25:15,32.38050,-109.45267,65,70,9012.63,"298TxC -9.50C 314.71hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:25:36,2021-11-07 16:25:36,32.38183,-109.44933,67,66,9056.52,"299TxC -10.00C 312.68hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:25:51,2021-11-07 16:25:51,32.38300,-109.44583,76,66,9086.39,"300TxC -11.60C 310.00hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:26:09,2021-11-07 16:26:09,32.38417,-109.44233,67,69,9143.09,"301TxC -10.70C 308.17hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:26:27,2021-11-07 16:26:27,32.38533,-109.43883,74,69,9169.30,"302TxC -11.20C 306.23hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:26:45,2021-11-07 16:26:45,32.38650,-109.43533,70,68,9222.94,"303TxC -12.40C 303.78hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:27:03,2021-11-07 16:27:03,32.38767,-109.43200,59,69,9268.36,"304TxC -12.30C 301.65hPa 7.47V 06S SpaceTREx SHAB-7V" +2021-11-07 16:27:39,2021-11-07 16:27:39,32.38950,-109.42567,61,70,9355.84,"306TxC -9.60C 299.20hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:27:57,2021-11-07 16:27:57,32.39050,-109.42267,63,68,9401.86,"307TxC -8.30C 297.91hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:28:34,2021-11-07 16:28:34,32.39250,-109.41633,59,70,9476.84,"309TxC -18.90C 285.42hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:29:46,2021-11-07 16:29:46,32.39633,-109.40400,65,77,9683.19,"313TxC -13.00C 279.38hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:30:04,2021-11-07 16:30:04,32.39717,-109.40083,59,65,9707.27,"314TxC -7.70C 284.67hPa 7.44V 06S SpaceTREx SHAB-7V" +2021-11-07 16:31:34,2021-11-07 16:31:34,32.40350,-109.38400,72,63,9916.67,"319TxC -6.60C 276.31hPa 7.42V 06S SpaceTREx SHAB-7V" +2021-11-07 16:31:51,2021-11-07 16:31:51,32.40517,-109.38033,74,62,9962.08,"320TxC -8.90C 273.48hPa 7.41V 06S SpaceTREx SHAB-7V" +2021-11-07 16:32:09,2021-11-07 16:32:11,32.40650,-109.37683,80,66,10019.08,"321TxC -15.20C 263.97hPa 7.44V 06S SpaceTREx SHAB-7V" +2021-11-07 16:32:28,2021-11-07 16:32:28,32.40817,-109.37317,74,64,10061.14,"322TxC -11.90C 267.86hPa 7.44V 06S SpaceTREx SHAB-7V" +2021-11-07 16:32:46,2021-11-07 16:32:46,32.40950,-109.36950,78,64,10086.44,"323TxC -10.70C 267.18hPa 7.44V 06S SpaceTREx SHAB-7V" +2021-11-07 16:33:03,2021-11-07 16:33:03,32.41083,-109.36567,80,67,10137.65,"324TxC -10.20C 265.77hPa 7.42V 06" +2021-11-07 16:33:21,2021-11-07 16:33:22,32.41217,-109.36183,76,68,10186.42,"325TxC -10.30C 263.85hPa 7.44V 06S SpaceTREx SHAB-7V" +2021-11-07 16:33:40,2021-11-07 16:33:40,32.41350,-109.35800,74,70,10236.10,"326TxC -11.20C 261.63hPa 7.42V 06S SpaceTREx SHAB-7V" +2021-11-07 16:33:57,2021-11-07 16:33:57,32.41467,-109.35417,80,68,10271.15,"327TxC -11.30C 259.67hPa 7.44V 05" +2021-11-07 16:34:15,2021-11-07 16:34:16,32.41567,-109.35033,78,68,10329.06,"328TxC -10.20C 258.40hPa 7.42V 06S SpaceTREx SHAB-7V" +2021-11-07 16:34:33,2021-11-07 16:34:33,32.41700,-109.34633,74,67,10358.63,"329TxC -10.60C 256.31hPa 7.42V 06" +2021-11-07 16:34:51,2021-11-07 16:34:51,32.41817,-109.34250,78,70,10423.25,"330TxC -9.30C 255.19hPa 7.41V 06" +2021-11-07 16:35:09,2021-11-07 16:35:10,32.41933,-109.33867,78,67,10459.21,"331TxC -12.50C 251.76hPa 7.46V 06S SpaceTREx SHAB-7V" +2021-11-07 16:35:27,2021-11-07 16:35:28,32.42050,-109.33500,70,70,10495.18,"332TxC -46.30C 257.58hPa 7.42V 06S SpaceTREx SHAB-7V" +2021-11-07 16:35:46,2021-11-07 16:35:46,32.42167,-109.33100,76,70,10559.19,"333TxC -11.80C 248.37hPa 7.42V 06S SpaceTREx SHAB-7V" +2021-11-07 16:36:03,2021-11-07 16:36:03,32.42283,-109.32717,78,69,10603.99,"334TxC -12.70C 246.05hPa 7.42V 06" +2021-11-07 16:36:21,2021-11-07 16:36:21,32.42417,-109.32300,80,70,10659.16,"335TxC -14.00C 243.80hPa 7.42V 06" +2021-11-07 16:36:39,2021-11-07 16:36:40,32.42517,-109.31917,80,70,10701.83,"336TxC -12.10C 242.71hPa 7.41V 06S SpaceTREx SHAB-7V" +2021-11-07 16:36:58,2021-11-07 16:36:58,32.42650,-109.31533,76,68,10748.47,"337TxC -24.80C 229.75hPa 7.42V 06S SpaceTREx SHAB-7V" +2021-11-07 16:37:16,2021-11-07 16:37:16,32.42783,-109.31150,74,64,10794.19,"338TxC -12.40C 239.10hPa 7.42V 06S SpaceTREx SHAB-7V" +2021-11-07 16:37:33,2021-11-07 16:37:33,32.42933,-109.30767,83,66,10848.14,"339TxC -12.70C 236.84hPa 7.42V 06" +2021-11-07 16:37:51,2021-11-07 16:37:51,32.43083,-109.30367,81,67,10893.55,"340TxC -12.70C 235.41hPa 7.41V 06" +2021-11-07 16:38:26,2021-11-07 16:38:26,32.43333,-109.29517,81,69,10989.56,"342TxC -17.40C 226.54hPa 7.41V 06S SpaceTREx SHAB-7V" +2021-11-07 16:39:03,2021-11-07 16:39:03,32.43567,-109.28667,83,74,11081.92,"344TxC -14.30C 227.86hPa 7.41V 06" +2021-11-07 16:39:59,2021-11-07 16:39:59,32.43883,-109.27333,91,74,11231.88,"347TxC -32.20C 206.27hPa 7.41V 06S SpaceTREx SHAB-7V" +2021-11-07 16:40:15,2021-11-07 16:40:15,32.44000,-109.26867,87,74,11288.27,"348TxC -15.50C 220.11hPa 7.41V 06S SpaceTREx SHAB-7V" +2021-11-07 16:40:33,2021-11-07 16:40:33,32.44100,-109.26417,91,74,11335.82,"349TxC -20.90C 210.70hPa 7.41V 06" +2021-11-07 16:40:51,2021-11-07 16:40:51,32.44217,-109.25967,89,73,11368.74,"350TxC -22.30C 208.53hPa 7.39V 06" +2021-11-07 16:41:09,2021-11-07 16:41:09,32.44333,-109.25517,87,77,11421.77,"351TxC -15.40C 215.38hPa 7.39V 06" +2021-11-07 16:41:45,2021-11-07 16:41:45,32.44567,-109.24583,89,72,11511.08,"353TxC -17.10C 211.10hPa 7.39V 05" +2021-11-07 16:42:03,2021-11-07 16:42:03,32.44667,-109.24100,94,72,11571.43,"354TxC -34.90C 187.76hPa 7.39V 06" +2021-11-07 16:42:21,2021-11-07 16:42:21,32.44767,-109.23650,89,79,11629.64,"355TxC -17.00C 207.99hPa 7.39V 06" +2021-11-07 16:42:39,2021-11-07 16:42:39,32.44900,-109.23167,94,72,11672.32,"356TxC -17.60C 206.06hPa 7.39V 06" +2021-11-07 16:43:15,2021-11-07 16:43:15,32.45117,-109.22167,98,76,11774.42,"358TxC -22.20C 195.58hPa 7.39V 06" +2021-11-07 16:43:52,2021-11-07 16:43:52,32.45367,-109.21183,93,75,11878.36,"360TxC -14.30C 200.73hPa 7.38V 05S SpaceTREx SHAB-7V" +2021-11-07 16:44:09,2021-11-07 16:44:09,32.45467,-109.20667,96,77,11935.66,"361TxC -14.40C 198.97hPa 7.38V 06" +2021-11-07 16:44:27,2021-11-07 16:44:27,32.45567,-109.20183,98,76,11974.37,"362TxC -15.70C 196.83hPa 7.18V 06" +2021-11-07 16:44:45,2021-11-07 16:44:45,32.45683,-109.19683,91,76,12012.17,"363TxC -36.20C 176.77hPa 7.38V 06" +2021-11-07 16:45:03,2021-11-07 16:45:03,32.45783,-109.19167,100,76,12073.13,"364TxC -15.30C 194.14hPa 7.36V 06" +2021-11-07 16:45:39,2021-11-07 16:45:39,32.45983,-109.18150,96,73,12166.09,"366TxC -20.90C 183.83hPa 7.36V 06" +2021-11-07 16:45:57,2021-11-07 16:45:57,32.46100,-109.17650,100,75,12206.33,"367TxC -16.00C 189.21hPa 7.36V 06S SpaceTREx SHAB-7V" +2021-11-07 16:46:15,2021-11-07 16:46:15,32.46233,-109.17117,100,72,12262.71,"368TxC -15.30C 187.87hPa 7.36V 06" +2021-11-07 16:46:33,2021-11-07 16:46:33,32.46367,-109.16617,100,71,12313.62,"369TxC -37.40C 187.62hPa 7.38V 06" +2021-11-07 16:46:52,2021-11-07 16:46:52,32.46500,-109.16117,96,74,12376.10,"370TxC -29.60C 169.16hPa 7.36V 06S SpaceTREx SHAB-7V" +2021-11-07 16:47:10,2021-11-07 16:47:10,32.46633,-109.15600,102,73,12417.55,"371TxC -15.30C 183.43hPa 7.38V 06S SpaceTREx SHAB-7V" +2021-11-07 16:47:27,2021-11-07 16:47:27,32.46750,-109.15083,98,75,12464.49,"372TxC -16.60C 181.07hPa 7.36V 06" +2021-11-07 16:47:45,2021-11-07 16:47:48,32.46867,-109.14583,93,73,12516.00,"373TxC -16.90C 179.63hPa 7.36V 06S SpaceTREx SHAB-7V" +2021-11-07 16:48:21,2021-11-07 16:48:21,32.47050,-109.13583,98,76,12628.47,"375TxC -29.20C 162.91hPa 7.36V 06" +2021-11-07 16:48:57,2021-11-07 16:48:57,32.47250,-109.12600,96,77,12728.75,"377TxC -18.70C 172.51hPa 7.38V 06S SpaceTREx SHAB-7V" +2021-11-07 16:49:15,2021-11-07 16:49:15,32.47350,-109.12100,93,76,12778.44,"378TxC -20.10C 170.07hPa 7.36V 06" +2021-11-07 16:49:33,2021-11-07 16:49:33,32.47450,-109.11600,98,77,12840.00,"379TxC -37.70C 149.46hPa 7.36V 06" +2021-11-07 16:49:51,2021-11-07 16:49:52,32.47533,-109.11100,96,77,12916.20,"380TxC -19.30C 166.94hPa 7.38V 06S SpaceTREx SHAB-7V" +2021-11-07 16:50:09,2021-11-07 16:50:09,32.47633,-109.10633,89,75,12964.97,"381TxC -20.90C 164.72hPa 7.36V 06" +2021-11-07 16:50:27,2021-11-07 16:50:27,32.47750,-109.10117,96,74,13024.71,"382TxC -21.00C 163.08hPa 7.36V 06" +2021-11-07 16:50:45,2021-11-07 16:50:45,32.47867,-109.09600,102,77,13082.02,"383TxC -28.00C 153.43hPa 7.36V 06" +2021-11-07 16:51:21,2021-11-07 16:51:21,32.48067,-109.08550,100,78,13191.74,"385TxC -20.00C 158.64hPa 7.36V 06" +2021-11-07 16:51:39,2021-11-07 16:51:39,32.48167,-109.08017,104,76,13251.18,"386TxC -19.80C 157.29hPa 7.36V 06" +2021-11-07 16:51:57,2021-11-07 16:51:57,32.48267,-109.07483,102,77,13318.54,"387TxC -20.60C 154.51hPa 7.34V 06" +2021-11-07 16:52:15,2021-11-07 16:52:15,32.48367,-109.06950,96,79,13361.82,"388TxC -31.60C 141.05hPa 7.36V 06" +2021-11-07 16:52:34,2021-11-07 16:52:34,32.48450,-109.06450,98,79,13420.04,"389TxC -19.60C 152.73hPa 7.36V 06S SpaceTREx SHAB-7V" +2021-11-07 16:52:51,2021-11-07 16:52:51,32.48517,-109.05950,94,80,13488.62,"390TxC -27.50C 142.71hPa 7.34V 06" +2021-11-07 16:53:09,2021-11-07 16:53:09,32.48600,-109.05450,93,81,13534.95,"391TxC -42.80C 164.44hPa 7.33V 06" +2021-11-07 16:53:27,2021-11-07 16:53:27,32.48683,-109.04967,89,78,13582.50,"392TxC -40.60C 132.08hPa 7.33V 06" +2021-11-07 16:53:46,2021-11-07 16:53:46,32.48767,-109.04500,87,76,13642.85,"393TxC -19.00C 147.15hPa 7.33V 06S SpaceTREx SHAB-7V" +2021-11-07 16:54:03,2021-11-07 16:54:03,32.48850,-109.04067,89,73,13683.69,"394TxC -17.70C 146.73hPa 7.33V 06" +2021-11-07 16:54:21,2021-11-07 16:54:21,32.48967,-109.03583,94,74,13722.40,"395TxC -19.80C 143.86hPa 7.31V 06" +2021-11-07 16:54:39,2021-11-07 16:54:39,32.49100,-109.03117,93,73,13776.35,"396TxC -17.60C 144.67hPa 7.31V 06" +2021-11-07 16:54:57,2021-11-07 16:54:57,32.49200,-109.02650,94,75,13808.96,"397TxC -16.50C 144.07hPa 7.31V 06" +2021-11-07 16:55:15,2021-11-07 16:55:15,32.49317,-109.02167,91,75,13839.44,"398TxC -15.80C 143.71hPa 7.31V 06" +2021-11-07 16:55:33,2021-11-07 16:55:33,32.49450,-109.01683,94,70,13877.85,"399TxC -15.20C 143.06hPa 7.31V 06S SpaceTREx SHAB-7V" +2021-11-07 16:55:52,2021-11-07 16:55:52,32.49600,-109.01200,98,67,13922.96,"400TxC -14.80C 142.27hPa 7.31V 05S SpaceTREx SHAB-7V" +2021-11-07 16:56:10,2021-11-07 16:56:10,32.49750,-109.00717,91,67,13947.34,"401TxC -14.40C 141.53hPa 7.23V 06S SpaceTREx SHAB-7V" +2021-11-07 16:56:30,2021-11-07 16:56:30,32.49917,-109.00267,93,70,13981.48,"402TxC -13.10C 141.25hPa 7.29V 06S SpaceTREx SHAB-7V" +2021-11-07 16:56:45,2021-11-07 16:56:46,32.50083,-108.99800,94,63,14028.12,"403TxC -17.60C 134.72hPa 7.28V 06S SpaceTREx SHAB-7V" +2021-11-07 16:57:21,2021-11-07 16:57:21,32.50450,-108.98900,93,63,14098.83,"405TxC -21.20C 127.24hPa 7.28V 06" +2021-11-07 16:57:57,2021-11-07 16:57:58,32.50833,-108.98000,94,63,14180.21,"407TxC -9.10C 138.40hPa 7.28V 06S SpaceTREx SHAB-7V" +2021-11-07 16:58:16,2021-11-07 16:58:16,32.51017,-108.97567,91,61,14219.53,"408TxC -9.00C 137.52hPa 7.28V 06S SpaceTREx SHAB-7V" +2021-11-07 16:58:33,2021-11-07 16:58:33,32.51200,-108.97133,89,62,14242.39,"409TxC -21.20C 124.14hPa 7.28V 06" +2021-11-07 16:58:51,2021-11-07 16:58:51,32.51383,-108.96700,93,66,14296.03,"410TxC -10.40C 134.83hPa 7.28V 06" +2021-11-07 16:59:09,2021-11-07 16:59:09,32.51550,-108.96250,93,66,14337.79,"411TxC -11.00C 133.33hPa 7.28V 06S SpaceTREx SHAB-7V" +2021-11-07 17:00:04,2021-11-07 17:00:04,32.52033,-108.94933,91,64,14461.24,"414TxC -8.90C 131.63hPa 7.26V 06S SpaceTREx SHAB-7V" +2021-11-07 17:00:39,2021-11-07 17:00:39,32.52317,-108.94050,83,70,14538.96,"416TxC -32.90C 149.02hPa 7.26V 08" +2021-11-07 17:00:57,2021-11-07 17:00:57,32.52450,-108.93617,87,72,14581.33,"417TxC -12.30C 127.31hPa 7.26V 09" +2021-11-07 17:01:15,2021-11-07 17:01:15,32.52550,-108.93183,85,73,14625.83,"418TxC -11.60C 126.55hPa 7.26V 09" +2021-11-07 17:01:51,2021-11-07 17:01:52,32.52783,-108.92317,85,70,14715.74,"420TxC -11.00C 125.16hPa 7.26V 10S SpaceTREx SHAB-7V" +2021-11-07 17:02:09,2021-11-07 17:02:09,32.52933,-108.91883,87,67,14750.19,"421TxC -20.80C 114.59hPa 7.26V 11S SpaceTREx SHAB-7V" +2021-11-07 17:02:27,2021-11-07 17:02:27,32.53067,-108.91450,83,71,14776.40,"422TxC -9.70C 124.00hPa 7.26V 09" +2021-11-07 17:02:46,2021-11-07 17:02:46,32.53200,-108.91017,85,70,14814.19,"423TxC -38.40C 132.03hPa 7.26V 10S SpaceTREx SHAB-7V" +2021-11-07 17:03:03,2021-11-07 17:03:03,32.53300,-108.90600,87,70,14851.38,"424TxC -34.20C 101.71hPa 7.24V 10S SpaceTREx SHAB-7V" +2021-11-07 17:03:21,2021-11-07 17:03:22,32.53417,-108.90150,89,73,14886.13,"425TxC -20.90C 110.66hPa 7.24V 10S SpaceTREx SHAB-7V" +2021-11-07 17:03:39,2021-11-07 17:03:39,32.53550,-108.89683,93,71,14919.66,"426TxC -9.00C 121.23hPa 7.24V 10" +2021-11-07 17:04:16,2021-11-07 17:04:16,32.53800,-108.88733,89,72,15006.52,"428TxC -5.60C 121.09hPa 7.24V 09S SpaceTREx SHAB-7V" +2021-11-07 17:04:33,2021-11-07 17:04:33,32.53917,-108.88267,94,74,15049.80,"429TxC -26.70C 108.03hPa 7.24V 10" +2021-11-07 17:04:51,2021-11-07 17:04:52,32.54017,-108.87800,85,73,15106.19,"430TxC -7.10C 118.57hPa 7.23V 09S SpaceTREx SHAB-7V" +2021-11-07 17:05:09,2021-11-07 17:05:09,32.54117,-108.87333,87,75,15131.49,"431TxC -19.70C 106.36hPa 7.24V 10S SpaceTREx SHAB-7V" +2021-11-07 17:05:27,2021-11-07 17:05:27,32.54200,-108.86917,78,78,15190.62,"432TxC -7.80C 116.23hPa 7.23V 09" +2021-11-07 17:05:46,2021-11-07 17:05:46,32.54300,-108.86517,78,74,15233.90,"433TxC -7.30C 115.42hPa 7.23V 10S SpaceTREx SHAB-7V" +2021-11-07 17:06:03,2021-11-07 17:06:03,32.54383,-108.86117,72,76,15280.23,"434TxC -4.80C 115.71hPa 7.23V 09" +2021-11-07 17:06:21,2021-11-07 17:06:21,32.54467,-108.85750,72,79,15325.34,"435TxC -11.60C 109.35hPa 7.23V 10" +2021-11-07 17:06:40,2021-11-07 17:06:40,32.54533,-108.85383,70,72,15370.15,"436TxC -9.80C 111.33hPa 7.23V 09S SpaceTREx SHAB-7V" +2021-11-07 17:07:15,2021-11-07 17:07:16,32.54717,-108.84683,69,72,15460.07,"438TxC -11.60C 108.79hPa 7.23V 07S SpaceTREx SHAB-7V" +2021-11-07 17:07:34,2021-11-07 17:07:34,32.54800,-108.84300,69,75,15489.02,"439TxC -12.10C 107.72hPa 7.23V 09S SpaceTREx SHAB-7V" +2021-11-07 17:07:52,2021-11-07 17:07:52,32.54883,-108.83933,70,75,15528.65,"440TxC -28.50C 90.11hPa 7.23V 10S SpaceTREx SHAB-7V" +2021-11-07 17:08:28,2021-11-07 17:08:28,32.55033,-108.83167,72,77,15601.80,"442TxC -24.60C 92.78hPa 7.23V 11S SpaceTREx SHAB-7V" +2021-11-07 17:08:45,2021-11-07 17:08:46,32.55100,-108.82783,76,76,15631.67,"443TxC -11.30C 105.28hPa 7.23V 09S SpaceTREx SHAB-7V" +2021-11-07 17:09:04,2021-11-07 17:09:04,32.55183,-108.82400,72,76,15679.52,"444TxC -46.90C 128.39hPa 7.23V 08S SpaceTREx SHAB-7V" +2021-11-07 17:09:39,2021-11-07 17:09:39,32.55300,-108.81717,63,78,15753.89,"446TxC -18.30C 95.42hPa 7.21V 10" +2021-11-07 17:10:51,2021-11-07 17:10:51,32.55467,-108.80583,52,68,15938.30,"450TxC -7.30C 101.58hPa 7.21V 08" +2021-11-07 17:11:09,2021-11-07 17:11:10,32.55567,-108.80333,52,65,15985.24,"451TxC -9.00C 99.93hPa 7.21V 09S SpaceTREx SHAB-7V" +2021-11-07 17:11:46,2021-11-07 17:11:46,32.55767,-108.79800,57,68,16086.12,"453TxC -7.60C 98.70hPa 7.19V 09S SpaceTREx SHAB-7V" +2021-11-07 17:12:04,2021-11-07 17:12:04,32.55850,-108.79500,57,69,16135.20,"454TxC -5.50C 98.83hPa 7.19V 10S SpaceTREx SHAB-7V" +2021-11-07 17:12:21,2021-11-07 17:12:21,32.55933,-108.79233,50,73,16183.97,"455TxC -6.60C 97.55hPa 7.19V 09S SpaceTREx SHAB-7V" +2021-11-07 17:12:41,2021-11-07 17:12:41,32.56017,-108.78967,48,65,16218.41,"456TxC -7.00C 96.54hPa 7.19V 07S SpaceTREx SHAB-7V" +2021-11-07 17:13:15,2021-11-07 17:13:16,32.56233,-108.78500,52,56,16297.96,"458TxC -9.80C 93.87hPa 7.19V 10" +2021-11-07 17:13:33,2021-11-07 17:13:33,32.56367,-108.78250,57,56,16338.50,"459TxC -11.50C 92.34hPa 7.19V 11" +2021-11-07 17:13:52,2021-11-07 17:13:52,32.56500,-108.78000,54,62,16387.27,"460TxC -30.90C 79.07hPa 7.19V 10S SpaceTREx SHAB-7V" +2021-11-07 17:14:09,2021-11-07 17:14:09,32.56617,-108.77750,59,57,16413.78,"461TxC -10.30C 91.55hPa 7.19V 09" +2021-11-07 17:14:28,2021-11-07 17:14:28,32.56783,-108.77467,61,54,16456.76,"462TxC -12.30C 89.95hPa 7.19V 09S SpaceTREx SHAB-7V" +2021-11-07 17:14:46,2021-11-07 17:14:46,32.56950,-108.77200,59,53,16504.31,"463TxC -13.40C 89.10hPa 7.19V 08S SpaceTREx SHAB-7V" +2021-11-07 17:15:39,2021-11-07 17:15:39,32.57300,-108.76350,56,68,16617.09,"466TxC -5.90C 90.14hPa 7.18V 11" +2021-11-07 17:15:57,2021-11-07 17:15:57,32.57400,-108.76083,56,67,16665.55,"467TxC -8.80C 88.08hPa 7.18V 09" +2021-11-07 17:16:33,2021-11-07 17:16:33,32.57550,-108.75467,54,76,16741.44,"469TxC -7.40C 87.31hPa 7.18V 10" +2021-11-07 17:16:52,2021-11-07 17:16:52,32.57600,-108.75217,44,79,16795.70,"470TxC -8.00C 86.33hPa 7.18V 09S SpaceTREx SHAB-7V" +2021-11-07 17:17:28,2021-11-07 17:17:28,32.57717,-108.74767,44,70,16881.65,"472TxC -10.60C 83.52hPa 7.18V 09S SpaceTREx SHAB-7V" +2021-11-07 17:18:03,2021-11-07 17:18:03,32.57883,-108.74317,46,66,16974.92,"474TxC -13.10C 80.93hPa 7.18V 07S SpaceTREx SHAB-7V" +2021-11-07 17:18:21,2021-11-07 17:18:21,32.57967,-108.74117,39,69,17027.35,"475TxC -15.00C 79.19hPa 7.19V 09S SpaceTREx SHAB-7V" +2021-11-07 17:18:40,2021-11-07 17:18:40,32.58017,-108.73883,43,77,17073.98,"476TxC -14.00C 78.85hPa 7.18V 10S SpaceTREx SHAB-7V" +2021-11-07 17:19:15,2021-11-07 17:19:15,32.58050,-108.73417,43,85,17172.43,"478TxC -14.10C 77.44hPa 7.19V 10" +2021-11-07 17:20:28,2021-11-07 17:20:28,32.58217,-108.72583,33,66,17330.62,"482TxC -14.50C 74.85hPa 7.18V 08S SpaceTREx SHAB-7V" +2021-11-07 17:20:46,2021-11-07 17:20:46,32.58283,-108.72433,33,61,17350.44,"483TxC -15.10C 74.01hPa 7.18V 10S SpaceTREx SHAB-7V" +2021-11-07 17:21:03,2021-11-07 17:21:03,32.58350,-108.72250,35,67,17390.36,"484TxC -14.90C 73.58hPa 7.18V 08S SpaceTREx SHAB-7V" +2021-11-07 17:21:21,2021-11-07 17:21:21,32.58383,-108.72083,28,68,17434.86,"485TxC -34.80C 68.18hPa 7.16V 10S SpaceTREx SHAB-7V" +2021-11-07 17:21:40,2021-11-07 17:21:40,32.58467,-108.71950,35,52,17471.75,"486TxC -15.30C 72.30hPa 7.16V 10S SpaceTREx SHAB-7V" +2021-11-07 17:22:16,2021-11-07 17:22:16,32.58667,-108.71650,35,41,17543.07,"488TxC -14.90C 71.42hPa 7.16V 09S SpaceTREx SHAB-7V" +2021-11-07 17:23:10,2021-11-07 17:23:10,32.58967,-108.71050,44,54,17697.30,"491TxC -12.70C 70.56hPa 7.14V 08S SpaceTREx SHAB-7V" +2021-11-07 17:23:46,2021-11-07 17:23:46,32.59233,-108.70717,41,43,17781.42,"493TxC -11.40C 69.81hPa 7.14V 09S SpaceTREx SHAB-7V" +2021-11-07 17:24:04,2021-11-07 17:24:04,32.59367,-108.70583,39,36,17826.53,"494TxC -12.50C 68.71hPa 7.14V 08S SpaceTREx SHAB-7V" +2021-11-07 17:24:40,2021-11-07 17:24:40,32.59700,-108.70317,48,37,17900.60,"496TxC -13.10C 67.40hPa 7.16V 10S SpaceTREx SHAB-7V" +2021-11-07 17:26:10,2021-11-07 17:26:10,32.60383,-108.69067,57,70,18052.08,"501TxC -10.10C 66.93hPa 7.13V 10S SpaceTREx SHAB-7V" +2021-11-07 17:26:46,2021-11-07 17:26:46,32.60500,-108.68450,59,81,18110.61,"503TxC -8.20C 67.16hPa 7.13V 10S SpaceTREx SHAB-7V" +2021-11-07 17:27:40,2021-11-07 17:27:40,32.60500,-108.67567,54,93,18207.23,"506TxC -8.40C 65.68hPa 7.13V 10S SpaceTREx SHAB-7V" +2021-11-07 17:27:58,2021-11-07 17:27:58,32.60500,-108.67317,48,95,18246.85,"507TxC -9.00C 64.93hPa 7.13V 08S SpaceTREx SHAB-7V" +2021-11-07 17:28:33,2021-11-07 17:29:09,32.60433,-108.66783,46,93,18310.56,"509TxC -9.30C 63.84hPa 7.13V 07S SpaceTREx SHAB-7V" +2021-11-07 17:29:28,2021-11-07 17:29:28,32.60467,-108.66067,41,80,18415.10,"512TxC -13.30C 60.71hPa 7.13V 10S SpaceTREx SHAB-7V" +2021-11-07 17:29:46,2021-11-07 17:29:46,32.60517,-108.65867,41,75,18440.70,"513TxC -13.70C 60.21hPa 7.13V 10S SpaceTREx SHAB-7V" +2021-11-07 17:31:16,2021-11-07 17:31:16,32.60683,-108.64633,46,90,18595.24,"518TxC -27.50C 92.86hPa 7.11V 09S SpaceTREx SHAB-7V" +2021-11-07 17:31:36,2021-11-07 17:31:36,32.60683,-108.64400,39,92,18633.03,"519TxC -3.20C 63.10hPa 7.11V 09S SpaceTREx SHAB-7V" +2021-11-07 17:31:54,2021-11-07 17:31:54,32.60667,-108.64183,41,91,18662.29,"520TxC -4.30C 62.14hPa 7.11V 09S SpaceTREx SHAB-7V" +2021-11-07 17:32:11,2021-11-07 17:32:11,32.60650,-108.63967,41,94,18686.68,"521TxC -3.40C 62.14hPa 7.11V 09S SpaceTREx SHAB-7V" +2021-11-07 17:32:30,2021-11-07 17:32:30,32.60633,-108.63750,41,95,18727.52,"522TxC -2.90C 62.11hPa 7.11V 08S SpaceTREx SHAB-7V" +2021-11-07 17:33:05,2021-11-07 17:33:05,32.60617,-108.63333,35,92,18803.11,"524TxC -3.00C 61.11hPa 7.11V 08S SpaceTREx SHAB-7V" +2021-11-07 17:34:47,2021-11-07 17:34:47,32.60650,-108.62717,39,87,18886.63,"527TxC -3.30C 60.23hPa 7.09V 09S SpaceTREx SHAB-7V" +2021-11-07 17:34:54,2021-11-07 17:34:54,32.60700,-108.62150,43,81,18974.71,"530TxC -28.10C 97.75hPa 7.09V 09S SpaceTREx SHAB-7V" +2021-11-07 17:35:14,2021-11-07 17:35:14,32.60733,-108.61900,48,78,18997.57,"531TxC -13.90C 60.34hPa 7.09V 09S SpaceTREx SHAB-7V" +2021-11-07 17:35:49,2021-11-07 17:35:49,32.60817,-108.61400,50,77,19043.60,"533TxC 8.20C 62.86hPa 7.06V 08S SpaceTREx SHAB-7V" +2021-11-07 17:36:24,2021-11-07 17:36:24,32.60967,-108.60850,56,67,19096.94,"535TxC 8.20C 62.35hPa 7.08V 10S SpaceTREx SHAB-7V" +2021-11-07 17:36:41,2021-11-07 17:36:41,32.61050,-108.60567,56,78,19118.88,"536TxC 10.00C 62.44hPa 7.06V 10S SpaceTREx SHAB-7V" +2021-11-07 17:37:17,2021-11-07 17:37:17,32.61217,-108.59983,61,73,19170.09,"538TxC 12.90C 62.98hPa 7.08V 09S SpaceTREx SHAB-7V" +2021-11-07 17:37:53,2021-11-07 17:37:53,32.61350,-108.59333,61,80,19220.08,"540TxC 13.30C 62.15hPa 7.08V 11S SpaceTREx SHAB-7V" +2021-11-07 17:38:30,2021-11-07 17:38:30,32.61383,-108.58700,56,90,19267.63,"542TxC 5.00C 53.59hPa 7.08V 10S SpaceTREx SHAB-7V" +2021-11-07 17:39:24,2021-11-07 17:39:24,32.61317,-108.57817,56,98,19340.78,"545TxC 17.80C 62.13hPa 7.06V 10S SpaceTREx SHAB-7V" +2021-11-07 17:39:59,2021-11-07 17:39:59,32.61233,-108.57233,52,104,19376.44,"547TxC 17.20C 61.37hPa 7.06V 11S SpaceTREx SHAB-7V" +2021-11-07 17:40:36,2021-11-07 17:40:36,32.61117,-108.56717,50,104,19406.01,"549TxC 2.70C 47.27hPa 7.06V 09S SpaceTREx SHAB-7V" +2021-11-07 17:40:53,2021-11-07 17:40:53,32.61050,-108.56467,46,108,19413.32,"550TxC 15.90C 60.49hPa 7.06V 09" +2021-11-07 17:41:48,2021-11-07 17:41:48,32.60900,-108.55783,39,106,19463.61,"553TxC 15.70C 59.72hPa 7.06V 10S SpaceTREx SHAB-7V" +2021-11-07 17:42:41,2021-11-07 17:42:41,32.60767,-108.55217,31,104,19541.34,"556TxC 16.30C 59.36hPa 7.06V 09S SpaceTREx SHAB-7V" +2021-11-07 17:42:59,2021-11-07 17:42:59,32.60750,-108.55067,28,95,19577.91,"557TxC 18.30C 59.59hPa 7.05V 07S SpaceTREx SHAB-7V" +2021-11-07 17:43:18,2021-11-07 17:43:18,32.60733,-108.54933,22,93,19611.44,"558TxC 5.60C 48.63hPa 7.06V 08S SpaceTREx SHAB-7V" +2021-11-07 17:43:35,2021-11-07 17:43:35,32.60733,-108.54833,19,84,19630.03,"559TxC 16.60C 58.23hPa 7.06V 10" +2021-11-07 17:43:54,2021-11-07 17:43:54,32.60750,-108.54717,20,86,19655.33,"560TxC 16.00C 57.80hPa 7.06V 10S SpaceTREx SHAB-7V" +2021-11-07 17:44:11,2021-11-07 17:44:11,32.60767,-108.54600,19,73,19670.57,"561TxC 16.70C 57.90hPa 7.06V 08S SpaceTREx SHAB-7V" +2021-11-07 17:45:05,2021-11-07 17:45:05,32.60867,-108.54250,24,63,19721.47,"564TxC 15.80C 56.89hPa 7.06V 10S SpaceTREx SHAB-7V" +2021-11-07 17:45:24,2021-11-07 17:45:24,32.60917,-108.54133,26,61,19741.59,"565TxC 15.40C 56.68hPa 7.06V 10S SpaceTREx SHAB-7V" +2021-11-07 17:46:19,2021-11-07 17:46:19,32.61117,-108.53733,35,57,19782.43,"568TxC 16.90C 56.95hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:46:36,2021-11-07 17:46:36,32.61233,-108.53583,33,51,19776.64,"569TxC 20.60C 58.47hPa 7.05V 10S SpaceTREx SHAB-7V" +2021-11-07 17:46:54,2021-11-07 17:46:54,32.61300,-108.53450,33,57,19807.43,"570TxC 18.20C 57.09hPa 7.05V 09S SpaceTREx SHAB-7V" +2021-11-07 17:47:11,2021-11-07 17:47:11,32.61383,-108.53283,31,61,19827.24,"571TxC 3.40C 42.30hPa 7.05V 10S SpaceTREx SHAB-7V" +2021-11-07 17:47:30,2021-11-07 17:47:30,32.61450,-108.53117,31,67,19855.89,"572TxC 19.30C 56.91hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:48:05,2021-11-07 17:48:05,32.61567,-108.52800,31,71,19904.66,"574TxC 17.40C 55.62hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:49:00,2021-11-07 17:49:00,32.61667,-108.52267,35,81,19981.47,"577TxC 17.70C 55.08hPa 7.05V 09S SpaceTREx SHAB-7V" +2021-11-07 17:49:36,2021-11-07 17:49:36,32.61700,-108.51850,39,88,20012.25,"579TxC -1.60C 97.39hPa 7.05V 09S SpaceTREx SHAB-7V" +2021-11-07 17:49:53,2021-11-07 17:49:53,32.61700,-108.51650,37,89,20029.02,"580TxC 21.30C 55.88hPa 7.05V 09S SpaceTREx SHAB-7V" +2021-11-07 17:50:30,2021-11-07 17:50:30,32.61700,-108.51283,35,88,20043.04,"582TxC 18.20C 54.67hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:50:48,2021-11-07 17:50:48,32.61700,-108.51100,31,90,20027.80,"583TxC 17.50C 54.45hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:51:07,2021-11-07 17:51:07,32.61700,-108.50933,30,87,20033.28,"584TxC 2.60C 89.00hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:51:24,2021-11-07 17:51:24,32.61700,-108.50767,28,86,20033.89,"585TxC 20.30C 55.55hPa 7.05V 10S SpaceTREx SHAB-7V" +2021-11-07 17:51:41,2021-11-07 17:51:41,32.61700,-108.50633,26,84,20039.08,"586TxC 18.70C 54.88hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:52:37,2021-11-07 17:52:37,32.61717,-108.50183,28,84,20056.45,"589TxC 17.60C 55.36hPa 7.05V 09S SpaceTREx SHAB-7V" +2021-11-07 17:52:54,2021-11-07 17:52:54,32.61733,-108.50033,26,89,20061.94,"590TxC -5.20C 100.72hPa 7.05V 09S SpaceTREx SHAB-7V" +2021-11-07 17:53:11,2021-11-07 17:53:11,32.61733,-108.49883,26,88,20086.62,"591TxC 20.80C 55.37hPa 7.05V 07S SpaceTREx SHAB-7V" +2021-11-07 17:53:30,2021-11-07 17:53:30,32.61733,-108.49750,22,92,20089.67,"592TxC 19.40C 54.56hPa 7.05V 06S SpaceTREx SHAB-7V" +2021-11-07 17:53:48,2021-11-07 17:53:48,32.61733,-108.49633,17,87,20103.69,"593TxC 18.40C 54.01hPa 7.05V 07S SpaceTREx SHAB-7V" +2021-11-07 17:54:06,2021-11-07 17:54:06,32.61733,-108.49533,20,92,20120.76,"594TxC 7.90C 43.05hPa 7.05V 06S SpaceTREx SHAB-7V" +2021-11-07 17:55:00,2021-11-07 17:55:00,32.61783,-108.49233,13,73,20141.18,"597TxC 4.80C 43.08hPa 7.05V 09S SpaceTREx SHAB-7V" +2021-11-07 17:55:17,2021-11-07 17:55:17,32.61817,-108.49133,20,68,20148.19,"598TxC 17.00C 52.97hPa 7.05V 07S SpaceTREx SHAB-7V" +2021-11-07 17:55:36,2021-11-07 17:55:36,32.61850,-108.49050,17,64,20152.77,"599TxC 16.20C 52.60hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:55:53,2021-11-07 17:55:53,32.61883,-108.48950,24,74,20161.30,"600TxC 8.00C 45.23hPa 7.03V 05S SpaceTREx SHAB-7V" +2021-11-07 17:56:11,2021-11-07 17:56:11,32.61917,-108.48833,20,68,20154.90,"601TxC 1.10C 59.77hPa 7.05V 09S SpaceTREx SHAB-7V" +2021-11-07 17:56:30,2021-11-07 17:56:30,32.61967,-108.48733,22,71,20118.63,"602TxC 21.60C 58.36hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:56:50,2021-11-07 17:56:50,32.61983,-108.48600,20,69,20090.59,"603TxC -1.80C 108.60hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:57:06,2021-11-07 17:57:06,32.62017,-108.48517,19,68,20091.20,"604TxC 22.10C 55.26hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 17:58:17,2021-11-07 17:58:17,32.62183,-108.48083,22,65,20149.11,"608TxC 24.20C 54.95hPa 7.03V 07S SpaceTREx SHAB-7V" +2021-11-07 17:58:36,2021-11-07 17:58:36,32.62233,-108.47983,20,60,20166.79,"609TxC 22.90C 54.42hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 17:58:53,2021-11-07 17:58:53,32.62267,-108.47883,20,64,20180.50,"610TxC 22.60C 54.27hPa 7.03V 07S SpaceTREx SHAB-7V" +2021-11-07 18:00:06,2021-11-07 18:00:06,32.62417,-108.47500,19,66,20209.76,"614TxC 18.50C 52.64hPa 7.05V 08S SpaceTREx SHAB-7V" +2021-11-07 18:01:18,2021-11-07 18:01:18,32.62583,-108.47083,20,68,20172.88,"618TxC 20.40C 53.70hPa 7.05V 12S SpaceTREx SHAB-7V" +2021-11-07 18:02:11,2021-11-07 18:02:11,32.62700,-108.46750,24,68,20197.57,"621TxC 22.30C 54.10hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:02:30,2021-11-07 18:02:30,32.62733,-108.46617,24,69,20218.91,"622TxC 8.50C 38.52hPa 7.03V 07S SpaceTREx SHAB-7V" +2021-11-07 18:03:06,2021-11-07 18:03:06,32.62817,-108.46400,22,60,20227.14,"624TxC 15.50C 45.92hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:03:24,2021-11-07 18:03:24,32.62867,-108.46300,22,64,20226.53,"625TxC 27.10C 55.21hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:03:42,2021-11-07 18:03:42,32.62917,-108.46183,24,68,20230.19,"626TxC 29.50C 56.08hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:04:00,2021-11-07 18:04:00,32.62950,-108.46067,22,69,20228.05,"627TxC 14.40C 41.86hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:04:54,2021-11-07 18:04:54,32.63050,-108.45700,22,64,20225.31,"630TxC 15.20C 66.26hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 18:05:50,2021-11-07 18:05:50,32.63183,-108.45417,20,67,20208.24,"633TxC 19.30C 40.52hPa 7.03V 07S SpaceTREx SHAB-7V" +2021-11-07 18:06:23,2021-11-07 18:06:23,32.63267,-108.45183,22,69,20153.07,"635TxC 22.10C 41.31hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:07:02,2021-11-07 18:07:02,32.63350,-108.44967,20,60,20129.60,"637TxC 35.30C 57.10hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:07:20,2021-11-07 18:07:20,32.63400,-108.44867,20,61,20133.56,"638TxC 33.40C 56.50hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:07:56,2021-11-07 18:07:56,32.63483,-108.44667,20,63,20148.19,"640TxC 29.70C 55.30hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:08:13,2021-11-07 18:08:13,32.63533,-108.44567,22,62,20152.16,"641TxC 27.80C 54.72hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:08:32,2021-11-07 18:08:32,32.63567,-108.44467,20,61,20160.39,"642TxC 26.00C 54.08hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:08:50,2021-11-07 18:08:50,32.63617,-108.44367,19,63,20161.61,"643TxC 24.20C 53.51hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:09:07,2021-11-07 18:09:07,32.63650,-108.44267,19,68,20163.43,"644TxC 22.50C 53.09hPa 7.05V 11S SpaceTREx SHAB-7V" +2021-11-07 18:09:25,2021-11-07 18:09:25,32.63683,-108.44167,19,71,20159.78,"645TxC 21.00C 52.59hPa 7.05V 10S SpaceTREx SHAB-7V" +2021-11-07 18:09:44,2021-11-07 18:09:44,32.63717,-108.44067,20,70,20160.08,"646TxC 19.80C 52.24hPa 7.05V 10S SpaceTREx SHAB-7V" +2021-11-07 18:10:01,2021-11-07 18:10:01,32.63750,-108.43967,20,70,20171.97,"647TxC 18.80C 51.83hPa 7.05V 10S SpaceTREx SHAB-7V" +2021-11-07 18:10:20,2021-11-07 18:10:20,32.63783,-108.43867,20,70,20184.47,"648TxC 18.10C 51.47hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:10:37,2021-11-07 18:10:37,32.63817,-108.43767,20,64,20210.07,"649TxC -6.70C 107.19hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:10:55,2021-11-07 18:10:55,32.63867,-108.43667,20,64,20219.52,"650TxC 5.10C 36.58hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:11:13,2021-11-07 18:11:13,32.63900,-108.43550,24,63,20243.29,"651TxC 23.40C 53.23hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:12:07,2021-11-07 18:12:07,32.64067,-108.43200,24,63,20238.72,"654TxC 24.70C 53.51hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:12:44,2021-11-07 18:12:44,32.64167,-108.43000,20,62,20197.88,"656TxC 21.10C 52.60hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:13:01,2021-11-07 18:13:01,32.64200,-108.42900,19,70,20174.10,"657TxC 19.50C 52.27hPa 7.05V 12S SpaceTREx SHAB-7V" +2021-11-07 18:13:37,2021-11-07 18:13:37,32.64267,-108.42700,19,71,20150.94,"659TxC 17.20C 51.60hPa 7.05V 10S SpaceTREx SHAB-7V" +2021-11-07 18:14:31,2021-11-07 18:14:31,32.64350,-108.42383,19,65,20189.65,"662TxC -3.00C 44.32hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:15:25,2021-11-07 18:15:25,32.64483,-108.42117,19,63,20207.33,"665TxC 20.60C 52.56hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:15:43,2021-11-07 18:15:43,32.64517,-108.42017,19,62,20212.51,"666TxC 19.30C 52.03hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:16:01,2021-11-07 18:16:01,32.64567,-108.41917,20,61,20217.69,"667TxC 18.20C 51.69hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:16:20,2021-11-07 18:16:20,32.64600,-108.41833,19,58,20211.90,"668TxC 17.30C 51.29hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:16:37,2021-11-07 18:16:37,32.64650,-108.41733,17,60,20203.06,"669TxC 16.20C 50.92hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:16:55,2021-11-07 18:16:55,32.64700,-108.41650,19,63,20195.74,"670TxC 15.30C 50.72hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:17:31,2021-11-07 18:17:31,32.64767,-108.41467,17,67,20193.91,"672TxC 14.20C 50.39hPa 7.05V 12S SpaceTREx SHAB-7V" +2021-11-07 18:17:50,2021-11-07 18:17:50,32.64800,-108.41383,19,62,20203.06,"673TxC -6.00C 40.87hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:18:08,2021-11-07 18:18:08,32.64833,-108.41283,20,59,20218.91,"674TxC 15.70C 50.83hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:18:26,2021-11-07 18:18:26,32.64883,-108.41183,20,68,20245.73,"675TxC 14.10C 50.06hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:18:44,2021-11-07 18:18:44,32.64917,-108.41083,22,69,20256.09,"676TxC -14.90C 100.46hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:19:02,2021-11-07 18:19:02,32.64967,-108.40967,20,64,20241.16,"677TxC 17.70C 51.71hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:19:37,2021-11-07 18:19:37,32.65033,-108.40783,19,66,20200.01,"679TxC 15.30C 51.05hPa 7.05V 12S SpaceTREx SHAB-7V" +2021-11-07 18:19:55,2021-11-07 18:19:55,32.65067,-108.40700,19,70,20174.10,"680TxC 14.30C 50.72hPa 7.05V 11S SpaceTREx SHAB-7V" +2021-11-07 18:20:13,2021-11-07 18:20:13,32.65083,-108.40600,17,78,20173.19,"681TxC 13.80C 50.66hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:20:32,2021-11-07 18:20:32,32.65100,-108.40500,17,76,20183.55,"682TxC 13.70C 50.48hPa 7.05V 12S SpaceTREx SHAB-7V" +2021-11-07 18:21:07,2021-11-07 18:21:07,32.65150,-108.40317,17,69,20210.98,"684TxC 15.30C 50.43hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:21:25,2021-11-07 18:21:25,32.65183,-108.40233,17,70,20221.35,"685TxC 17.30C 51.53hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 18:21:44,2021-11-07 18:21:44,32.65200,-108.40133,17,72,20233.23,"686TxC 16.30C 51.03hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:22:02,2021-11-07 18:22:02,32.65233,-108.40050,19,64,20238.72,"687TxC 15.60C 50.74hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:22:19,2021-11-07 18:22:19,32.65267,-108.39950,17,69,20234.15,"688TxC 14.60C 50.41hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:22:37,2021-11-07 18:22:37,32.65300,-108.39867,17,71,20223.78,"689TxC 13.70C 50.16hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:23:14,2021-11-07 18:23:14,32.65333,-108.39683,17,74,20195.44,"691TxC 11.80C 49.70hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:23:49,2021-11-07 18:23:49,32.65383,-108.39500,17,75,20189.04,"693TxC 10.60C 49.29hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:24:25,2021-11-07 18:24:25,32.65433,-108.39300,17,72,20208.24,"695TxC 9.90C 48.95hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:25:02,2021-11-07 18:25:02,32.65500,-108.39117,19,60,20230.49,"697TxC -0.20C 40.00hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:25:22,2021-11-07 18:25:22,32.65533,-108.39033,19,64,20232.62,"698TxC -7.70C 55.72hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:25:37,2021-11-07 18:25:37,32.65567,-108.38933,20,70,20239.33,"699TxC -4.10C 40.05hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:25:56,2021-11-07 18:25:56,32.65600,-108.38833,19,72,20229.58,"700TxC -9.20C 106.77hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:26:13,2021-11-07 18:26:13,32.65633,-108.38733,19,69,20226.53,"701TxC 19.20C 52.61hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:26:50,2021-11-07 18:26:50,32.65667,-108.38550,17,80,20196.96,"703TxC 17.20C 51.92hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:27:07,2021-11-07 18:27:07,32.65683,-108.38450,17,79,20188.73,"704TxC 16.40C 51.62hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:28:19,2021-11-07 18:28:19,32.65750,-108.38100,15,72,20218.91,"708TxC 13.60C 50.37hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:28:38,2021-11-07 18:28:38,32.65767,-108.38017,15,79,20214.03,"709TxC 13.00C 50.21hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:28:55,2021-11-07 18:28:55,32.65783,-108.37933,17,77,20200.01,"710TxC 12.20C 50.00hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:29:14,2021-11-07 18:29:14,32.65800,-108.37850,17,73,20179.59,"711TxC 11.30C 49.77hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:29:32,2021-11-07 18:29:32,32.65817,-108.37767,15,76,20180.20,"712TxC 10.80C 49.62hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:31:20,2021-11-07 18:31:20,32.65917,-108.37267,17,78,20198.18,"718TxC 8.30C 48.59hPa 7.05V 10S SpaceTREx SHAB-7V" +2021-11-07 18:31:38,2021-11-07 18:31:38,32.65933,-108.37183,17,80,20179.28,"719TxC 8.00C 48.81hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:32:14,2021-11-07 18:32:14,32.65950,-108.37000,17,77,20171.66,"721TxC 12.60C 51.03hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:32:49,2021-11-07 18:32:49,32.65983,-108.36833,15,75,20192.39,"723TxC 5.30C 44.32hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:33:07,2021-11-07 18:33:07,32.66000,-108.36733,19,67,20203.36,"724TxC -1.90C 38.29hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:33:26,2021-11-07 18:33:26,32.66033,-108.36650,20,73,20236.59,"725TxC 15.60C 51.18hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:34:01,2021-11-07 18:34:01,32.66100,-108.36417,24,74,20246.34,"727TxC 14.20C 50.52hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:34:19,2021-11-07 18:34:19,32.66133,-108.36300,22,74,20223.48,"728TxC 13.30C 50.37hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:34:37,2021-11-07 18:34:37,32.66150,-108.36200,19,77,20199.10,"729TxC 11.90C 49.99hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:34:55,2021-11-07 18:34:55,32.66167,-108.36100,15,78,20169.84,"730TxC 10.70C 49.77hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:35:13,2021-11-07 18:35:13,32.66200,-108.36017,15,82,20133.26,"731TxC 9.50C 49.53hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:35:31,2021-11-07 18:35:31,32.66200,-108.35917,17,88,20103.08,"732TxC 8.10C 49.24hPa 7.03V 08" +2021-11-07 18:35:50,2021-11-07 18:35:50,32.66200,-108.35833,19,91,20064.37,"733TxC 6.90C 49.06hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:36:07,2021-11-07 18:36:07,32.66200,-108.35717,20,89,20057.97,"734TxC 5.90C 48.88hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:37:22,2021-11-07 18:37:22,32.66183,-108.35283,17,93,20053.40,"738TxC -14.70C 27.81hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:37:39,2021-11-07 18:37:39,32.66183,-108.35183,17,89,20059.50,"739TxC 7.10C 49.37hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:37:57,2021-11-07 18:37:57,32.66183,-108.35083,17,83,20085.41,"740TxC 6.60C 49.22hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:38:15,2021-11-07 18:38:15,32.66200,-108.35000,15,80,20078.40,"741TxC 6.20C 49.01hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 18:38:33,2021-11-07 18:38:33,32.66200,-108.34917,15,90,20075.04,"742TxC 5.80C 49.01hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 18:38:51,2021-11-07 18:38:51,32.66200,-108.34833,17,91,20057.36,"743TxC 5.30C 48.92hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:40:22,2021-11-07 18:40:22,32.66200,-108.34383,15,83,20064.98,"748TxC 4.60C 48.49hPa 7.03V 08S SpaceTREx SHAB-7V" +2021-11-07 18:40:39,2021-11-07 18:40:39,32.66200,-108.34300,15,89,20055.54,"749TxC 4.30C 48.41hPa 7.03V 07" +2021-11-07 18:40:57,2021-11-07 18:40:57,32.66200,-108.34217,19,89,20052.18,"750TxC 3.90C 48.27hPa 7.03V 08" +2021-11-07 18:41:15,2021-11-07 18:41:15,32.66200,-108.34117,19,92,20064.07,"751TxC 3.50C 48.11hPa 7.03V 11S SpaceTREx SHAB-7V" +2021-11-07 18:41:34,2021-11-07 18:41:34,32.66200,-108.34000,19,89,20058.58,"752TxC 3.40C 48.07hPa 7.03V 09S SpaceTREx SHAB-7V" +2021-11-07 18:41:51,2021-11-07 18:41:51,32.66200,-108.33900,19,91,20073.21,"753TxC 3.10C 47.90hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:42:09,2021-11-07 18:42:09,32.66200,-108.33800,19,88,20089.37,"754TxC 3.40C 47.96hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:42:27,2021-11-07 18:42:27,32.66200,-108.33700,15,91,20099.12,"755TxC 3.50C 47.89hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:43:03,2021-11-07 18:43:03,32.66200,-108.33533,17,88,20128.99,"757TxC 8.00C 49.66hPa 7.03V 07S SpaceTREx SHAB-7V" +2021-11-07 18:43:22,2021-11-07 18:43:22,32.66200,-108.33450,17,84,20130.21,"758TxC 9.10C 50.21hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:43:40,2021-11-07 18:43:40,32.66217,-108.33350,17,84,20125.33,"759TxC -8.50C 31.46hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:43:58,2021-11-07 18:43:58,32.66217,-108.33250,17,82,20104.91,"760TxC -8.40C 37.16hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 18:44:16,2021-11-07 18:44:16,32.66217,-108.33167,17,85,20111.31,"761TxC 15.60C 52.88hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:44:34,2021-11-07 18:44:34,32.66233,-108.33083,17,85,20101.86,"762TxC 16.40C 53.12hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 18:44:52,2021-11-07 18:44:52,32.66233,-108.32983,15,88,20092.72,"763TxC 15.90C 52.96hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:45:10,2021-11-07 18:45:10,32.66233,-108.32900,17,87,20098.82,"764TxC 15.70C 52.83hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:46:04,2021-11-07 18:46:04,32.66267,-108.32633,15,79,20106.44,"767TxC 1.70C 36.19hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 18:46:21,2021-11-07 18:46:21,32.66283,-108.32550,15,79,20080.22,"768TxC 17.10C 54.34hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:46:39,2021-11-07 18:46:39,32.66300,-108.32450,15,81,20054.93,"769TxC 23.70C 55.78hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 18:46:58,2021-11-07 18:46:58,32.66300,-108.32367,17,83,20043.95,"770TxC 21.50C 54.93hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 18:47:16,2021-11-07 18:47:16,32.66300,-108.32267,17,82,20025.66,"771TxC -5.80C 97.96hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 18:47:52,2021-11-07 18:47:52,32.66317,-108.32083,19,86,20031.76,"773TxC 2.10C 117.89hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 18:48:10,2021-11-07 18:48:10,32.66333,-108.31967,19,84,20032.37,"774TxC 25.50C 56.31hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 18:48:28,2021-11-07 18:48:28,32.66333,-108.31867,19,81,20027.19,"775TxC 24.90C 56.00hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 18:49:22,2021-11-07 18:49:22,32.66350,-108.31583,15,82,20064.37,"778TxC 22.20C 54.62hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:49:40,2021-11-07 18:49:40,32.66367,-108.31483,17,80,20079.61,"779TxC 22.70C 54.73hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 18:49:58,2021-11-07 18:49:58,32.66367,-108.31383,19,80,20098.82,"780TxC 20.70C 53.77hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:50:15,2021-11-07 18:50:15,32.66400,-108.31283,17,78,20094.24,"781TxC 19.60C 53.43hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:50:34,2021-11-07 18:50:34,32.66417,-108.31183,17,78,20080.53,"782TxC 18.20C 52.95hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 18:50:51,2021-11-07 18:50:51,32.66417,-108.31100,17,87,20064.37,"783TxC 17.30C 52.74hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 18:51:09,2021-11-07 18:51:09,32.66417,-108.31000,20,84,20080.22,"784TxC 16.30C 52.35hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:51:29,2021-11-07 18:51:29,32.66433,-108.30883,19,87,20079.00,"785TxC 15.40C 52.08hPa 7.03V 12S SpaceTREx SHAB-7V" +2021-11-07 18:51:47,2021-11-07 18:51:47,32.66433,-108.30783,19,84,20087.23,"786TxC 14.80C 51.82hPa 7.03V 10S SpaceTREx SHAB-7V" +2021-11-07 18:52:06,2021-11-07 18:52:06,32.66433,-108.30700,19,87,20085.41,"787TxC 13.80C 51.43hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 18:52:41,2021-11-07 18:52:41,32.66450,-108.30500,19,88,20082.66,"789TxC 11.90C 51.04hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 18:53:00,2021-11-07 18:53:00,32.66467,-108.30400,20,87,20056.45,"790TxC 13.40C 51.54hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:53:36,2021-11-07 18:53:36,32.66467,-108.30167,22,90,20043.04,"792TxC 1.90C 40.15hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:53:54,2021-11-07 18:53:54,32.66467,-108.30050,20,85,20050.05,"793TxC 19.60C 54.36hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:54:11,2021-11-07 18:54:11,32.66467,-108.29950,20,81,20068.64,"794TxC 20.90C 54.30hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:54:29,2021-11-07 18:54:29,32.66483,-108.29850,17,88,20074.43,"795TxC 18.80C 53.42hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 18:54:48,2021-11-07 18:54:48,32.66483,-108.29750,19,81,20085.41,"796TxC 17.00C 52.68hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 18:55:06,2021-11-07 18:55:06,32.66500,-108.29650,15,87,20089.06,"797TxC 6.50C 43.48hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:55:23,2021-11-07 18:55:23,32.66500,-108.29550,17,91,20069.25,"798TxC 7.50C 40.89hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:55:42,2021-11-07 18:55:42,32.66500,-108.29467,19,89,20054.93,"799TxC -5.00C 111.60hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 18:56:54,2021-11-07 18:56:54,32.66500,-108.29000,22,90,20022.31,"803TxC 7.00C 77.34hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 18:57:12,2021-11-07 18:57:12,32.66500,-108.28883,20,93,20030.54,"804TxC 7.70C 120.83hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 18:58:23,2021-11-07 18:58:23,32.66483,-108.28400,22,92,20049.13,"808TxC 19.40C 39.46hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 18:59:00,2021-11-07 18:59:00,32.66483,-108.28133,28,93,20012.86,"810TxC 19.60C 43.26hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 18:59:18,2021-11-07 18:59:18,32.66467,-108.27983,26,89,19996.40,"811TxC 25.50C 45.41hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 18:59:35,2021-11-07 18:59:35,32.66450,-108.27817,28,94,20004.02,"812TxC 27.50C 47.90hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 18:59:54,2021-11-07 18:59:54,32.66433,-108.27683,28,95,19991.83,"813TxC 28.70C 46.41hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 19:00:30,2021-11-07 19:00:30,32.66433,-108.27400,22,92,20019.57,"815TxC 38.90C 58.10hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 19:01:24,2021-11-07 19:01:24,32.66417,-108.27033,17,92,20036.94,"818TxC 34.30C 56.82hPa 7.00V 06S SpaceTREx SHAB-7V" +2021-11-07 19:02:00,2021-11-07 19:02:00,32.66400,-108.26783,26,93,19995.49,"820TxC 33.60C 57.16hPa 7.00V 06S SpaceTREx SHAB-7V" +2021-11-07 19:02:18,2021-11-07 19:02:18,32.66383,-108.26633,28,98,19964.40,"821TxC 16.90C 44.11hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:02:36,2021-11-07 19:02:36,32.66367,-108.26467,30,94,19941.84,"822TxC 25.70C 52.63hPa 7.01V 06S SpaceTREx SHAB-7V" +2021-11-07 19:03:13,2021-11-07 19:03:13,32.66333,-108.26100,33,97,19936.97,"824TxC 30.60C 56.85hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 19:03:30,2021-11-07 19:03:30,32.66317,-108.25917,33,92,19954.34,"825TxC 28.90C 56.31hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 19:03:49,2021-11-07 19:03:49,32.66300,-108.25750,30,95,19936.36,"826TxC 26.80C 55.55hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 19:04:25,2021-11-07 19:04:25,32.66267,-108.25433,28,93,19973.85,"828TxC 24.60C 54.82hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:04:42,2021-11-07 19:04:42,32.66267,-108.25283,28,93,19971.41,"829TxC 22.80C 54.28hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:05:00,2021-11-07 19:05:00,32.66250,-108.25133,28,96,19954.04,"830TxC 21.10C 53.83hPa 7.01V 07" +2021-11-07 19:05:18,2021-11-07 19:05:18,32.66250,-108.24967,30,98,19946.42,"831TxC 19.60C 53.47hPa 7.01V 09" +2021-11-07 19:05:55,2021-11-07 19:05:55,32.66200,-108.24650,30,98,19933.62,"833TxC 17.00C 52.78hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:06:30,2021-11-07 19:06:30,32.66167,-108.24317,31,98,19938.80,"835TxC 14.90C 52.00hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:07:07,2021-11-07 19:07:07,32.66117,-108.23983,31,93,19941.54,"837TxC 12.20C 51.12hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:08:19,2021-11-07 19:08:19,32.66017,-108.23267,35,99,19888.50,"841TxC 11.10C 51.70hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:08:36,2021-11-07 19:08:36,32.65983,-108.23083,35,92,19851.32,"842TxC 11.40C 51.67hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:08:54,2021-11-07 19:08:54,32.65950,-108.22900,37,101,19859.55,"843TxC 12.50C 52.22hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:09:31,2021-11-07 19:09:31,32.65917,-108.22517,35,101,19870.22,"845TxC 12.20C 52.00hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:10:06,2021-11-07 19:10:06,32.65850,-108.22117,37,101,19894.91,"847TxC 12.20C 52.25hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:10:25,2021-11-07 19:10:25,32.65817,-108.21950,31,106,19916.55,"848TxC -3.00C 33.87hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:10:43,2021-11-07 19:10:43,32.65783,-108.21767,31,101,19958.91,"849TxC 15.50C 52.74hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:11:18,2021-11-07 19:11:18,32.65733,-108.21417,35,102,19953.73,"851TxC 14.60C 52.26hPa 7.01V 06S SpaceTREx SHAB-7V" +2021-11-07 19:11:36,2021-11-07 19:11:36,32.65717,-108.21233,35,99,19943.67,"852TxC 13.90C 52.10hPa 7.01V 06S SpaceTREx SHAB-7V" +2021-11-07 19:11:54,2021-11-07 19:11:54,32.65683,-108.21050,37,97,19933.92,"853TxC 12.90C 51.80hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:12:31,2021-11-07 19:12:31,32.65600,-108.20650,37,101,19891.55,"855TxC 11.00C 51.34hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:12:48,2021-11-07 19:12:48,32.65583,-108.20450,39,98,19894.91,"856TxC 11.00C 51.47hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:13:06,2021-11-07 19:13:06,32.65550,-108.20233,39,98,19910.45,"857TxC 10.80C 51.28hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:13:25,2021-11-07 19:13:25,32.65533,-108.20033,37,101,19934.83,"858TxC 10.70C 51.15hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:13:43,2021-11-07 19:13:43,32.65500,-108.19850,33,102,19940.02,"859TxC 13.60C 52.35hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:14:00,2021-11-07 19:14:01,32.65467,-108.19667,31,107,19936.05,"860TxC 14.20C 52.41hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:14:18,2021-11-07 19:14:18,32.65433,-108.19500,33,102,19957.39,"861TxC 13.20C 51.89hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:14:36,2021-11-07 19:14:36,32.65417,-108.19333,33,101,19957.69,"862TxC 13.00C 51.93hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 19:14:55,2021-11-07 19:14:55,32.65383,-108.19150,37,102,19950.68,"863TxC -4.40C 38.54hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:15:30,2021-11-07 19:15:30,32.65317,-108.18750,35,97,19892.47,"865TxC 14.50C 52.81hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 19:15:48,2021-11-07 19:15:48,32.65283,-108.18567,35,96,19894.30,"866TxC 13.20C 52.26hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:16:06,2021-11-07 19:16:06,32.65267,-108.18367,37,94,19920.51,"867TxC 12.70C 51.95hPa 7.01V 08" +2021-11-07 19:16:25,2021-11-07 19:16:25,32.65250,-108.18167,37,99,19942.15,"868TxC -11.30C 99.37hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:17:01,2021-11-07 19:17:01,32.65183,-108.17800,35,104,19943.67,"870TxC 18.60C 55.03hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:18:12,2021-11-07 19:18:12,32.65083,-108.17083,33,99,19985.74,"874TxC 15.20C 52.50hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:18:31,2021-11-07 19:18:31,32.65067,-108.16900,31,94,19987.26,"875TxC 13.60C 51.64hPa 7.01V 06S SpaceTREx SHAB-7V" +2021-11-07 19:18:48,2021-11-07 19:18:48,32.65050,-108.16750,31,96,19992.44,"876TxC 15.50C 52.41hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:19:06,2021-11-07 19:19:06,32.65033,-108.16583,30,94,19992.75,"877TxC 14.20C 51.93hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:19:24,2021-11-07 19:19:24,32.65000,-108.16433,31,96,19987.87,"878TxC 13.20C 51.57hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:19:42,2021-11-07 19:19:42,32.64967,-108.16267,31,103,19958.91,"879TxC 12.60C 51.44hPa 7.01V 06S SpaceTREx SHAB-7V" +2021-11-07 19:20:00,2021-11-07 19:20:00,32.64950,-108.16083,33,97,19973.85,"880TxC 10.80C 50.70hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:20:18,2021-11-07 19:20:18,32.64933,-108.15900,33,102,19971.11,"881TxC 11.60C 51.17hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:20:36,2021-11-07 19:20:36,32.64900,-108.15717,33,98,19968.67,"882TxC 10.50C 50.71hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:20:54,2021-11-07 19:20:54,32.64867,-108.15533,33,102,19982.08,"883TxC 10.10C 50.53hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:21:13,2021-11-07 19:21:13,32.64833,-108.15367,31,105,19987.26,"884TxC -0.50C 41.23hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:21:30,2021-11-07 19:21:30,32.64817,-108.15217,26,98,19992.75,"885TxC 14.10C 52.05hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:21:48,2021-11-07 19:21:48,32.64783,-108.15067,28,98,19991.22,"886TxC 13.10C 51.63hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:22:24,2021-11-07 19:22:24,32.64733,-108.14767,28,97,19988.17,"888TxC 12.70C 51.61hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:22:42,2021-11-07 19:22:42,32.64700,-108.14600,30,104,19962.57,"889TxC 1.30C 42.40hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:23:37,2021-11-07 19:23:37,32.64600,-108.14100,33,101,19979.94,"892TxC 20.70C 54.84hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 19:23:55,2021-11-07 19:23:55,32.64567,-108.13933,28,106,19988.48,"893TxC 18.90C 53.90hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 19:24:12,2021-11-07 19:24:12,32.64533,-108.13800,30,101,19985.43,"894TxC 17.20C 53.23hPa 7.01V 07" +2021-11-07 19:24:48,2021-11-07 19:24:48,32.64483,-108.13483,30,100,19980.25,"896TxC 15.20C 52.45hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:25:24,2021-11-07 19:25:24,32.64433,-108.13167,31,96,19959.83,"898TxC 13.50C 52.02hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:25:42,2021-11-07 19:25:42,32.64400,-108.13000,30,102,19937.58,"899TxC 12.30C 51.72hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:26:00,2021-11-07 19:26:01,32.64367,-108.12833,31,102,19926.00,"900TxC 11.10C 51.32hPa 7.01V 07S SpaceTREx SHAB-7V" +2021-11-07 19:26:19,2021-11-07 19:26:19,32.64333,-108.12650,33,100,19931.18,"901TxC 9.70C 50.79hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:26:37,2021-11-07 19:26:37,32.64317,-108.12483,35,104,19926.30,"902TxC 10.50C 51.27hPa 7.01V 06S SpaceTREx SHAB-7V" +2021-11-07 19:26:54,2021-11-07 19:26:54,32.64267,-108.12300,33,101,19925.69,"903TxC 10.00C 51.00hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:27:12,2021-11-07 19:27:12,32.64250,-108.12133,26,99,19941.54,"904TxC 9.60C 50.84hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:27:48,2021-11-07 19:27:49,32.64200,-108.11833,28,103,19933.62,"906TxC 13.00C 51.97hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:28:06,2021-11-07 19:28:06,32.64167,-108.11683,28,98,19961.96,"907TxC 12.20C 51.67hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:28:42,2021-11-07 19:28:42,32.64117,-108.11383,33,107,19938.19,"909TxC 12.90C 52.23hPa 7.01V 08" +2021-11-07 19:29:00,2021-11-07 19:29:00,32.64100,-108.11217,33,104,19918.68,"910TxC 10.40C 50.95hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 19:29:18,2021-11-07 19:29:18,32.64050,-108.11033,37,104,19911.97,"911TxC 13.00C 52.52hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:29:37,2021-11-07 19:29:37,32.64017,-108.10833,37,105,19884.24,"912TxC 14.90C 53.39hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:29:55,2021-11-07 19:29:55,32.63983,-108.10633,37,100,19913.19,"913TxC 14.40C 53.14hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 19:31:07,2021-11-07 19:31:07,32.63850,-108.09883,31,104,19982.99,"917TxC 14.70C 52.75hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:31:24,2021-11-07 19:31:24,32.63817,-108.09717,31,101,19958.30,"918TxC 13.30C 52.14hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 19:31:42,2021-11-07 19:31:42,32.63783,-108.09550,31,99,19954.65,"919TxC 15.50C 53.04hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:32:00,2021-11-07 19:32:00,32.63750,-108.09383,33,107,19953.73,"920TxC 17.80C 54.16hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:32:18,2021-11-07 19:32:18,32.63717,-108.09200,37,101,19943.98,"921TxC 12.60C 51.67hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:32:54,2021-11-07 19:32:55,32.63650,-108.08817,41,102,19907.71,"923TxC 17.80C 54.53hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:33:30,2021-11-07 19:33:30,32.63583,-108.08400,37,99,19906.49,"925TxC 14.80C 53.25hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 19:33:48,2021-11-07 19:33:48,32.63550,-108.08200,37,99,19911.36,"926TxC 14.40C 53.01hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:34:24,2021-11-07 19:34:24,32.63483,-108.07817,35,100,19923.86,"928TxC 13.00C 52.25hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 19:34:42,2021-11-07 19:34:42,32.63450,-108.07633,35,99,19911.67,"929TxC 12.40C 52.02hPa 7.01V 12" +2021-11-07 19:35:00,2021-11-07 19:35:00,32.63417,-108.07433,39,99,19927.21,"930TxC 11.70C 51.77hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:35:18,2021-11-07 19:35:19,32.63383,-108.07233,39,100,19917.16,"931TxC 11.10C 51.57hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:35:36,2021-11-07 19:35:37,32.63350,-108.07017,37,100,19916.85,"932TxC 11.00C 51.64hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:35:54,2021-11-07 19:35:54,32.63333,-108.06817,37,99,19911.67,"933TxC 9.80C 51.15hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:36:12,2021-11-07 19:36:12,32.63300,-108.06617,39,99,19915.94,"934TxC 9.30C 50.91hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:36:30,2021-11-07 19:36:31,32.63267,-108.06417,35,96,19933.01,"935TxC 9.70C 51.01hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:36:48,2021-11-07 19:36:48,32.63233,-108.06217,33,96,19945.81,"936TxC 9.00C 50.54hPa 7.00V 10" +2021-11-07 19:37:06,2021-11-07 19:37:06,32.63217,-108.06050,33,102,19937.88,"937TxC 8.20C 50.32hPa 7.00V 08" +2021-11-07 19:37:24,2021-11-07 19:37:24,32.63183,-108.05867,33,99,19944.28,"938TxC 7.60C 50.09hPa 7.00V 09" +2021-11-07 19:37:42,2021-11-07 19:37:42,32.63167,-108.05667,37,101,19917.77,"939TxC 6.90C 49.82hPa 7.00V 10" +2021-11-07 19:38:00,2021-11-07 19:38:00,32.63133,-108.05483,37,99,19918.07,"940TxC 6.40C 49.77hPa 7.01V 11" +2021-11-07 19:38:18,2021-11-07 19:38:18,32.63100,-108.05283,37,102,19929.04,"941TxC 6.10C 49.68hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:38:36,2021-11-07 19:38:37,32.63067,-108.05083,37,100,19925.08,"942TxC 5.80C 49.58hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 19:38:54,2021-11-07 19:38:54,32.63033,-108.04867,37,100,19931.18,"943TxC 5.50C 49.43hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:39:12,2021-11-07 19:39:12,32.63000,-108.04667,37,99,19934.53,"944TxC 5.70C 49.53hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 19:39:30,2021-11-07 19:39:31,32.62967,-108.04483,37,100,19934.22,"945TxC 5.90C 49.64hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:39:48,2021-11-07 19:39:48,32.62933,-108.04283,37,103,19935.44,"946TxC 5.80C 49.56hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 19:40:06,2021-11-07 19:40:06,32.62900,-108.04083,37,101,19933.01,"947TxC 5.80C 49.56hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 19:40:24,2021-11-07 19:40:24,32.62867,-108.03883,37,102,19926.60,"948TxC 5.80C 49.67hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:40:42,2021-11-07 19:40:42,32.62833,-108.03683,39,102,19929.65,"949TxC 6.30C 49.94hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:41:18,2021-11-07 19:41:18,32.62767,-108.03300,37,101,19921.73,"951TxC -10.90C 83.60hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 19:41:36,2021-11-07 19:41:36,32.62733,-108.03083,39,100,19913.50,"952TxC -4.80C 37.05hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:41:54,2021-11-07 19:41:54,32.62700,-108.02883,41,100,19909.54,"953TxC -11.10C 101.37hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 19:42:30,2021-11-07 19:42:30,32.62650,-108.02467,37,98,19898.87,"955TxC 17.40C 54.60hPa 7.00V 09" +2021-11-07 19:42:48,2021-11-07 19:42:49,32.62633,-108.02283,37,96,19901.00,"956TxC 16.10C 53.88hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:43:06,2021-11-07 19:43:06,32.62617,-108.02083,37,95,19912.58,"957TxC 15.60C 53.58hPa 7.01V 12" +2021-11-07 19:43:43,2021-11-07 19:43:43,32.62550,-108.01667,39,103,19956.48,"959TxC 17.40C 53.99hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:44:00,2021-11-07 19:44:00,32.62517,-108.01467,37,102,19983.60,"960TxC 16.20C 53.29hPa 7.00V 11" +2021-11-07 19:44:18,2021-11-07 19:44:18,32.62483,-108.01267,35,102,19979.34,"961TxC 15.20C 52.88hPa 7.01V 11" +2021-11-07 19:44:36,2021-11-07 19:44:36,32.62450,-108.01067,39,99,19964.10,"962TxC 14.20C 52.48hPa 7.00V 11" +2021-11-07 19:44:54,2021-11-07 19:44:55,32.62417,-108.00867,39,100,19950.07,"963TxC 12.80C 52.10hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 19:45:12,2021-11-07 19:45:12,32.62400,-108.00667,37,99,19931.48,"964TxC 12.20C 52.00hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:45:30,2021-11-07 19:45:30,32.62367,-108.00467,37,96,19924.47,"965TxC 11.60C 51.90hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 19:45:48,2021-11-07 19:45:48,32.62350,-108.00267,37,100,19916.24,"966TxC 11.60C 51.89hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:46:06,2021-11-07 19:46:06,32.62317,-108.00067,37,103,19926.00,"967TxC 11.10C 51.75hPa 7.01V 12" +2021-11-07 19:46:24,2021-11-07 19:46:24,32.62267,-107.99867,39,103,19920.20,"968TxC -14.70C 73.57hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 19:47:00,2021-11-07 19:47:00,32.62200,-107.99450,37,99,19932.09,"970TxC 13.80C 52.89hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:47:18,2021-11-07 19:47:18,32.62167,-107.99250,37,101,19926.30,"971TxC 12.80C 52.42hPa 7.01V 12" +2021-11-07 19:47:36,2021-11-07 19:47:36,32.62133,-107.99067,37,98,19912.89,"972TxC 11.90C 52.09hPa 7.01V 12" +2021-11-07 19:47:54,2021-11-07 19:47:54,32.62100,-107.98850,41,102,19921.73,"973TxC 11.10C 51.74hPa 7.01V 12" +2021-11-07 19:48:12,2021-11-07 19:48:12,32.62083,-107.98633,39,99,19927.21,"974TxC 10.40C 51.45hPa 7.00V 10" +2021-11-07 19:48:30,2021-11-07 19:48:30,32.62050,-107.98433,39,99,19930.26,"975TxC 10.10C 51.29hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:49:06,2021-11-07 19:49:06,32.61983,-107.98017,39,102,19945.50,"977TxC 9.70C 51.06hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:49:24,2021-11-07 19:49:24,32.61950,-107.97800,39,100,19952.51,"978TxC 9.40C 50.87hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 19:49:42,2021-11-07 19:49:42,32.61917,-107.97600,41,102,19958.91,"979TxC 9.10C 50.68hPa 7.00V 11" +2021-11-07 19:50:00,2021-11-07 19:50:00,32.61883,-107.97383,39,99,19955.56,"980TxC 8.70C 50.60hPa 7.00V 10" +2021-11-07 19:50:18,2021-11-07 19:50:18,32.61850,-107.97183,39,99,19947.33,"981TxC 7.90C 50.28hPa 7.00V 11" +2021-11-07 19:50:36,2021-11-07 19:50:36,32.61817,-107.96983,37,99,19945.81,"982TxC 7.10C 50.09hPa 7.00V 11" +2021-11-07 19:50:54,2021-11-07 19:50:54,32.61800,-107.96783,35,96,19933.31,"983TxC 7.60C 50.34hPa 7.00V 11" +2021-11-07 19:51:12,2021-11-07 19:51:12,32.61783,-107.96583,35,93,19935.14,"984TxC 7.60C 50.41hPa 7.00V 11" +2021-11-07 19:51:30,2021-11-07 19:51:30,32.61767,-107.96383,35,93,19936.05,"985TxC 7.70C 50.39hPa 7.00V 10" +2021-11-07 19:51:48,2021-11-07 19:51:50,32.61733,-107.96200,37,96,19946.42,"986TxC 7.70C 50.33hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:52:24,2021-11-07 19:52:25,32.61667,-107.95783,39,99,19968.06,"988TxC 11.20C 51.78hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:52:42,2021-11-07 19:52:42,32.61633,-107.95600,37,102,19985.43,"989TxC 10.30C 51.31hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:53:00,2021-11-07 19:53:00,32.61600,-107.95417,35,103,19986.96,"990TxC 9.40C 50.83hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 19:53:18,2021-11-07 19:53:18,32.61567,-107.95217,35,102,19977.20,"991TxC 8.90C 50.52hPa 7.01V 12" +2021-11-07 19:53:36,2021-11-07 19:53:36,32.61533,-107.95033,33,102,19970.80,"992TxC 7.80C 50.13hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 19:53:55,2021-11-07 19:53:55,32.61517,-107.94850,33,99,19979.64,"993TxC -9.80C 38.61hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 19:54:13,2021-11-07 19:54:13,32.61483,-107.94667,35,102,19983.30,"994TxC 2.30C 43.22hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 19:54:31,2021-11-07 19:54:31,32.61450,-107.94483,35,99,19978.73,"995TxC 1.40C 37.69hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 19:55:06,2021-11-07 19:55:06,32.61383,-107.94083,37,101,19975.07,"997TxC 22.70C 56.00hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 19:55:24,2021-11-07 19:55:24,32.61367,-107.93900,35,101,19976.90,"998TxC 23.50C 56.02hPa 7.00V 10" +2021-11-07 19:55:42,2021-11-07 19:55:42,32.61333,-107.93717,35,97,19981.16,"999TxC 21.70C 54.78hPa 7.00V 09" +2021-11-07 19:56:00,2021-11-07 19:56:00,32.61317,-107.93533,31,98,19986.65,"100TxC 19.90C 54.17hPa 7.00V 11" +2021-11-07 19:56:18,2021-11-07 19:56:18,32.61283,-107.93350,33,100,19976.90,"100TxC 18.40C 53.73hPa 7.00V 12" +2021-11-07 19:56:38,2021-11-07 19:56:38,32.61250,-107.93150,35,100,19960.44,"100TxC 17.00C 53.35hPa 7.00V 12" +2021-11-07 19:56:56,2021-11-07 19:56:56,32.61233,-107.92967,35,101,19958.61,"100TxC 15.80C 53.03hPa 7.01V 11" +2021-11-07 19:57:14,2021-11-07 19:57:14,32.61200,-107.92783,33,100,19928.13,"100TxC 14.80C 52.82hPa 7.01V 12" +2021-11-07 19:57:32,2021-11-07 19:57:32,32.61167,-107.92583,37,100,19913.50,"100TxC 13.70C 52.60hPa 7.00V 12" +2021-11-07 19:57:50,2021-11-07 19:57:50,32.61133,-107.92383,37,97,19897.95,"100TxC 12.50C 52.28hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:58:08,2021-11-07 19:58:08,32.61100,-107.92183,39,99,19883.63,"100TxC 11.30C 51.95hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:58:26,2021-11-07 19:58:26,32.61083,-107.91967,41,98,19895.52,"100TxC 9.90C 51.37hPa 7.01V 09S SpaceTREx SHAB-7V" +2021-11-07 19:58:44,2021-11-07 19:58:44,32.61050,-107.91767,37,96,19886.68,"100TxC 9.50C 51.32hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 19:59:02,2021-11-07 19:59:02,32.61033,-107.91550,39,97,19894.91,"101TxC 10.00C 51.48hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 19:59:20,2021-11-07 19:59:20,32.61000,-107.91350,39,99,19920.20,"101TxC 9.90C 51.32hPa 7.01V 11" +2021-11-07 19:59:39,2021-11-07 19:59:39,32.60967,-107.91133,39,99,19944.89,"101TxC -12.60C 66.23hPa 7.01V 12S SpaceTREx SHAB-7V" +2021-11-07 19:59:57,2021-11-07 19:59:57,32.60950,-107.90933,35,96,19938.80,"101TxC 13.50C 52.65hPa 7.01V 08S SpaceTREx SHAB-7V" +2021-11-07 20:00:14,2021-11-07 20:00:14,32.60933,-107.90733,35,98,19940.93,"101TxC 12.30C 52.03hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 20:00:32,2021-11-07 20:00:32,32.60917,-107.90550,35,94,19946.72,"101TxC 11.80C 51.76hPa 7.00V 12" +2021-11-07 20:00:51,2021-11-07 20:00:51,32.60900,-107.90367,31,100,19944.59,"101TxC -15.10C 100.81hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:01:09,2021-11-07 20:01:09,32.60867,-107.90183,33,98,19932.09,"101TxC 1.40C 38.75hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 20:01:45,2021-11-07 20:01:45,32.60817,-107.89800,37,100,19890.03,"101TxC 8.30C 43.14hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 20:02:02,2021-11-07 20:02:02,32.60783,-107.89600,39,101,19871.44,"102TxC 23.10C 56.93hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 20:02:20,2021-11-07 20:02:20,32.60767,-107.89400,37,101,19877.84,"102TxC 26.10C 57.50hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:02:38,2021-11-07 20:02:38,32.60733,-107.89200,35,100,19882.41,"102TxC 24.40C 56.53hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:02:56,2021-11-07 20:02:56,32.60717,-107.89033,33,94,19909.54,"102TxC 21.60C 55.25hPa 7.00V 09" +2021-11-07 20:03:33,2021-11-07 20:03:33,32.60683,-107.88683,28,92,19928.43,"102TxC 21.00C 54.99hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:03:51,2021-11-07 20:03:51,32.60667,-107.88533,24,95,19956.48,"102TxC 19.40C 54.21hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:04:08,2021-11-07 20:04:08,32.60650,-107.88383,30,103,19952.51,"102TxC 19.80C 54.43hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:04:45,2021-11-07 20:04:45,32.60600,-107.88050,35,98,19926.00,"102TxC 11.20C 46.65hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 20:05:20,2021-11-07 20:05:20,32.60550,-107.87633,39,98,19902.83,"103TxC 15.60C 48.14hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 20:05:38,2021-11-07 20:05:38,32.60533,-107.87433,39,95,19918.07,"103TxC 28.60C 57.81hPa 7.00V 09" +2021-11-07 20:05:56,2021-11-07 20:05:56,32.60517,-107.87233,35,92,19931.79,"103TxC 26.80C 56.60hPa 7.00V 08" +2021-11-07 20:06:14,2021-11-07 20:06:14,32.60500,-107.87050,35,97,19942.15,"103TxC 24.50C 55.73hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:06:33,2021-11-07 20:06:33,32.60483,-107.86850,31,91,19933.92,"103TxC 13.50C 42.47hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:06:50,2021-11-07 20:06:50,32.60467,-107.86683,33,100,19931.18,"103TxC 27.30C 56.55hPa 7.00V 06" +2021-11-07 20:07:08,2021-11-07 20:07:08,32.60450,-107.86500,33,94,19948.86,"103TxC 25.10C 55.80hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:07:26,2021-11-07 20:07:26,32.60433,-107.86317,33,100,19947.33,"103TxC 23.60C 55.35hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:07:44,2021-11-07 20:07:44,32.60417,-107.86133,35,98,19947.03,"103TxC 22.10C 54.85hPa 7.00V 08" +2021-11-07 20:08:02,2021-11-07 20:08:03,32.60400,-107.85950,35,98,19933.92,"104TxC 20.50C 54.41hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:08:20,2021-11-07 20:08:21,32.60383,-107.85767,35,96,19918.68,"104TxC 19.10C 54.06hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 20:08:38,2021-11-07 20:08:38,32.60367,-107.85567,39,98,19908.62,"104TxC 17.60C 53.66hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 20:09:14,2021-11-07 20:09:14,32.60317,-107.85150,41,98,19884.85,"104TxC 14.70C 52.79hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:09:32,2021-11-07 20:09:32,32.60300,-107.84933,41,95,19878.75,"104TxC 14.20C 52.78hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:09:50,2021-11-07 20:09:50,32.60283,-107.84717,41,97,19886.68,"104TxC 13.90C 52.70hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:10:08,2021-11-07 20:10:08,32.60267,-107.84500,41,93,19889.42,"104TxC 13.70C 52.55hPa 7.00V 10" +2021-11-07 20:10:26,2021-11-07 20:10:26,32.60250,-107.84283,41,95,19896.43,"104TxC 13.40C 52.49hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:10:44,2021-11-07 20:10:44,32.60233,-107.84067,41,95,19906.18,"104TxC 12.80C 52.12hPa 7.01V 10S SpaceTREx SHAB-7V" +2021-11-07 20:11:38,2021-11-07 20:11:38,32.60183,-107.83400,39,88,19892.47,"105TxC 10.00C 51.22hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 20:11:56,2021-11-07 20:11:56,32.60183,-107.83183,39,92,19897.34,"105TxC 10.00C 51.22hPa 7.01V 11S SpaceTREx SHAB-7V" +2021-11-07 20:12:14,2021-11-07 20:12:14,32.60183,-107.82983,39,92,19903.44,"105TxC 9.90C 51.21hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:12:50,2021-11-07 20:12:50,32.60167,-107.82550,39,91,19923.56,"105TxC 9.80C 50.97hPa 7.00V 08" +2021-11-07 20:13:08,2021-11-07 20:13:08,32.60150,-107.82333,39,94,19940.93,"105TxC 12.00C 52.39hPa 7.00V 10" +2021-11-07 20:13:26,2021-11-07 20:13:26,32.60133,-107.82133,35,94,19965.92,"105TxC 11.80C 51.44hPa 7.00V 12S SpaceTREx SHAB-7V" +2021-11-07 20:13:45,2021-11-07 20:13:45,32.60117,-107.81950,33,96,19979.64,"105TxC 9.80C 50.54hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 20:14:03,2021-11-07 20:14:03,32.60100,-107.81750,33,93,19968.36,"106TxC 3.00C 42.79hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:14:38,2021-11-07 20:14:38,32.60067,-107.81367,33,95,19980.55,"106TxC 16.30C 53.11hPa 7.00V 09" +2021-11-07 20:15:15,2021-11-07 20:15:15,32.60033,-107.80983,37,97,19978.12,"106TxC 2.60C 64.03hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:15:51,2021-11-07 20:15:51,32.59983,-107.80583,39,96,19951.60,"106TxC 6.70C 42.90hPa 7.00V 11S SpaceTREx SHAB-7V" +2021-11-07 20:16:27,2021-11-07 20:16:27,32.59950,-107.80133,43,93,19922.64,"106TxC 16.90C 48.95hPa 7.00V 07" +2021-11-07 20:17:02,2021-11-07 20:17:02,32.59900,-107.79700,39,94,19940.02,"107TxC 30.80C 57.84hPa 7.00V 09" +2021-11-07 20:17:20,2021-11-07 20:17:20,32.59883,-107.79500,37,94,19964.40,"107TxC 28.90C 56.76hPa 7.00V 09" +2021-11-07 20:17:38,2021-11-07 20:17:38,32.59883,-107.79300,37,91,19971.72,"107TxC 4.60C 108.08hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:17:56,2021-11-07 20:17:56,32.59867,-107.79117,33,95,19972.02,"107TxC 26.50C 56.00hPa 7.00V 08" +2021-11-07 20:18:14,2021-11-07 20:18:14,32.59867,-107.78933,31,93,19969.28,"107TxC 14.90C 47.55hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:18:32,2021-11-07 20:18:32,32.59867,-107.78767,31,92,19971.11,"107TxC 23.60C 55.06hPa 7.00V 10" +2021-11-07 20:18:50,2021-11-07 20:18:50,32.59850,-107.78600,31,95,19970.50,"107TxC 22.00C 54.64hPa 7.00V 09" +2021-11-07 20:19:08,2021-11-07 20:19:08,32.59850,-107.78417,35,94,19943.06,"107TxC 20.60C 54.28hPa 7.00V 09" +2021-11-07 20:19:26,2021-11-07 20:19:26,32.59817,-107.78217,39,98,19931.18,"107TxC 19.50C 54.06hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:19:44,2021-11-07 20:19:44,32.59800,-107.78000,41,95,19926.60,"107TxC 17.70C 54.02hPa 7.00V 10" +2021-11-07 20:20:02,2021-11-07 20:20:03,32.59783,-107.77783,41,97,19933.62,"108TxC 17.50C 53.43hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 20:20:20,2021-11-07 20:20:20,32.59767,-107.77567,39,97,19945.20,"108TxC 16.80C 52.93hPa 7.00V 10" +2021-11-07 20:20:38,2021-11-07 20:20:38,32.59733,-107.77350,41,98,19975.98,"108TxC 16.00C 52.52hPa 7.00V 09" +2021-11-07 20:20:57,2021-11-07 20:20:57,32.59717,-107.77150,37,89,19991.83,"108TxC 5.30C 41.42hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:21:14,2021-11-07 20:21:14,32.59700,-107.76950,35,97,19993.66,"108TxC 21.80C 55.12hPa 7.00V 09" +2021-11-07 20:21:32,2021-11-07 20:21:32,32.59683,-107.76750,35,94,20001.89,"108TxC 20.50C 54.02hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 20:21:50,2021-11-07 20:21:50,32.59667,-107.76567,33,94,20013.47,"108TxC 19.30C 53.49hPa 7.00V 11" +2021-11-07 20:22:26,2021-11-07 20:22:27,32.59633,-107.76217,35,96,20007.99,"108TxC 14.70C 48.60hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:22:45,2021-11-07 20:22:45,32.59617,-107.76033,31,95,20002.80,"108TxC 11.10C 45.08hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:23:02,2021-11-07 20:23:02,32.59600,-107.75850,31,99,19997.01,"109TxC 21.90C 54.60hPa 7.00V 08" +2021-11-07 20:23:20,2021-11-07 20:23:20,32.59583,-107.75683,33,97,19987.87,"109TxC 22.20C 54.87hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:23:38,2021-11-07 20:23:38,32.59550,-107.75483,35,101,19973.85,"109TxC 11.90C 46.83hPa 7.00V 09" +2021-11-07 20:24:14,2021-11-07 20:24:14,32.59483,-107.75083,37,98,19943.37,"109TxC 23.20C 55.67hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:24:32,2021-11-07 20:24:32,32.59467,-107.74883,39,94,19921.12,"109TxC 21.60C 55.15hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:24:50,2021-11-07 20:24:50,32.59433,-107.74683,39,98,19914.72,"109TxC 19.20C 54.24hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:25:08,2021-11-07 20:25:08,32.59400,-107.74467,39,103,19911.67,"109TxC 18.90C 54.23hPa 7.00V 09" +2021-11-07 20:25:27,2021-11-07 20:25:27,32.59367,-107.74267,39,100,19922.64,"109TxC 17.50C 53.74hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:25:44,2021-11-07 20:25:44,32.59333,-107.74100,30,101,19911.36,"109TxC 19.60C 54.61hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:26:02,2021-11-07 20:26:02,32.59317,-107.73917,31,97,19916.24,"110TxC 19.60C 54.64hPa 7.00V 07" +2021-11-07 20:26:20,2021-11-07 20:26:20,32.59283,-107.73750,33,105,19908.01,"110TxC 18.00C 54.10hPa 7.00V 07" +2021-11-07 20:26:40,2021-11-07 20:26:40,32.59250,-107.73567,33,103,19885.76,"110TxC 16.60C 53.69hPa 7.00V 09" +2021-11-07 20:26:58,2021-11-07 20:26:58,32.59200,-107.73383,35,103,19879.36,"110TxC 15.50C 53.31hPa 7.00V 08" +2021-11-07 20:27:16,2021-11-07 20:27:16,32.59167,-107.73183,39,102,19877.23,"110TxC 14.20C 52.85hPa 7.00V 10S SpaceTREx SHAB-7V" +2021-11-07 20:27:34,2021-11-07 20:27:35,32.59133,-107.72983,35,100,19876.62,"110TxC 14.70C 53.16hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:27:52,2021-11-07 20:27:52,32.59083,-107.72783,39,104,19883.93,"110TxC 13.60C 52.79hPa 7.00V 07" +2021-11-07 20:28:10,2021-11-07 20:28:10,32.59050,-107.72583,39,100,19887.59,"110TxC 13.60C 52.71hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:28:28,2021-11-07 20:28:28,32.59017,-107.72367,37,101,19890.33,"110TxC 13.30C 52.50hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:28:46,2021-11-07 20:28:46,32.58983,-107.72183,37,104,19896.12,"110TxC 12.60C 52.18hPa 7.00V 08" +2021-11-07 20:29:22,2021-11-07 20:29:22,32.58900,-107.71817,31,102,19893.69,"111TxC 14.00C 52.93hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:29:40,2021-11-07 20:29:40,32.58867,-107.71633,31,103,19896.43,"111TxC 12.50C 52.29hPa 7.00V 08" +2021-11-07 20:29:58,2021-11-07 20:29:58,32.58833,-107.71467,33,101,19891.25,"111TxC 12.10C 52.19hPa 7.00V 10" +2021-11-07 20:31:28,2021-11-07 20:31:28,32.58650,-107.70633,31,107,19927.52,"111TxC 21.00C 56.49hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 20:31:46,2021-11-07 20:31:47,32.58617,-107.70467,33,104,19930.57,"111TxC 24.10C 56.52hPa 7.00V 08S SpaceTREx SHAB-7V" +2021-11-07 20:32:04,2021-11-07 20:32:05,32.58583,-107.70300,30,113,19963.18,"112TxC 21.30C 55.01hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 20:32:22,2021-11-07 20:32:22,32.58550,-107.70150,30,107,19966.23,"112TxC 20.10C 54.44hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:32:40,2021-11-07 20:32:40,32.58517,-107.70000,28,99,19967.75,"112TxC 19.00C 53.99hPa 6.98V 07" +2021-11-07 20:32:58,2021-11-07 20:32:58,32.58483,-107.69867,26,107,19979.34,"112TxC 17.90C 53.66hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:33:16,2021-11-07 20:33:16,32.58450,-107.69717,26,108,19949.46,"112TxC 16.50C 53.21hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:33:34,2021-11-07 20:33:34,32.58417,-107.69583,26,112,19937.27,"112TxC 15.30C 52.84hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:33:52,2021-11-07 20:33:52,32.58367,-107.69433,30,105,19925.39,"112TxC 15.30C 53.07hPa 7.00V 07" +2021-11-07 20:34:10,2021-11-07 20:34:11,32.58333,-107.69283,30,100,19915.94,"112TxC 16.40C 53.66hPa 7.00V 07S SpaceTREx SHAB-7V" +2021-11-07 20:34:29,2021-11-07 20:34:29,32.58300,-107.69133,28,105,19917.46,"112TxC 8.40C 45.89hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:34:46,2021-11-07 20:34:47,32.58267,-107.68983,28,105,19913.80,"112TxC 8.30C 47.57hPa 6.98V 08S SpaceTREx SHAB-7V" +2021-11-07 20:35:04,2021-11-07 20:35:04,32.58233,-107.68850,28,104,19915.63,"113TxC 1.00C 88.23hPa 6.98V 08" +2021-11-07 20:35:22,2021-11-07 20:35:22,32.58200,-107.68700,28,107,19919.90,"113TxC 19.80C 54.90hPa 6.98V 07" +2021-11-07 20:35:40,2021-11-07 20:35:40,32.58167,-107.68550,30,106,19924.17,"113TxC 5.00C 69.38hPa 7.00V 09" +2021-11-07 20:35:59,2021-11-07 20:35:59,32.58117,-107.68383,31,107,19919.90,"113TxC 10.80C 58.25hPa 6.98V 08S SpaceTREx SHAB-7V" +2021-11-07 20:36:17,2021-11-07 20:36:17,32.58083,-107.68233,30,107,19929.96,"113TxC 13.90C 50.29hPa 7.00V 09S SpaceTREx SHAB-7V" +2021-11-07 20:36:35,2021-11-07 20:36:35,32.58033,-107.68050,33,106,19933.62,"113TxC 17.50C 49.02hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:37:28,2021-11-07 20:37:28,32.57900,-107.67500,35,107,19967.14,"113TxC 29.60C 53.00hPa 6.98V 08" +2021-11-07 20:37:46,2021-11-07 20:37:46,32.57850,-107.67317,33,105,19980.55,"113TxC 34.80C 57.99hPa 6.98V 07" +2021-11-07 20:38:04,2021-11-07 20:38:04,32.57817,-107.67150,31,105,20003.11,"114TxC 31.40C 56.81hPa 6.98V 07" +2021-11-07 20:38:23,2021-11-07 20:38:23,32.57783,-107.66983,33,102,20011.95,"114TxC 28.30C 52.78hPa 6.98V 08S SpaceTREx SHAB-7V" +2021-11-07 20:38:40,2021-11-07 20:38:41,32.57750,-107.66817,31,106,20019.26,"114TxC 35.60C 57.84hPa 6.98V 08S SpaceTREx SHAB-7V" +2021-11-07 20:38:58,2021-11-07 20:38:58,32.57717,-107.66667,31,98,20019.26,"114TxC 34.00C 57.31hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:39:16,2021-11-07 20:39:16,32.57683,-107.66517,28,106,20009.51,"114TxC 30.80C 56.34hPa 6.98V 07" +2021-11-07 20:39:53,2021-11-07 20:39:53,32.57617,-107.66217,28,101,19995.79,"114TxC 32.40C 57.30hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:40:10,2021-11-07 20:40:10,32.57567,-107.66050,30,101,20003.11,"114TxC 34.10C 57.54hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:40:47,2021-11-07 20:40:47,32.57517,-107.65783,24,100,20018.65,"114TxC 24.90C 49.69hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:41:04,2021-11-07 20:41:04,32.57500,-107.65650,24,101,20037.86,"115TxC 31.80C 56.45hPa 6.98V 06" +2021-11-07 20:41:22,2021-11-07 20:41:22,32.57483,-107.65533,22,98,20046.09,"115TxC 30.20C 55.88hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:41:40,2021-11-07 20:41:40,32.57467,-107.65417,22,94,20054.01,"115TxC 22.90C 49.35hPa 6.98V 08S SpaceTREx SHAB-7V" +2021-11-07 20:41:58,2021-11-07 20:41:58,32.57450,-107.65283,22,97,20050.35,"115TxC 30.40C 56.96hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:42:16,2021-11-07 20:42:16,32.57433,-107.65150,26,91,20049.44,"115TxC 32.10C 56.50hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:42:34,2021-11-07 20:42:34,32.57417,-107.65017,26,101,20034.81,"115TxC 28.70C 54.12hPa 6.98V 07" +2021-11-07 20:43:28,2021-11-07 20:43:29,32.57317,-107.64583,26,102,20047.00,"115TxC 35.50C 57.19hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:43:47,2021-11-07 20:43:47,32.57283,-107.64450,24,101,20064.37,"115TxC 27.70C 49.44hPa 6.98V 05S SpaceTREx SHAB-7V" +2021-11-07 20:44:04,2021-11-07 20:44:04,32.57267,-107.64317,19,94,20077.18,"116TxC 35.10C 56.90hPa 6.98V 05S SpaceTREx SHAB-7V" +2021-11-07 20:44:22,2021-11-07 20:44:22,32.57267,-107.64183,22,99,20100.95,"116TxC 33.00C 56.10hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:44:40,2021-11-07 20:44:40,32.57250,-107.64067,22,98,20093.94,"116TxC 31.30C 55.60hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:44:59,2021-11-07 20:44:59,32.57250,-107.63933,24,94,20084.49,"116TxC 25.10C 49.87hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:45:34,2021-11-07 20:45:35,32.57233,-107.63650,26,93,20034.81,"116TxC 35.30C 57.38hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:45:53,2021-11-07 20:45:53,32.57217,-107.63500,26,99,20040.90,"116TxC 29.50C 52.02hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:46:11,2021-11-07 20:46:11,32.57200,-107.63350,26,97,20041.82,"116TxC 29.40C 51.20hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:46:28,2021-11-07 20:46:28,32.57183,-107.63217,24,91,20059.50,"116TxC 37.20C 57.58hPa 6.98V 08" +2021-11-07 20:46:46,2021-11-07 20:46:46,32.57183,-107.63100,24,88,20063.46,"116TxC 33.90C 56.45hPa 6.98V 07" +2021-11-07 20:47:04,2021-11-07 20:47:04,32.57183,-107.62950,24,90,20062.55,"117TxC 31.80C 55.86hPa 6.98V 06" +2021-11-07 20:47:22,2021-11-07 20:47:22,32.57183,-107.62817,26,90,20054.62,"117TxC 29.50C 55.21hPa 6.98V 07" +2021-11-07 20:47:40,2021-11-07 20:47:40,32.57183,-107.62683,28,93,20030.24,"117TxC 27.40C 54.82hPa 6.98V 07" +2021-11-07 20:47:58,2021-11-07 20:47:58,32.57167,-107.62517,28,103,20030.85,"117TxC 25.60C 54.35hPa 6.98V 06" +2021-11-07 20:48:16,2021-11-07 20:48:16,32.57133,-107.62367,30,96,20029.63,"117TxC 26.00C 54.69hPa 6.98V 06" +2021-11-07 20:48:34,2021-11-07 20:48:34,32.57117,-107.62200,30,93,20015.00,"117TxC 25.80C 55.42hPa 6.98V 07" +2021-11-07 20:48:52,2021-11-07 20:48:52,32.57100,-107.62033,30,101,20001.59,"117TxC 25.40C 54.44hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:49:10,2021-11-07 20:49:10,32.57067,-107.61883,30,100,20029.02,"117TxC 23.80C 53.86hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:49:28,2021-11-07 20:49:28,32.57067,-107.61717,28,95,20032.68,"117TxC 14.30C 51.07hPa 6.98V 07" +2021-11-07 20:49:46,2021-11-07 20:49:46,32.57050,-107.61567,26,92,20040.60,"117TxC 24.00C 53.93hPa 6.98V 06" +2021-11-07 20:50:04,2021-11-07 20:50:05,32.57050,-107.61417,26,96,20043.04,"118TxC 22.50C 53.49hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:50:22,2021-11-07 20:50:22,32.57050,-107.61267,28,89,20018.35,"118TxC 17.10C 48.36hPa 6.98V 08S SpaceTREx SHAB-7V" +2021-11-07 20:50:40,2021-11-07 20:50:41,32.57050,-107.61117,26,90,20023.53,"118TxC 18.90C 48.18hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:50:58,2021-11-07 20:50:58,32.57050,-107.60967,28,90,20022.62,"118TxC 14.80C 49.85hPa 6.98V 07" +2021-11-07 20:51:16,2021-11-07 20:51:16,32.57050,-107.60833,28,89,19999.45,"118TxC 25.70C 54.96hPa 6.98V 06" +2021-11-07 20:51:34,2021-11-07 20:51:34,32.57033,-107.60667,30,96,19985.43,"118TxC 24.10C 54.54hPa 6.98V 07" +2021-11-07 20:51:52,2021-11-07 20:51:52,32.57017,-107.60500,30,100,19988.48,"118TxC 22.90C 54.26hPa 6.98V 07" +2021-11-07 20:52:10,2021-11-07 20:52:10,32.57000,-107.60333,30,99,19980.86,"118TxC 22.30C 54.10hPa 6.98V 06" +2021-11-07 20:52:28,2021-11-07 20:52:28,32.56967,-107.60167,33,100,19964.10,"118TxC 5.90C 46.27hPa 6.98V 07" +2021-11-07 20:52:47,2021-11-07 20:52:47,32.56950,-107.60000,33,102,19978.12,"118TxC 22.20C 54.16hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:53:04,2021-11-07 20:53:04,32.56933,-107.59833,31,95,19988.78,"119TxC 22.30C 54.19hPa 6.98V 06" +2021-11-07 20:53:23,2021-11-07 20:53:23,32.56900,-107.59650,31,93,19990.61,"119TxC 18.50C 48.24hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:53:41,2021-11-07 20:53:41,32.56900,-107.59483,30,90,19988.48,"119TxC 25.00C 51.93hPa 6.98V 06" +2021-11-07 20:53:59,2021-11-07 20:53:59,32.56883,-107.59300,31,94,19981.77,"119TxC 24.10C 50.54hPa 6.98V 06" +2021-11-07 20:54:17,2021-11-07 20:54:17,32.56867,-107.59133,33,99,19956.17,"119TxC 26.20C 50.85hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:54:35,2021-11-07 20:54:35,32.56850,-107.58950,35,98,19960.13,"119TxC 30.30C 53.36hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 20:55:10,2021-11-07 20:55:10,32.56800,-107.58583,35,97,19993.05,"119TxC 35.40C 53.96hPa 6.98V 06" +2021-11-07 20:55:28,2021-11-07 20:55:28,32.56767,-107.58400,33,97,20013.47,"119TxC 38.00C 57.88hPa 6.98V 08" +2021-11-07 20:55:46,2021-11-07 20:55:46,32.56767,-107.58217,33,93,20036.64,"119TxC 34.50C 56.64hPa 6.98V 06" +2021-11-07 20:56:22,2021-11-07 20:56:22,32.56767,-107.57883,31,95,20051.27,"120TxC 32.40C 56.01hPa 6.98V 06" +2021-11-07 20:56:42,2021-11-07 20:56:42,32.56767,-107.57700,30,93,20042.73,"120TxC 30.10C 55.36hPa 6.98V 08" +2021-11-07 20:57:00,2021-11-07 20:57:00,32.56750,-107.57533,31,96,20027.49,"120TxC 28.00C 54.83hPa 6.98V 07" +2021-11-07 20:57:18,2021-11-07 20:57:18,32.56733,-107.57367,31,98,20023.23,"120TxC 26.20C 54.52hPa 6.98V 08" +2021-11-07 20:57:36,2021-11-07 20:57:36,32.56700,-107.57183,35,101,20023.23,"120TxC 24.60C 54.15hPa 6.98V 06" +2021-11-07 20:57:54,2021-11-07 20:57:54,32.56683,-107.57000,33,105,19998.54,"120TxC 23.30C 53.84hPa 6.98V 08" +2021-11-07 20:58:12,2021-11-07 20:58:12,32.56667,-107.56817,33,103,19991.83,"120TxC 21.80C 53.44hPa 6.98V 06" +2021-11-07 20:58:30,2021-11-07 20:58:30,32.56633,-107.56650,31,98,19998.54,"120TxC 20.90C 53.10hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:58:49,2021-11-07 20:58:49,32.56617,-107.56483,30,96,20016.83,"120TxC 17.20C 49.54hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 20:59:06,2021-11-07 20:59:06,32.56600,-107.56333,28,86,20002.50,"121TxC 23.20C 54.04hPa 6.98V 06" +2021-11-07 20:59:24,2021-11-07 20:59:24,32.56600,-107.56167,30,90,20001.28,"121TxC 22.00C 53.63hPa 6.98V 06" +2021-11-07 20:59:42,2021-11-07 20:59:42,32.56600,-107.56000,31,95,19991.22,"121TxC 21.10C 53.35hPa 6.98V 06" +2021-11-07 21:00:00,2021-11-07 21:00:00,32.56567,-107.55833,30,97,19982.08,"121TxC 20.00C 53.06hPa 6.98V 06" +2021-11-07 21:00:18,2021-11-07 21:00:18,32.56550,-107.55667,31,101,19968.67,"121TxC 18.70C 52.77hPa 6.98V 08" +2021-11-07 21:00:36,2021-11-07 21:00:36,32.56517,-107.55500,31,102,19964.40,"121TxC 18.40C 52.83hPa 6.96V 07" +2021-11-07 21:00:54,2021-11-07 21:00:54,32.56483,-107.55333,31,103,19966.23,"121TxC 15.00C 50.48hPa 6.96V 07" +2021-11-07 21:01:12,2021-11-07 21:01:12,32.56450,-107.55167,30,102,19968.36,"121TxC 5.00C 43.76hPa 6.98V 07" +2021-11-07 21:01:30,2021-11-07 21:01:30,32.56417,-107.55000,31,104,19985.74,"121TxC 4.70C 47.37hPa 6.98V 07" +2021-11-07 21:02:06,2021-11-07 21:02:06,32.56350,-107.54667,30,103,19981.77,"122TxC 21.30C 50.39hPa 6.98V 07" +2021-11-07 21:02:24,2021-11-07 21:02:24,32.56317,-107.54517,31,105,19971.41,"122TxC 20.80C 50.22hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:02:42,2021-11-07 21:02:42,32.56267,-107.54350,31,102,19942.76,"122TxC 29.60C 56.65hPa 6.98V 07" +2021-11-07 21:03:00,2021-11-07 21:03:00,32.56233,-107.54167,33,108,19928.43,"122TxC 13.40C 102.62hPa 6.98V 07" +2021-11-07 21:03:18,2021-11-07 21:03:18,32.56183,-107.54000,33,108,19910.76,"122TxC 23.40C 52.66hPa 6.98V 07" +2021-11-07 21:03:36,2021-11-07 21:03:36,32.56133,-107.53817,33,110,19907.40,"122TxC 26.40C 53.08hPa 6.98V 07" +2021-11-07 21:03:54,2021-11-07 21:03:54,32.56083,-107.53633,33,109,19913.80,"122TxC 24.00C 76.01hPa 6.98V 07" +2021-11-07 21:04:12,2021-11-07 21:04:12,32.56033,-107.53450,33,106,19922.34,"122TxC 36.30C 58.47hPa 6.98V 07" +2021-11-07 21:04:30,2021-11-07 21:04:30,32.55983,-107.53267,33,111,19946.42,"122TxC 34.70C 57.80hPa 6.98V 07" +2021-11-07 21:04:49,2021-11-07 21:04:49,32.55933,-107.53100,35,108,19968.97,"122TxC 16.80C 101.41hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:05:24,2021-11-07 21:05:24,32.55867,-107.52783,28,102,19976.90,"123TxC 33.10C 53.90hPa 6.98V 06" +2021-11-07 21:05:42,2021-11-07 21:05:42,32.55833,-107.52617,31,104,19999.45,"123TxC 37.20C 57.81hPa 6.98V 07" +2021-11-07 21:06:00,2021-11-07 21:06:00,32.55800,-107.52450,28,100,20005.24,"123TxC 33.70C 54.01hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:06:18,2021-11-07 21:06:18,32.55783,-107.52300,28,98,20017.13,"123TxC 36.40C 57.32hPa 6.98V 07" +2021-11-07 21:06:36,2021-11-07 21:06:38,32.55767,-107.52167,28,100,20030.85,"123TxC 35.00C 56.91hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:07:13,2021-11-07 21:07:13,32.55733,-107.51867,28,104,20008.60,"123TxC 33.30C 56.50hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:07:30,2021-11-07 21:07:30,32.55717,-107.51733,30,100,19988.78,"123TxC 34.40C 57.06hPa 6.98V 07" +2021-11-07 21:07:48,2021-11-07 21:07:49,32.55683,-107.51583,30,102,19980.86,"123TxC 35.00C 57.42hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:08:25,2021-11-07 21:08:25,32.55617,-107.51250,31,107,19976.90,"124TxC 32.90C 56.89hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:08:42,2021-11-07 21:08:42,32.55583,-107.51100,31,103,19973.24,"124TxC 32.50C 56.57hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:09:00,2021-11-07 21:09:00,32.55550,-107.50933,28,98,19995.79,"124TxC 32.70C 56.69hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:09:18,2021-11-07 21:09:18,32.55533,-107.50783,26,97,20006.46,"124TxC 33.00C 56.56hPa 6.98V 07" +2021-11-07 21:09:36,2021-11-07 21:09:36,32.55517,-107.50617,30,98,20025.06,"124TxC 29.50C 55.28hPa 6.98V 07" +2021-11-07 21:10:13,2021-11-07 21:10:13,32.55500,-107.50317,28,89,20037.25,"124TxC 23.80C 51.34hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:10:49,2021-11-07 21:10:49,32.55483,-107.50000,28,88,20023.84,"124TxC 32.00C 53.45hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:11:07,2021-11-07 21:11:07,32.55467,-107.49850,30,96,20014.69,"125TxC 33.70C 53.91hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:11:43,2021-11-07 21:11:43,32.55433,-107.49517,28,94,20004.94,"125TxC 36.90C 53.48hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:12:00,2021-11-07 21:12:00,32.55400,-107.49350,30,97,20014.69,"125TxC 40.40C 55.00hPa 6.96V 07" +2021-11-07 21:12:19,2021-11-07 21:12:19,32.55383,-107.49183,31,96,20020.48,"125TxC 34.30C 55.08hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:12:54,2021-11-07 21:12:54,32.55383,-107.48867,31,100,20031.15,"125TxC 42.80C 58.15hPa 6.96V 06" +2021-11-07 21:13:12,2021-11-07 21:13:12,32.55383,-107.48717,28,95,20025.06,"125TxC 39.60C 57.47hPa 6.98V 06" +2021-11-07 21:13:30,2021-11-07 21:13:30,32.55383,-107.48567,30,93,20000.37,"125TxC 36.70C 56.90hPa 6.98V 07" +2021-11-07 21:13:48,2021-11-07 21:13:48,32.55367,-107.48400,31,97,19975.07,"125TxC 36.30C 57.14hPa 6.98V 07" +2021-11-07 21:14:06,2021-11-07 21:14:06,32.55350,-107.48250,31,99,19960.13,"126TxC 33.20C 56.56hPa 6.96V 07" +2021-11-07 21:14:24,2021-11-07 21:14:24,32.55333,-107.48067,31,100,19961.96,"126TxC 35.70C 57.37hPa 6.96V 07" +2021-11-07 21:14:42,2021-11-07 21:14:42,32.55300,-107.47900,31,96,19959.52,"126TxC 35.40C 57.21hPa 6.96V 07" +2021-11-07 21:15:00,2021-11-07 21:15:00,32.55283,-107.47733,31,99,19958.61,"126TxC 32.30C 56.18hPa 6.98V 07" +2021-11-07 21:15:18,2021-11-07 21:15:18,32.55250,-107.47567,35,104,19973.54,"126TxC 29.30C 55.30hPa 6.98V 06" +2021-11-07 21:15:36,2021-11-07 21:15:36,32.55233,-107.47400,31,100,19972.32,"126TxC 27.50C 54.76hPa 6.98V 07" +2021-11-07 21:15:55,2021-11-07 21:15:55,32.55217,-107.47233,31,101,19990.00,"126TxC 24.50C 52.08hPa 6.98V 06" +2021-11-07 21:16:12,2021-11-07 21:16:12,32.55217,-107.47083,26,86,19986.04,"126TxC 25.90C 51.07hPa 6.98V 06" +2021-11-07 21:16:30,2021-11-07 21:16:30,32.55217,-107.46917,28,88,20000.67,"126TxC 22.80C 51.60hPa 6.96V 07" +2021-11-07 21:16:48,2021-11-07 21:16:48,32.55217,-107.46750,30,89,20014.39,"126TxC 31.90C 55.98hPa 6.96V 07" +2021-11-07 21:17:06,2021-11-07 21:17:06,32.55200,-107.46583,33,99,20011.64,"127TxC 29.60C 55.26hPa 6.96V 07" +2021-11-07 21:17:24,2021-11-07 21:17:24,32.55200,-107.46433,31,98,19998.23,"127TxC 27.90C 54.84hPa 6.98V 07" +2021-11-07 21:17:42,2021-11-07 21:17:42,32.55167,-107.46250,33,106,19992.44,"127TxC 26.20C 54.36hPa 6.98V 06" +2021-11-07 21:18:00,2021-11-07 21:18:00,32.55150,-107.46100,30,94,19974.15,"127TxC 24.90C 54.06hPa 6.98V 06" +2021-11-07 21:18:18,2021-11-07 21:18:18,32.55133,-107.45933,31,101,19959.52,"127TxC 23.50C 53.70hPa 6.98V 06" +2021-11-07 21:18:36,2021-11-07 21:18:36,32.55100,-107.45767,33,106,19957.08,"127TxC 21.80C 53.29hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 21:18:54,2021-11-07 21:18:54,32.55067,-107.45600,33,104,19934.83,"127TxC 20.40C 53.08hPa 6.98V 06" +2021-11-07 21:19:12,2021-11-07 21:19:12,32.55050,-107.45417,35,104,19908.01,"127TxC 18.70C 52.68hPa 6.98V 07" +2021-11-07 21:19:30,2021-11-07 21:19:30,32.55000,-107.45233,35,102,19884.85,"127TxC 20.40C 53.66hPa 6.98V 07" +2021-11-07 21:20:06,2021-11-07 21:20:06,32.54900,-107.44833,39,108,19905.88,"128TxC 18.50C 52.88hPa 6.98V 07" +2021-11-07 21:20:25,2021-11-07 21:20:25,32.54867,-107.44650,30,98,19919.59,"128TxC 15.60C 49.27hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 21:20:42,2021-11-07 21:20:43,32.54833,-107.44483,26,100,19940.93,"128TxC 22.60C 54.10hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:21:00,2021-11-07 21:21:00,32.54800,-107.44317,30,95,19946.11,"128TxC 12.10C 76.53hPa 6.96V 07" +2021-11-07 21:21:18,2021-11-07 21:21:18,32.54783,-107.44133,33,102,19968.06,"128TxC 23.00C 53.98hPa 6.98V 07" +2021-11-07 21:21:36,2021-11-07 21:21:36,32.54750,-107.43950,35,100,19981.16,"128TxC 21.80C 53.43hPa 6.96V 07" +2021-11-07 21:21:54,2021-11-07 21:21:54,32.54717,-107.43767,33,103,19974.46,"128TxC 20.70C 53.05hPa 6.98V 07" +2021-11-07 21:22:12,2021-11-07 21:22:12,32.54667,-107.43583,39,108,19979.34,"128TxC 19.50C 52.59hPa 6.98V 07" +2021-11-07 21:22:30,2021-11-07 21:22:30,32.54633,-107.43400,37,105,19970.80,"128TxC 18.30C 52.20hPa 6.98V 07" +2021-11-07 21:22:48,2021-11-07 21:22:48,32.54600,-107.43217,39,104,19955.56,"128TxC 16.90C 51.81hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 21:23:06,2021-11-07 21:23:06,32.54567,-107.43017,39,102,19940.63,"129TxC 15.40C 51.43hPa 6.98V 07" +2021-11-07 21:23:24,2021-11-07 21:23:24,32.54517,-107.42800,41,102,19934.22,"129TxC 13.80C 51.04hPa 6.98V 07" +2021-11-07 21:23:42,2021-11-07 21:23:42,32.54500,-107.42600,39,103,19917.16,"129TxC 13.50C 51.12hPa 6.98V 07" +2021-11-07 21:24:00,2021-11-07 21:24:00,32.54450,-107.42400,39,102,19926.30,"129TxC 13.20C 51.02hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 21:24:18,2021-11-07 21:24:18,32.54417,-107.42183,37,103,19927.82,"129TxC 12.80C 50.82hPa 6.98V 07" +2021-11-07 21:24:36,2021-11-07 21:24:36,32.54383,-107.41983,35,100,19949.16,"129TxC 6.60C 45.85hPa 6.98V 06" +2021-11-07 21:24:54,2021-11-07 21:24:54,32.54367,-107.41783,37,97,19958.00,"129TxC 13.80C 51.10hPa 6.98V 06" +2021-11-07 21:25:12,2021-11-07 21:25:12,32.54333,-107.41600,33,96,19970.80,"129TxC 3.40C 49.72hPa 6.98V 06" +2021-11-07 21:25:30,2021-11-07 21:25:31,32.54317,-107.41417,35,100,19964.40,"129TxC 2.10C 54.30hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 21:25:48,2021-11-07 21:25:49,32.54300,-107.41250,33,96,19953.43,"129TxC 7.40C 55.59hPa 6.98V 06S SpaceTREx SHAB-7V" +2021-11-07 21:26:06,2021-11-07 21:26:07,32.54267,-107.41050,33,98,19941.54,"130TxC 13.70C 50.35hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:26:25,2021-11-07 21:26:25,32.54233,-107.40833,37,100,19938.49,"130TxC 19.50C 51.16hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:26:42,2021-11-07 21:26:43,32.54200,-107.40633,39,101,19928.43,"130TxC 24.80C 53.31hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:27:00,2021-11-07 21:27:01,32.54183,-107.40433,35,96,19922.34,"130TxC 28.40C 54.11hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:27:18,2021-11-07 21:27:18,32.54150,-107.40233,37,100,19925.08,"130TxC 30.80C 56.77hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:27:36,2021-11-07 21:27:36,32.54133,-107.40050,35,99,19933.92,"130TxC 28.40C 55.92hPa 6.96V 07" +2021-11-07 21:27:54,2021-11-07 21:27:55,32.54117,-107.39867,35,99,19937.58,"130TxC 25.90C 55.03hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:28:12,2021-11-07 21:28:12,32.54100,-107.39683,33,95,19951.90,"130TxC 26.80C 55.26hPa 6.96V 06" +2021-11-07 21:28:30,2021-11-07 21:28:31,32.54117,-107.39500,31,90,19980.25,"130TxC 24.00C 53.88hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:28:48,2021-11-07 21:28:48,32.54117,-107.39350,30,83,19990.00,"130TxC 25.20C 55.41hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:29:06,2021-11-07 21:29:06,32.54133,-107.39167,31,95,19992.44,"131TxC 23.80C 53.93hPa 6.96V 06" +2021-11-07 21:29:24,2021-11-07 21:29:24,32.54133,-107.39017,30,87,20005.85,"131TxC 22.10C 53.21hPa 6.96V 07" +2021-11-07 21:29:42,2021-11-07 21:29:42,32.54133,-107.38833,33,94,20003.11,"131TxC 20.70C 52.79hPa 6.98V 07" +2021-11-07 21:30:00,2021-11-07 21:30:00,32.54133,-107.38667,33,96,20009.21,"131TxC 19.30C 52.39hPa 6.98V 06" +2021-11-07 21:31:12,2021-11-07 21:31:12,32.54083,-107.37933,35,99,19979.03,"131TxC 14.10C 50.77hPa 6.98V 07" +2021-11-07 21:31:30,2021-11-07 21:31:31,32.54067,-107.37733,35,98,19972.63,"131TxC 13.00C 50.48hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:31:48,2021-11-07 21:31:48,32.54050,-107.37550,37,96,19958.61,"131TxC 11.60C 50.12hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 21:32:06,2021-11-07 21:32:06,32.54033,-107.37350,37,99,19941.24,"132TxC 10.20C 49.71hPa 6.98V 08" +2021-11-07 21:32:24,2021-11-07 21:32:24,32.54000,-107.37150,35,98,19929.96,"132TxC 10.40C 49.89hPa 6.98V 07S SpaceTREx SHAB-7V" +2021-11-07 21:32:42,2021-11-07 21:32:42,32.53983,-107.36967,35,98,19944.89,"132TxC 9.50C 49.46hPa 6.98V 07" +2021-11-07 21:33:00,2021-11-07 21:33:00,32.53967,-107.36783,33,95,19958.91,"132TxC 6.70C 46.21hPa 6.98V 07" +2021-11-07 21:33:18,2021-11-07 21:33:18,32.53950,-107.36600,31,90,19980.86,"132TxC 8.00C 47.84hPa 6.98V 08" +2021-11-07 21:33:36,2021-11-07 21:33:36,32.53950,-107.36450,31,93,20005.85,"132TxC 15.10C 51.39hPa 6.96V 08" +2021-11-07 21:33:54,2021-11-07 21:33:54,32.53950,-107.36267,33,86,20016.52,"132TxC 18.00C 52.52hPa 6.96V 07" +2021-11-07 21:34:13,2021-11-07 21:34:13,32.53967,-107.36100,31,85,20015.30,"132TxC 13.30C 48.22hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 21:34:30,2021-11-07 21:34:31,32.53967,-107.35917,33,88,20000.98,"132TxC 20.20C 53.68hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:34:49,2021-11-07 21:34:49,32.53967,-107.35733,35,91,19983.91,"132TxC 17.70C 50.39hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:35:24,2021-11-07 21:35:25,32.53950,-107.35350,35,93,19968.36,"133TxC 28.70C 54.24hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:35:42,2021-11-07 21:35:42,32.53933,-107.35150,33,88,19959.22,"133TxC 31.80C 54.78hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:36:00,2021-11-07 21:36:00,32.53933,-107.34967,31,89,19961.35,"133TxC 31.90C 56.72hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:36:18,2021-11-07 21:36:19,32.53933,-107.34800,31,87,19946.42,"133TxC 28.10C 56.10hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:36:37,2021-11-07 21:36:37,32.53933,-107.34617,39,90,19932.70,"133TxC 32.50C 57.27hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:36:55,2021-11-07 21:36:55,32.53933,-107.34450,31,92,19910.15,"133TxC 27.60C 53.26hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:37:12,2021-11-07 21:37:13,32.53933,-107.34283,33,89,19897.04,"133TxC 29.50C 55.44hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:37:30,2021-11-07 21:37:31,32.53917,-107.34100,31,93,19889.72,"133TxC 35.50C 58.51hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:37:48,2021-11-07 21:37:48,32.53917,-107.33933,30,93,19898.87,"133TxC 38.70C 59.90hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:38:06,2021-11-07 21:38:06,32.53917,-107.33767,31,92,19920.20,"134TxC 36.70C 58.07hPa 6.96V 08" +2021-11-07 21:38:24,2021-11-07 21:38:24,32.53917,-107.33617,30,86,19942.45,"134TxC 32.60C 56.68hPa 6.96V 07" +2021-11-07 21:38:42,2021-11-07 21:38:43,32.53933,-107.33467,28,82,19956.17,"134TxC 27.90C 53.35hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:39:00,2021-11-07 21:39:00,32.53950,-107.33317,28,85,19963.18,"134TxC 28.90C 55.03hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:39:18,2021-11-07 21:39:18,32.53950,-107.33167,24,87,19960.44,"134TxC 34.10C 54.83hPa 6.96V 07" +2021-11-07 21:39:36,2021-11-07 21:39:37,32.53967,-107.33017,28,86,19932.09,"134TxC 34.40C 54.49hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:39:55,2021-11-07 21:39:55,32.53967,-107.32867,30,94,19929.65,"134TxC 34.30C 56.67hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:40:12,2021-11-07 21:40:12,32.53950,-107.32700,33,98,19909.23,"134TxC 38.10C 56.05hPa 6.96V 08" +2021-11-07 21:40:30,2021-11-07 21:40:31,32.53917,-107.32533,33,99,19909.23,"134TxC 41.90C 56.96hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:40:49,2021-11-07 21:40:49,32.53883,-107.32350,31,100,19917.77,"134TxC 42.90C 56.85hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:41:07,2021-11-07 21:41:07,32.53867,-107.32183,31,97,19933.92,"135TxC 45.40C 57.12hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 21:41:24,2021-11-07 21:41:24,32.53850,-107.32017,28,98,19945.20,"135TxC 44.20C 57.08hPa 6.95V 07" +2021-11-07 21:41:43,2021-11-07 21:41:44,32.53833,-107.31850,30,91,19947.94,"135TxC 42.00C 61.81hPa 6.96V 05S SpaceTREx SHAB-7V" +2021-11-07 21:42:02,2021-11-07 21:42:02,32.53833,-107.31683,30,95,19949.77,"135TxC 43.80C 57.80hPa 6.96V 07" +2021-11-07 21:42:20,2021-11-07 21:42:20,32.53833,-107.31533,28,97,19958.61,"135TxC 46.00C 59.06hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 21:42:38,2021-11-07 21:42:38,32.53817,-107.31383,28,92,19957.08,"135TxC 42.90C 58.31hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:42:56,2021-11-07 21:42:56,32.53817,-107.31233,28,88,19958.91,"135TxC 35.30C 55.99hPa 6.96V 08" +2021-11-07 21:43:14,2021-11-07 21:43:14,32.53817,-107.31083,24,88,19957.39,"135TxC 43.00C 58.40hPa 6.96V 07" +2021-11-07 21:43:32,2021-11-07 21:43:33,32.53817,-107.30950,24,88,19955.56,"135TxC 41.60C 57.71hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:43:50,2021-11-07 21:43:50,32.53817,-107.30817,24,84,19958.91,"135TxC 41.50C 58.10hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:44:08,2021-11-07 21:44:08,32.53833,-107.30683,22,82,19958.00,"136TxC 38.50C 57.41hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:44:26,2021-11-07 21:44:26,32.53850,-107.30550,24,84,19922.03,"136TxC 36.10C 57.01hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:45:02,2021-11-07 21:45:02,32.53850,-107.30267,26,94,19883.32,"136TxC 35.90C 58.12hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:45:20,2021-11-07 21:45:20,32.53833,-107.30100,30,98,19859.55,"136TxC 36.40C 57.44hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:45:38,2021-11-07 21:45:38,32.53817,-107.29933,33,100,19836.69,"136TxC 35.10C 56.01hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:45:56,2021-11-07 21:45:56,32.53783,-107.29750,37,100,19829.37,"136TxC 37.40C 58.48hPa 6.96V 07" +2021-11-07 21:46:14,2021-11-07 21:46:14,32.53750,-107.29550,33,100,19831.20,"136TxC 34.20C 57.50hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:46:32,2021-11-07 21:46:32,32.53733,-107.29367,37,98,19847.66,"136TxC 32.00C 56.76hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:46:50,2021-11-07 21:46:50,32.53700,-107.29183,31,102,19864.12,"136TxC 30.40C 56.15hPa 6.96V 07" +2021-11-07 21:47:08,2021-11-07 21:47:08,32.53683,-107.29000,33,97,19895.82,"137TxC 28.70C 55.46hPa 6.96V 07" +2021-11-07 21:47:26,2021-11-07 21:47:26,32.53667,-107.28833,30,94,19914.41,"137TxC 28.10C 55.23hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:47:44,2021-11-07 21:47:44,32.53667,-107.28683,31,94,19917.46,"137TxC 27.90C 55.14hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:48:02,2021-11-07 21:48:02,32.53650,-107.28517,30,96,19924.17,"137TxC 30.50C 56.15hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:48:20,2021-11-07 21:48:20,32.53633,-107.28333,31,94,19914.11,"137TxC 25.40C 52.59hPa 6.96V 06" +2021-11-07 21:48:38,2021-11-07 21:48:38,32.53617,-107.28167,30,97,19918.98,"137TxC 28.00C 55.25hPa 6.96V 06" +2021-11-07 21:48:56,2021-11-07 21:48:56,32.53617,-107.28017,28,83,19934.83,"137TxC 18.60C 59.32hPa 6.96V 06" +2021-11-07 21:49:14,2021-11-07 21:49:14,32.53617,-107.27850,28,83,19947.03,"137TxC 28.90C 55.35hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:49:32,2021-11-07 21:49:32,32.53617,-107.27700,28,85,19967.75,"137TxC 28.30C 54.40hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:49:50,2021-11-07 21:49:50,32.53633,-107.27567,26,84,19962.27,"137TxC 24.90C 52.07hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:50:08,2021-11-07 21:50:08,32.53650,-107.27417,28,86,19968.97,"138TxC 28.20C 54.91hPa 6.96V 07" +2021-11-07 21:50:26,2021-11-07 21:50:26,32.53650,-107.27267,26,84,19975.98,"138TxC 28.50C 55.06hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:50:44,2021-11-07 21:50:44,32.53667,-107.27133,24,87,19991.22,"138TxC 25.90C 53.99hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:51:02,2021-11-07 21:51:02,32.53683,-107.27000,26,85,20011.64,"138TxC 24.40C 53.41hPa 6.95V 06" +2021-11-07 21:51:20,2021-11-07 21:51:20,32.53700,-107.26850,26,79,20025.36,"138TxC 23.00C 52.88hPa 6.95V 07" +2021-11-07 21:51:38,2021-11-07 21:51:38,32.53733,-107.26700,30,73,20011.95,"138TxC 21.80C 52.52hPa 6.96V 07" +2021-11-07 21:51:56,2021-11-07 21:51:56,32.53750,-107.26567,26,75,20021.09,"138TxC 20.40C 51.99hPa 6.96V 07" +2021-11-07 21:52:14,2021-11-07 21:52:14,32.53783,-107.26433,26,73,20012.56,"138TxC 18.90C 51.55hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 21:52:32,2021-11-07 21:52:32,32.53817,-107.26283,26,75,20010.12,"138TxC 17.70C 51.24hPa 6.96V 05S SpaceTREx SHAB-7V" +2021-11-07 21:52:50,2021-11-07 21:52:50,32.53850,-107.26133,26,78,20000.37,"138TxC 16.10C 50.76hPa 6.96V 05" +2021-11-07 21:53:08,2021-11-07 21:53:08,32.53883,-107.25983,28,82,20007.38,"139TxC 15.00C 50.36hPa 6.96V 06" +2021-11-07 21:53:26,2021-11-07 21:53:26,32.53900,-107.25817,28,82,19995.79,"139TxC 14.10C 50.11hPa 6.96V 05" +2021-11-07 21:53:44,2021-11-07 21:53:44,32.53917,-107.25667,30,86,19979.64,"139TxC 14.50C 50.71hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:54:02,2021-11-07 21:54:02,32.53917,-107.25500,30,85,19975.07,"139TxC 12.90C 50.48hPa 6.96V 06" +2021-11-07 21:54:20,2021-11-07 21:54:20,32.53933,-107.25350,28,85,19973.85,"139TxC 16.60C 51.42hPa 6.96V 05S SpaceTREx SHAB-7V" +2021-11-07 21:54:38,2021-11-07 21:54:38,32.53933,-107.25200,28,87,19982.38,"139TxC 16.50C 52.30hPa 6.96V 05" +2021-11-07 21:55:14,2021-11-07 21:55:15,32.53950,-107.24883,28,85,19990.00,"139TxC 19.00C 50.62hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 21:55:32,2021-11-07 21:55:33,32.53933,-107.24717,28,89,19985.13,"139TxC 23.30C 52.72hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:55:50,2021-11-07 21:55:51,32.53933,-107.24567,28,91,19988.48,"139TxC 25.20C 52.53hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:56:08,2021-11-07 21:56:08,32.53933,-107.24433,26,88,19996.10,"140TxC 25.10C 53.95hPa 6.95V 05" +2021-11-07 21:56:26,2021-11-07 21:56:26,32.53933,-107.24283,24,83,20000.98,"140TxC 27.10C 54.60hPa 6.96V 06" +2021-11-07 21:56:44,2021-11-07 21:56:44,32.53950,-107.24167,24,79,20008.60,"140TxC 25.20C 53.97hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:57:02,2021-11-07 21:57:02,32.53967,-107.24033,26,83,19989.39,"140TxC 24.00C 53.73hPa 6.93V 05S SpaceTREx SHAB-7V" +2021-11-07 21:57:20,2021-11-07 21:57:21,32.53983,-107.23883,28,86,19959.83,"140TxC 23.00C 51.93hPa 6.95V 05S SpaceTREx SHAB-7V" +2021-11-07 21:57:38,2021-11-07 21:57:39,32.53967,-107.23750,26,95,19936.97,"140TxC 25.90C 53.40hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:57:56,2021-11-07 21:57:56,32.53950,-107.23600,28,99,19918.98,"140TxC 28.50C 54.22hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:58:14,2021-11-07 21:58:14,32.53933,-107.23433,33,103,19900.70,"140TxC 31.80C 56.15hPa 6.93V 04" +2021-11-07 21:58:32,2021-11-07 21:58:32,32.53900,-107.23283,30,100,19897.34,"140TxC 32.30C 55.56hPa 6.93V 06S SpaceTREx SHAB-7V" +2021-11-07 21:58:50,2021-11-07 21:58:51,32.53883,-107.23133,28,99,19913.50,"140TxC 31.70C 54.82hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:59:08,2021-11-07 21:59:08,32.53867,-107.22967,26,98,19928.74,"141TxC 33.20C 55.20hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 21:59:26,2021-11-07 21:59:27,32.53850,-107.22833,22,91,19939.71,"141TxC 32.10C 54.80hPa 6.93V 06S SpaceTREx SHAB-7V" +2021-11-07 22:00:02,2021-11-07 22:00:03,32.53833,-107.22533,30,97,19951.60,"141TxC 38.90C 55.99hPa 6.95V 05S SpaceTREx SHAB-7V" +2021-11-07 22:00:20,2021-11-07 22:00:20,32.53800,-107.22367,31,100,19949.77,"141TxC 41.70C 56.70hPa 6.93V 06" +2021-11-07 22:00:39,2021-11-07 22:00:40,32.53767,-107.22200,31,102,19950.38,"141TxC 45.50C 57.22hPa 6.93V 06S SpaceTREx SHAB-7V" +2021-11-07 22:00:58,2021-11-07 22:00:59,32.53733,-107.22000,33,100,19960.74,"141TxC 46.60C 56.95hPa 6.93V 06S SpaceTREx SHAB-7V" +2021-11-07 22:01:17,2021-11-07 22:01:18,32.53717,-107.21833,33,100,19979.94,"141TxC 47.50C 57.15hPa 6.93V 04S SpaceTREx SHAB-7V" +2021-11-07 22:01:36,2021-11-07 22:01:36,32.53700,-107.21650,30,93,19987.56,"141TxC 45.70C 57.92hPa 6.96V 07" +2021-11-07 22:01:55,2021-11-07 22:01:56,32.53683,-107.21500,28,99,19993.97,"141TxC 46.90C 57.26hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 22:02:14,2021-11-07 22:02:15,32.53667,-107.21317,30,99,19973.85,"142TxC 49.00C 59.02hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 22:02:33,2021-11-07 22:02:33,32.53650,-107.21150,46,104,19984.21,"142TxC 50.50C 59.47hPa 6.96V 07" +2021-11-07 22:02:52,2021-11-07 22:02:52,32.53617,-107.20967,33,99,19980.25,"142TxC 49.80C 58.17hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 22:03:12,2021-11-07 22:03:12,32.53600,-107.20800,30,99,19993.36,"142TxC 47.40C 56.66hPa 6.96V 05S SpaceTREx SHAB-7V" +2021-11-07 22:03:30,2021-11-07 22:03:31,32.53583,-107.20633,28,95,20004.02,"142TxC 45.50C 57.35hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:03:49,2021-11-07 22:03:49,32.53567,-107.20483,24,91,20029.93,"142TxC 45.90C 57.98hPa 6.96V 06S SpaceTREx SHAB-7V" +2021-11-07 22:04:07,2021-11-07 22:04:07,32.53583,-107.20333,31,88,20034.50,"142TxC 43.80C 57.51hPa 6.96V 06" +2021-11-07 22:04:25,2021-11-07 22:04:26,32.53583,-107.20167,30,89,20031.15,"142TxC 39.60C 55.15hPa 6.96V 07S SpaceTREx SHAB-7V" +2021-11-07 22:04:43,2021-11-07 22:04:44,32.53567,-107.20000,30,92,20021.09,"142TxC 42.10C 57.80hPa 6.95V 08S SpaceTREx SHAB-7V" +2021-11-07 22:05:01,2021-11-07 22:05:02,32.53567,-107.19833,33,93,20015.00,"142TxC 41.70C 55.41hPa 6.95V 08S SpaceTREx SHAB-7V" +2021-11-07 22:05:20,2021-11-07 22:05:20,32.53550,-107.19650,33,96,19998.54,"143TxC 43.90C 55.91hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:05:38,2021-11-07 22:05:39,32.53517,-107.19450,35,99,20016.52,"143TxC 45.60C 56.15hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:05:57,2021-11-07 22:05:57,32.53500,-107.19267,35,96,20042.12,"143TxC 46.50C 56.10hPa 6.95V 08" +2021-11-07 22:06:16,2021-11-07 22:06:16,32.53483,-107.19067,31,87,20048.22,"143TxC 40.80C 55.78hPa 6.95V 08" +2021-11-07 22:06:35,2021-11-07 22:06:35,32.53483,-107.18883,31,89,20059.19,"143TxC 44.70C 57.40hPa 6.95V 07" +2021-11-07 22:06:53,2021-11-07 22:06:53,32.53483,-107.18717,31,90,20064.68,"143TxC 41.50C 56.67hPa 6.95V 06" +2021-11-07 22:07:11,2021-11-07 22:07:11,32.53467,-107.18533,31,96,20046.09,"143TxC 38.60C 56.11hPa 6.95V 07" +2021-11-07 22:07:29,2021-11-07 22:07:29,32.53450,-107.18350,33,99,20034.20,"143TxC 35.90C 55.62hPa 6.95V 06" +2021-11-07 22:07:47,2021-11-07 22:07:47,32.53417,-107.18167,31,99,20018.04,"143TxC 33.30C 55.04hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:08:05,2021-11-07 22:08:05,32.53383,-107.18000,31,105,20007.07,"143TxC 30.40C 54.34hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:08:23,2021-11-07 22:08:23,32.53350,-107.17833,33,105,20010.73,"144TxC 27.90C 53.70hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:08:41,2021-11-07 22:08:41,32.53317,-107.17650,33,105,20000.06,"144TxC 26.40C 53.39hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:08:59,2021-11-07 22:08:59,32.53283,-107.17467,33,105,19994.27,"144TxC 24.90C 52.98hPa 6.95V 08" +2021-11-07 22:09:17,2021-11-07 22:09:17,32.53250,-107.17300,33,103,19996.40,"144TxC 23.20C 52.44hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:09:35,2021-11-07 22:09:36,32.53200,-107.17133,35,104,20000.37,"144TxC 22.50C 52.64hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:09:53,2021-11-07 22:09:53,32.53167,-107.16950,35,100,20007.07,"144TxC 25.00C 51.69hPa 6.95V 08" +2021-11-07 22:10:11,2021-11-07 22:10:11,32.53133,-107.16767,33,101,19999.76,"144TxC 28.60C 52.75hPa 6.95V 08" +2021-11-07 22:10:29,2021-11-07 22:10:29,32.53100,-107.16600,33,100,20001.89,"144TxC 30.10C 53.01hPa 6.95V 08" +2021-11-07 22:10:48,2021-11-07 22:10:48,32.53067,-107.16417,33,101,20008.60,"144TxC 31.90C 53.86hPa 6.95V 08S SpaceTREx SHAB-7V" +2021-11-07 22:11:05,2021-11-07 22:11:05,32.53033,-107.16250,35,103,20004.02,"144TxC 33.10C 55.18hPa 6.95V 07" +2021-11-07 22:11:25,2021-11-07 22:11:25,32.52983,-107.16033,35,103,20001.59,"145TxC 31.00C 58.66hPa 6.95V 09" +2021-11-07 22:11:43,2021-11-07 22:11:43,32.52950,-107.15850,37,105,20002.80,"145TxC 36.30C 56.39hPa 6.95V 05" +2021-11-07 22:12:01,2021-11-07 22:12:01,32.52917,-107.15667,35,100,20004.94,"145TxC 34.40C 55.83hPa 6.95V 06S SpaceTREx SHAB-7V" +2021-11-07 22:12:19,2021-11-07 22:12:19,32.52867,-107.15483,33,102,19992.44,"145TxC 32.00C 55.13hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:12:37,2021-11-07 22:12:37,32.52833,-107.15300,37,104,19991.53,"145TxC 29.90C 54.53hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:12:55,2021-11-07 22:12:55,32.52800,-107.15117,35,101,20000.98,"145TxC 27.50C 53.92hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:13:13,2021-11-07 22:13:13,32.52783,-107.14933,35,101,19985.13,"145TxC 25.20C 53.40hPa 6.96V 08" +2021-11-07 22:13:31,2021-11-07 22:13:31,32.52750,-107.14733,37,98,19971.11,"145TxC 22.80C 52.72hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:13:49,2021-11-07 22:13:49,32.52733,-107.14550,33,93,19954.95,"145TxC 20.10C 51.97hPa 6.96V 08S SpaceTREx SHAB-7V" +2021-11-07 22:14:25,2021-11-07 22:14:25,32.52733,-107.14183,33,93,19956.78,"146TxC 17.50C 51.38hPa 6.95V 08S SpaceTREx SHAB-7V" +2021-11-07 22:14:43,2021-11-07 22:14:43,32.52717,-107.14000,33,91,19940.02,"146TxC 17.10C 51.26hPa 6.95V 08S SpaceTREx SHAB-7V" +2021-11-07 22:15:01,2021-11-07 22:15:01,32.52717,-107.13817,31,91,19951.60,"146TxC 16.60C 51.11hPa 6.95V 08" +2021-11-07 22:15:19,2021-11-07 22:15:19,32.52700,-107.13633,31,90,19937.88,"146TxC 15.70C 50.76hPa 6.95V 07" +2021-11-07 22:15:37,2021-11-07 22:15:37,32.52700,-107.13450,33,93,19940.93,"146TxC 13.80C 50.10hPa 6.95V 09" +2021-11-07 22:15:55,2021-11-07 22:15:55,32.52683,-107.13267,33,90,19930.87,"146TxC 13.00C 49.96hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:16:13,2021-11-07 22:16:13,32.52683,-107.13100,31,88,19909.84,"146TxC 11.10C 49.43hPa 6.95V 08" +2021-11-07 22:16:31,2021-11-07 22:16:31,32.52683,-107.12917,31,89,19891.86,"146TxC 9.80C 49.19hPa 6.95V 07" +2021-11-07 22:16:49,2021-11-07 22:16:49,32.52700,-107.12733,33,87,19875.70,"146TxC 10.20C 49.55hPa 6.95V 08S SpaceTREx SHAB-7V" +2021-11-07 22:17:07,2021-11-07 22:17:07,32.52717,-107.12550,35,83,19875.40,"146TxC 9.80C 49.54hPa 6.96V 09" +2021-11-07 22:17:25,2021-11-07 22:17:25,32.52733,-107.12350,35,85,19858.33,"147TxC 9.50C 49.44hPa 6.96V 09" +2021-11-07 22:17:43,2021-11-07 22:17:43,32.52733,-107.12183,33,85,19872.35,"147TxC 9.10C 49.25hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:18:01,2021-11-07 22:18:01,32.52750,-107.12000,33,84,19882.41,"147TxC 8.60C 48.97hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:18:19,2021-11-07 22:18:19,32.52767,-107.11800,33,85,19888.81,"147TxC 8.20C 48.76hPa 6.95V 07" +2021-11-07 22:18:37,2021-11-07 22:18:37,32.52767,-107.11633,31,83,19887.59,"147TxC 7.70C 48.50hPa 6.95V 08" +2021-11-07 22:18:55,2021-11-07 22:18:55,32.52783,-107.11450,33,87,19901.00,"147TxC 7.10C 48.22hPa 6.95V 07" +2021-11-07 22:19:13,2021-11-07 22:19:13,32.52783,-107.11267,33,87,19911.06,"147TxC 6.60C 47.96hPa 6.95V 07" +2021-11-07 22:19:31,2021-11-07 22:19:31,32.52800,-107.11100,33,87,19921.12,"147TxC 6.30C 47.83hPa 6.95V 07" +2021-11-07 22:19:49,2021-11-07 22:19:49,32.52800,-107.10917,33,86,19914.41,"147TxC 5.90C 47.80hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:20:07,2021-11-07 22:20:07,32.52817,-107.10733,33,87,19903.74,"147TxC 5.80C 47.81hPa 6.95V 07" +2021-11-07 22:20:25,2021-11-07 22:20:25,32.52833,-107.10550,35,83,19905.27,"148TxC 4.80C 47.51hPa 6.95V 07" +2021-11-07 22:20:43,2021-11-07 22:20:43,32.52833,-107.10367,35,84,19881.19,"148TxC 4.10C 47.36hPa 6.95V 07" +2021-11-07 22:21:01,2021-11-07 22:21:01,32.52867,-107.10167,35,82,19871.13,"148TxC 3.40C 47.16hPa 6.95V 07S SpaceTREx SHAB-7V" +2021-11-07 22:21:19,2021-11-07 22:21:19,32.52883,-107.09983,35,82,19872.66,"148TxC 3.20C 47.10hPa 6.95V 09" +2021-11-07 22:21:37,2021-11-07 22:21:37,32.52900,-107.09783,35,81,19877.84,"148TxC 3.70C 47.29hPa 6.95V 06" +2021-11-07 22:21:55,2021-11-07 22:21:55,32.52917,-107.09600,35,87,19894.91,"148TxC 3.90C 47.31hPa 6.96V 07" +2021-11-07 22:22:13,2021-11-07 22:22:14,32.52917,-107.09417,33,88,19908.32,"148TxC 6.30C 49.30hPa 6.95V 08S SpaceTREx SHAB-7V" +2021-11-07 22:22:31,2021-11-07 22:22:31,32.52933,-107.09233,33,90,19909.84,"148TxC 9.30C 49.62hPa 6.95V 07" +2021-11-07 22:22:49,2021-11-07 22:22:49,32.52933,-107.09050,35,88,19925.08,"148TxC 7.60C 48.80hPa 6.95V 07" +2021-11-07 22:23:07,2021-11-07 22:23:07,32.52933,-107.08867,33,90,19928.43,"148TxC 6.80C 48.43hPa 6.95V 07" +2021-11-07 22:23:25,2021-11-07 22:23:25,32.52933,-107.08683,33,88,19909.54,"149TxC -1.30C 43.63hPa 6.95V 08" +2021-11-07 22:23:43,2021-11-07 22:23:43,32.52950,-107.08483,35,87,19906.49,"149TxC 6.40C 47.61hPa 6.95V 08S SpaceTREx SHAB-7V" +2021-11-07 22:24:02,2021-11-07 22:24:02,32.52950,-107.08300,35,84,19917.16,"149TxC 13.40C 49.99hPa 6.95V 07" +2021-11-07 22:24:38,2021-11-07 22:24:38,32.52950,-107.07933,35,92,19929.96,"149TxC 23.30C 52.90hPa 6.93V 06S SpaceTREx SHAB-7V" +2021-11-07 22:24:56,2021-11-07 22:24:56,32.52950,-107.07733,37,93,19925.08,"149TxC 26.50C 53.97hPa 6.93V 08" +2021-11-07 22:25:31,2021-11-07 22:25:31,32.52950,-107.07367,35,96,19933.31,"149TxC 30.90C 56.00hPa 6.93V 08" +2021-11-07 22:25:49,2021-11-07 22:25:49,32.52933,-107.07183,33,99,19965.01,"149TxC 24.40C 53.00hPa 6.93V 07S SpaceTREx SHAB-7V" +2021-11-07 22:26:07,2021-11-07 22:26:07,32.52900,-107.07000,35,99,19947.94,"149TxC 30.90C 54.40hPa 6.93V 07" +2021-11-07 22:26:43,2021-11-07 22:26:43,32.52867,-107.06617,33,92,19946.11,"150TxC 28.30C 55.08hPa 6.93V 06S SpaceTREx SHAB-7V" +2021-11-07 22:27:01,2021-11-07 22:27:01,32.52850,-107.06417,35,93,19929.04,"150TxC 26.30C 54.51hPa 6.93V 07S SpaceTREx SHAB-7V" +2021-11-07 22:27:37,2021-11-07 22:27:37,32.52850,-107.06033,35,85,19944.59,"150TxC 22.80C 53.42hPa 6.93V 08" +2021-11-07 22:27:55,2021-11-07 22:27:55,32.52867,-107.05833,35,87,19950.99,"150TxC 21.40C 52.86hPa 6.93V 08" +2021-11-07 22:28:13,2021-11-07 22:28:13,32.52867,-107.05633,37,90,19953.73,"150TxC 20.10C 52.31hPa 6.93V 07S SpaceTREx SHAB-7V" +2021-11-07 22:28:31,2021-11-07 22:28:31,32.52883,-107.05450,37,87,20004.63,"150TxC 19.00C 51.92hPa 6.93V 06" +2021-11-07 22:28:49,2021-11-07 22:28:49,32.52883,-107.05233,39,89,19984.21,"150TxC 17.40C 51.31hPa 6.93V 05S SpaceTREx SHAB-7V" +2021-11-07 22:29:07,2021-11-07 22:29:07,32.52867,-107.05033,37,89,19939.41,"150TxC 15.80C 50.91hPa 6.93V 06" +2021-11-07 22:29:25,2021-11-07 22:29:25,32.52883,-107.04833,39,85,19937.58,"151TxC 14.00C 50.51hPa 6.93V 06S SpaceTREx SHAB-7V" +2021-11-07 22:29:43,2021-11-07 22:29:44,32.52900,-107.04633,37,84,19898.56,"151TxC 12.50C 50.17hPa 6.93V 06" +2021-11-07 22:30:01,2021-11-07 22:30:01,32.52917,-107.04433,35,83,19897.65,"151TxC 11.60C 50.13hPa 6.93V 05" +2021-11-07 22:31:13,2021-11-07 22:31:13,32.52950,-107.03667,33,89,19848.88,"151TxC 9.40C 49.79hPa 6.95V 07" +2021-11-07 22:31:31,2021-11-07 22:31:31,32.52967,-107.03483,33,89,19830.90,"151TxC 8.50C 49.59hPa 6.95V 07" +2021-11-07 22:31:49,2021-11-07 22:31:49,32.52967,-107.03283,35,87,19818.71,"151TxC 7.20C 49.18hPa 6.95V 08" +2021-11-07 22:32:07,2021-11-07 22:32:07,32.52983,-107.03100,35,84,19806.82,"151TxC 6.10C 48.85hPa 6.95V 07" +2021-11-07 22:32:25,2021-11-07 22:32:25,32.53017,-107.02917,35,80,19808.95,"152TxC 5.50C 48.71hPa 6.95V 07" +2021-11-07 22:32:43,2021-11-07 22:32:43,32.53033,-107.02717,35,81,19800.42,"152TxC 5.60C 48.84hPa 6.95V 06" +2021-11-07 22:33:01,2021-11-07 22:33:01,32.53050,-107.02517,35,83,19804.68,"152TxC 5.50C 48.69hPa 6.93V 08" +2021-11-07 22:33:19,2021-11-07 22:33:19,32.53067,-107.02333,37,84,19819.62,"152TxC 5.40C 48.50hPa 6.93V 06S SpaceTREx SHAB-7V" +2021-11-07 22:33:37,2021-11-07 22:33:37,32.53083,-107.02133,35,87,19847.97,"152TxC 9.60C 50.36hPa 6.93V 07" +2021-11-07 22:33:55,2021-11-07 22:33:55,32.53100,-107.01950,33,86,19857.42,"152TxC 7.20C 49.08hPa 6.93V 07" +2021-11-07 22:34:13,2021-11-07 22:34:13,32.53100,-107.01767,33,89,19851.01,"152TxC 6.70C 48.93hPa 6.95V 08" +2021-11-07 22:34:31,2021-11-07 22:34:31,32.53100,-107.01583,35,90,19832.73,"152TxC 5.90C 48.73hPa 6.93V 07" +2021-11-07 22:35:07,2021-11-07 22:35:07,32.53117,-107.01183,35,84,19809.26,"152TxC 3.70C 48.22hPa 6.95V 07" +2021-11-07 22:35:25,2021-11-07 22:35:25,32.53150,-107.00983,35,82,19797.98,"153TxC 3.30C 48.14hPa 6.95V 07" +2021-11-07 22:35:43,2021-11-07 22:35:43,32.53167,-107.00800,33,81,19785.18,"153TxC 3.30C 48.22hPa 6.95V 07" +2021-11-07 22:36:01,2021-11-07 22:36:01,32.53183,-107.00600,33,84,19798.59,"153TxC 3.40C 48.24hPa 6.93V 07" +2021-11-07 22:36:19,2021-11-07 22:36:19,32.53200,-107.00417,35,90,19821.75,"153TxC -1.90C 45.04hPa 6.93V 07S SpaceTREx SHAB-7V" +2021-11-07 22:36:37,2021-11-07 22:36:37,32.53200,-107.00233,33,91,19851.32,"153TxC 6.90C 49.48hPa 6.93V 06" +2021-11-07 22:36:55,2021-11-07 22:36:55,32.53200,-107.00050,35,92,19861.07,"153TxC 5.50C 48.72hPa 6.93V 06" +2021-11-07 22:37:13,2021-11-07 22:37:13,32.53200,-106.99867,33,89,19860.46,"153TxC 5.20C 48.60hPa 6.93V 08" +2021-11-07 22:37:31,2021-11-07 22:37:31,32.53200,-106.99667,35,87,19846.44,"153TxC 4.50C 48.33hPa 6.93V 08S SpaceTREx SHAB-7V" +2021-11-07 22:37:49,2021-11-07 22:37:49,32.53200,-106.99483,37,86,19834.25,"153TxC 3.70C 48.11hPa 6.93V 06" +2021-11-07 22:38:07,2021-11-07 22:38:07,32.53217,-106.99300,33,84,19812.00,"153TxC 3.00C 47.96hPa 6.93V 06" +2021-11-07 22:38:25,2021-11-07 22:38:25,32.53233,-106.99100,33,85,19821.75,"154TxC 3.00C 47.95hPa 6.93V 07" +2021-11-07 22:38:43,2021-11-07 22:38:43,32.53250,-106.98933,31,83,19809.87,"154TxC 3.10C 48.07hPa 6.93V 07" +2021-11-07 22:39:01,2021-11-07 22:39:01,32.53267,-106.98733,35,88,19823.58,"154TxC 3.20C 48.09hPa 6.93V 07" +2021-11-07 22:39:37,2021-11-07 22:39:38,32.53283,-106.98367,33,87,19841.26,"154TxC 7.20C 48.72hPa 6.93V 09S SpaceTREx SHAB-7V" +2021-11-07 22:39:55,2021-11-07 22:39:55,32.53283,-106.98183,35,93,19852.84,"154TxC 13.30C 51.97hPa 6.93V 08" +2021-11-07 22:40:13,2021-11-07 22:40:13,32.53283,-106.98000,37,88,19835.16,"154TxC 12.20C 51.68hPa 6.93V 07" +2021-11-07 22:40:31,2021-11-07 22:40:31,32.53283,-106.97800,35,89,19832.42,"154TxC 10.70C 51.08hPa 6.93V 08" +2021-11-07 22:40:49,2021-11-07 22:40:49,32.53300,-106.97617,35,86,19836.38,"154TxC 9.80C 50.68hPa 6.93V 07" +2021-11-07 22:41:07,2021-11-07 22:41:07,32.53317,-106.97417,37,86,19833.03,"154TxC 8.80C 50.29hPa 6.93V 07" +2021-11-07 22:41:25,2021-11-07 22:41:25,32.53317,-106.97233,39,87,19832.12,"155TxC 8.10C 49.97hPa 6.93V 06" +2021-11-07 22:41:43,2021-11-07 22:41:43,32.53333,-106.97050,35,86,19832.12,"155TxC 7.70C 49.73hPa 6.93V 07" +2021-11-07 22:42:01,2021-11-07 22:42:01,32.53350,-106.96850,37,86,19851.62,"155TxC 7.90C 49.72hPa 6.93V 08" +2021-11-07 22:42:19,2021-11-07 22:42:19,32.53350,-106.96667,33,85,19859.55,"155TxC 7.40C 49.36hPa 6.93V 08" +2021-11-07 22:42:37,2021-11-07 22:42:37,32.53367,-106.96483,33,89,19879.67,"155TxC 6.50C 48.98hPa 6.93V 07" +2021-11-07 22:42:55,2021-11-07 22:42:55,32.53367,-106.96300,33,89,19872.66,"155TxC 6.10C 48.86hPa 6.93V 08" +2021-11-07 22:43:13,2021-11-07 22:43:13,32.53367,-106.96117,35,85,19865.04,"155TxC 4.90C 48.40hPa 6.93V 08" +2021-11-07 22:43:31,2021-11-07 22:43:31,32.53383,-106.95917,35,83,19840.65,"155TxC 3.80C 48.10hPa 6.93V 08" +2021-11-07 22:43:49,2021-11-07 22:43:49,32.53417,-106.95750,35,81,19821.45,"155TxC 2.90C 47.82hPa 6.93V 08" +2021-11-07 22:44:07,2021-11-07 22:44:07,32.53450,-106.95550,33,77,19821.14,"155TxC 2.00C 47.50hPa 6.93V 08" +2021-11-07 22:44:25,2021-11-07 22:44:25,32.53483,-106.95383,31,78,19817.18,"156TxC 1.70C 47.39hPa 6.93V 06" +2021-11-07 22:44:43,2021-11-07 22:44:43,32.53517,-106.95200,33,78,19821.45,"156TxC 2.10C 47.63hPa 6.93V 08" +2021-11-07 22:45:01,2021-11-07 22:45:01,32.53533,-106.95017,35,81,19836.38,"156TxC 2.80C 47.13hPa 6.93V 08" +2021-11-07 22:45:19,2021-11-07 22:45:19,32.53550,-106.94833,33,84,19854.37,"156TxC 7.40C 49.77hPa 6.93V 08" +2021-11-07 22:45:37,2021-11-07 22:45:37,32.53567,-106.94650,33,91,19876.01,"156TxC 6.10C 48.14hPa 6.93V 09" +2021-11-07 22:45:55,2021-11-07 22:45:55,32.53567,-106.94467,33,89,19900.09,"156TxC 12.50C 50.42hPa 6.93V 07" +2021-11-07 22:46:13,2021-11-07 22:46:13,32.53550,-106.94283,35,91,19893.08,"156TxC 12.30C 50.63hPa 6.91V 09" +2021-11-07 22:46:31,2021-11-07 22:46:31,32.53550,-106.94100,33,88,19872.35,"156TxC 16.70C 52.34hPa 6.91V 09" +2021-11-07 22:46:49,2021-11-07 22:46:49,32.53567,-106.93917,33,85,19860.16,"156TxC 20.90C 53.52hPa 6.91V 07" +2021-11-07 22:47:07,2021-11-07 22:47:07,32.53567,-106.93733,33,84,19848.88,"156TxC 23.00C 54.44hPa 6.91V 07" +2021-11-07 22:47:25,2021-11-07 22:47:25,32.53600,-106.93567,33,80,19839.43,"157TxC 23.20C 54.70hPa 6.91V 07" +2021-11-07 22:47:43,2021-11-07 22:47:43,32.53617,-106.93383,33,84,19843.09,"157TxC 26.40C 56.09hPa 6.91V 08" +2021-11-07 22:48:01,2021-11-07 22:48:01,32.53633,-106.93200,33,84,19866.56,"157TxC 23.80C 55.08hPa 6.91V 07" +2021-11-07 22:48:19,2021-11-07 22:48:19,32.53650,-106.93017,35,82,19867.17,"157TxC 22.30C 54.43hPa 6.91V 06" +2021-11-07 22:48:37,2021-11-07 22:48:37,32.53667,-106.92817,35,81,19875.09,"157TxC 20.90C 53.89hPa 6.91V 07" +2021-11-07 22:48:55,2021-11-07 22:48:55,32.53700,-106.92633,35,83,19873.87,"157TxC 19.60C 53.39hPa 6.91V 07" +2021-11-07 22:49:49,2021-11-07 22:49:49,32.53767,-106.92067,35,78,19834.56,"157TxC 13.80C 51.52hPa 6.91V 08S SpaceTREx SHAB-7V" +2021-11-07 22:50:07,2021-11-07 22:50:07,32.53800,-106.91883,35,73,19815.66,"157TxC 11.60C 50.95hPa 6.91V 07" +2021-11-07 22:50:25,2021-11-07 22:50:25,32.53850,-106.91700,35,72,19798.59,"158TxC 9.60C 50.34hPa 6.93V 08" +2021-11-07 22:50:43,2021-11-07 22:50:43,32.53900,-106.91517,33,71,19782.13,"158TxC 8.30C 49.94hPa 6.93V 07S SpaceTREx SHAB-7V" +2021-11-07 22:51:01,2021-11-07 22:51:01,32.53967,-106.91350,35,67,19781.22,"158TxC 7.80C 49.91hPa 6.91V 08" +2021-11-07 22:51:19,2021-11-07 22:51:19,32.54017,-106.91183,33,72,19785.79,"158TxC 7.90C 49.93hPa 6.91V 06" +2021-11-07 22:51:37,2021-11-07 22:51:37,32.54050,-106.91000,33,79,19801.03,"158TxC 8.80C 50.92hPa 6.91V 08" +2021-11-07 22:51:55,2021-11-07 22:51:55,32.54083,-106.90817,35,77,19807.12,"158TxC 11.50C 50.48hPa 6.91V 07S SpaceTREx SHAB-7V" +2021-11-07 22:52:13,2021-11-07 22:52:13,32.54117,-106.90633,35,75,19805.60,"158TxC 10.80C 51.13hPa 6.91V 06" +2021-11-07 22:52:31,2021-11-07 22:52:31,32.54150,-106.90450,33,80,19806.21,"158TxC 9.80C 50.70hPa 6.91V 07" +2021-11-07 22:52:49,2021-11-07 22:52:49,32.54200,-106.90267,33,75,19814.44,"158TxC 8.60C 50.20hPa 6.91V 08" +2021-11-07 22:53:07,2021-11-07 22:53:07,32.54233,-106.90083,33,76,19800.42,"158TxC 7.80C 49.91hPa 6.91V 07" +2021-11-07 22:53:25,2021-11-07 22:53:25,32.54283,-106.89917,31,74,19793.10,"159TxC 7.20C 49.71hPa 6.91V 06" +2021-11-07 22:53:43,2021-11-07 22:53:43,32.54333,-106.89733,33,70,19784.57,"159TxC 6.30C 49.37hPa 6.91V 08" +2021-11-07 22:54:01,2021-11-07 22:54:01,32.54383,-106.89567,35,71,19769.63,"159TxC 5.10C 48.97hPa 6.91V 08S SpaceTREx SHAB-7V" +2021-11-07 22:54:19,2021-11-07 22:54:19,32.54450,-106.89383,37,66,19765.67,"159TxC 4.50C 48.73hPa 6.91V 06S SpaceTREx SHAB-7V" +2021-11-07 22:54:37,2021-11-07 22:54:37,32.54500,-106.89217,33,66,19762.62,"159TxC 4.60C 48.90hPa 6.91V 06" +2021-11-07 22:54:55,2021-11-07 22:54:55,32.54567,-106.89050,35,70,19767.50,"159TxC 4.60C 48.87hPa 6.93V 07S SpaceTREx SHAB-7V" +2021-11-07 22:55:13,2021-11-07 22:55:14,32.54600,-106.88867,44,83,19772.99,"159TxC 1.70C 46.92hPa 6.91V 06" +2021-11-07 22:55:31,2021-11-07 22:55:31,32.54650,-106.88683,35,76,19772.68,"159TxC 9.50C 50.10hPa 6.91V 08S SpaceTREx SHAB-7V" +2021-11-07 22:56:07,2021-11-07 22:56:07,32.54733,-106.88283,37,75,19772.68,"159TxC 16.10C 52.70hPa 6.91V 06" +2021-11-07 22:56:25,2021-11-07 22:56:25,32.54783,-106.88100,37,68,19767.19,"160TxC 19.60C 54.73hPa 6.91V 07S SpaceTREx SHAB-7V" +2021-11-07 22:56:43,2021-11-07 22:56:43,32.54850,-106.87917,37,68,19783.04,"160TxC 22.90C 55.61hPa 6.90V 07S SpaceTREx SHAB-7V" +2021-11-07 22:57:01,2021-11-07 22:57:01,32.54900,-106.87717,39,67,19798.59,"160TxC 25.10C 55.49hPa 6.90V 06" +2021-11-07 22:57:19,2021-11-07 22:57:19,32.54950,-106.87517,37,78,19823.58,"160TxC 28.40C 56.95hPa 6.90V 08" +2021-11-07 22:57:37,2021-11-07 22:57:37,32.54983,-106.87317,39,76,19848.58,"160TxC 24.60C 55.25hPa 6.90V 06S SpaceTREx SHAB-7V" +2021-11-07 22:57:55,2021-11-07 22:57:55,32.55017,-106.87117,37,78,19869.00,"160TxC 22.80C 54.49hPa 6.91V 06S SpaceTREx SHAB-7V" +2021-11-07 22:58:31,2021-11-07 22:58:31,32.55067,-106.86700,39,78,19866.25,"160TxC 19.60C 53.37hPa 6.91V 06S SpaceTREx SHAB-7V" +2021-11-07 22:58:49,2021-11-07 22:58:49,32.55117,-106.86500,37,80,19828.46,"160TxC 17.70C 52.68hPa 6.91V 05" +2021-11-07 22:59:07,2021-11-07 22:59:07,32.55150,-106.86300,35,77,19851.93,"160TxC 15.60C 52.01hPa 6.91V 05S SpaceTREx SHAB-7V" +2021-11-07 22:59:25,2021-11-07 22:59:25,32.55200,-106.86100,37,71,19844.61,"161TxC 14.30C 51.71hPa 6.91V 07" +2021-11-07 22:59:43,2021-11-07 22:59:43,32.55250,-106.85917,35,70,19807.43,"161TxC 12.40C 50.99hPa 6.91V 07S SpaceTREx SHAB-7V" +2021-11-07 23:00:01,2021-11-07 23:00:01,32.55317,-106.85733,37,69,19801.64,"161TxC 11.10C 50.63hPa 6.91V 06S SpaceTREx SHAB-7V" +2021-11-07 23:00:37,2021-11-07 23:00:37,32.55450,-106.85367,35,65,19793.41,"161TxC 9.80C 50.41hPa 6.90V 09" +2021-11-07 23:00:55,2021-11-07 23:00:55,32.55517,-106.85183,35,68,19799.81,"161TxC 8.60C 49.99hPa 6.90V 08S SpaceTREx SHAB-7V" +2021-11-07 23:01:13,2021-11-07 23:01:13,32.55583,-106.85017,35,63,19805.60,"161TxC 7.80C 49.70hPa 6.91V 08S SpaceTREx SHAB-7V" +2021-11-07 23:01:31,2021-11-07 23:01:31,32.55667,-106.84850,33,60,19780.30,"161TxC 6.80C 49.36hPa 6.91V 07S SpaceTREx SHAB-7V" +2021-11-07 23:01:49,2021-11-07 23:01:49,32.55733,-106.84683,35,61,19766.58,"161TxC 6.20C 49.20hPa 6.91V 07" +2021-11-07 23:02:07,2021-11-07 23:02:07,32.55817,-106.84517,35,57,19771.16,"161TxC 5.30C 48.77hPa 6.91V 07" +2021-11-07 23:02:25,2021-11-07 23:02:25,32.55900,-106.84350,33,60,19776.34,"162TxC 5.10C 48.50hPa 6.91V 07" +2021-11-07 23:02:43,2021-11-07 23:02:43,32.55983,-106.84200,33,60,19789.75,"162TxC 5.00C 48.27hPa 6.91V 07" +2021-11-07 23:03:01,2021-11-07 23:03:01,32.56050,-106.84033,35,62,19788.23,"162TxC 4.90C 48.24hPa 6.91V 08S SpaceTREx SHAB-7V" +2021-11-07 23:03:19,2021-11-07 23:03:19,32.56133,-106.83867,37,64,19785.18,"162TxC 4.50C 47.94hPa 6.91V 08" +2021-11-07 23:03:37,2021-11-07 23:03:37,32.56183,-106.83700,33,65,19808.04,"162TxC 3.20C 47.26hPa 6.91V 08" +2021-11-07 23:03:55,2021-11-07 23:03:55,32.56267,-106.83533,33,60,19791.27,"162TxC 2.50C 46.91hPa 6.91V 07" +2021-11-07 23:04:13,2021-11-07 23:04:13,32.56350,-106.83383,33,57,19758.96,"162TxC 1.60C 46.53hPa 6.91V 05" +2021-11-07 23:04:31,2021-11-07 23:04:31,32.56433,-106.83233,33,54,19748.30,"162TxC 0.30C 45.93hPa 6.91V 07" +2021-11-07 23:04:49,2021-11-07 23:04:49,32.56517,-106.83100,30,54,19754.39,"162TxC -0.80C 45.39hPa 6.91V 08" +2021-11-07 23:05:07,2021-11-07 23:05:07,32.56600,-106.82967,30,58,19774.20,"162TxC -0.90C 45.33hPa 6.91V 05" +2021-11-07 23:05:25,2021-11-07 23:05:25,32.56683,-106.82817,33,61,19780.61,"163TxC 2.20C 46.88hPa 6.91V 07S SpaceTREx SHAB-7V" +2021-11-07 23:05:43,2021-11-07 23:05:43,32.56750,-106.82650,33,62,19798.89,"163TxC 3.60C 47.27hPa 6.91V 08" +2021-11-07 23:06:01,2021-11-07 23:06:01,32.56833,-106.82500,33,66,19813.22,"163TxC 2.00C 46.21hPa 6.91V 06" +2021-11-07 23:06:19,2021-11-07 23:06:19,32.56883,-106.82317,37,71,19813.52,"163TxC 1.30C 45.79hPa 6.91V 06" +2021-11-07 23:06:37,2021-11-07 23:06:38,32.56950,-106.82150,33,63,19801.94,"163TxC 0.30C 45.45hPa 6.91V 05" +2021-11-07 23:07:31,2021-11-07 23:07:31,32.57200,-106.81733,31,45,19723.30,"163TxC -1.60C 45.22hPa 6.91V 06S SpaceTREx SHAB-7V" +2021-11-07 23:07:49,2021-11-07 23:07:49,32.57283,-106.81633,28,41,19699.22,"163TxC -2.10C 45.10hPa 6.91V 07S SpaceTREx SHAB-7V" +2021-11-07 23:08:07,2021-11-07 23:08:07,32.57383,-106.81517,30,40,19690.69,"163TxC -2.20C 45.07hPa 6.91V 07S SpaceTREx SHAB-7V" +2021-11-07 23:08:25,2021-11-07 23:08:25,32.57483,-106.81417,26,41,19707.76,"164TxC -2.00C 45.07hPa 6.91V 07" +2021-11-07 23:08:43,2021-11-07 23:08:43,32.57567,-106.81317,30,46,19747.99,"164TxC -1.20C 44.92hPa 6.90V 07S SpaceTREx SHAB-7V" +2021-11-07 23:09:19,2021-11-07 23:09:19,32.57733,-106.81083,30,54,19774.81,"164TxC 1.50C 46.43hPa 6.90V 06S SpaceTREx SHAB-7V" +2021-11-07 23:09:37,2021-11-07 23:09:37,32.57817,-106.80950,31,48,19777.56,"164TxC 0.90C 46.11hPa 6.90V 07" +2021-11-07 23:09:55,2021-11-07 23:09:55,32.57917,-106.80850,26,41,19775.42,"164TxC 1.50C 46.47hPa 6.90V 07" +2021-11-07 23:10:13,2021-11-07 23:10:13,32.58000,-106.80733,26,42,19737.93,"164TxC 0.90C 46.24hPa 6.90V 07" +2021-11-07 23:10:31,2021-11-07 23:10:31,32.58100,-106.80650,28,43,19734.28,"164TxC 0.80C 46.30hPa 6.90V 06" +2021-11-07 23:10:49,2021-11-07 23:10:49,32.58183,-106.80550,28,39,19728.48,"164TxC 0.70C 46.25hPa 6.90V 07" +2021-11-07 23:11:07,2021-11-07 23:11:07,32.58283,-106.80450,28,41,19741.59,"164TxC 0.70C 46.17hPa 6.90V 06S SpaceTREx SHAB-7V" +2021-11-07 23:11:25,2021-11-07 23:11:26,32.58367,-106.80350,30,56,19784.87,"165TxC -1.60C 44.54hPa 6.90V 06" +2021-11-07 23:11:43,2021-11-07 23:11:43,32.58450,-106.80250,28,46,19782.13,"165TxC 7.50C 48.83hPa 6.88V 07S SpaceTREx SHAB-7V" +2021-11-07 23:12:01,2021-11-07 23:12:01,32.58550,-106.80133,28,46,19792.19,"165TxC 8.30C 49.57hPa 6.88V 07S SpaceTREx SHAB-7V" +2021-11-07 23:12:19,2021-11-07 23:12:19,32.58633,-106.80017,28,52,19787.62,"165TxC 6.80C 48.77hPa 6.88V 05" +2021-11-07 23:12:37,2021-11-07 23:12:37,32.58733,-106.79917,28,43,19783.04,"165TxC 5.80C 48.35hPa 6.88V 07S SpaceTREx SHAB-7V" +2021-11-07 23:12:55,2021-11-07 23:12:55,32.58817,-106.79800,30,43,19775.12,"165TxC 4.60C 47.85hPa 6.88V 07" +2021-11-07 23:13:13,2021-11-07 23:13:13,32.58917,-106.79700,28,40,19749.82,"165TxC 3.90C 47.71hPa 6.88V 07" +2021-11-07 23:13:31,2021-11-07 23:13:31,32.59017,-106.79600,28,39,19741.90,"165TxC 3.40C 47.51hPa 6.88V 06" +2021-11-07 23:13:49,2021-11-07 23:13:49,32.59117,-106.79517,26,38,19742.20,"165TxC 2.90C 47.33hPa 6.88V 07" +2021-11-07 23:14:07,2021-11-07 23:14:07,32.59217,-106.79417,26,37,19751.34,"165TxC 2.60C 47.21hPa 6.90V 07" +2021-11-07 23:14:25,2021-11-07 23:14:25,32.59317,-106.79333,26,36,19743.12,"166TxC 2.10C 46.96hPa 6.88V 06" +2021-11-07 23:14:43,2021-11-07 23:14:43,32.59417,-106.79250,26,36,19737.32,"166TxC 1.40C 46.72hPa 6.88V 05" +2021-11-07 23:15:01,2021-11-07 23:15:01,32.59517,-106.79167,26,34,19724.83,"166TxC 1.00C 46.60hPa 6.90V 06" +2021-11-07 23:15:19,2021-11-07 23:15:19,32.59617,-106.79100,24,32,19718.43,"166TxC 0.60C 46.49hPa 6.90V 06S SpaceTREx SHAB-7V" +2021-11-07 23:15:37,2021-11-07 23:15:37,32.59717,-106.79017,24,32,19716.29,"166TxC 0.30C 46.40hPa 6.90V 06" +2021-11-07 23:15:55,2021-11-07 23:15:55,32.59817,-106.78950,26,32,19704.71,"166TxC 0.10C 46.33hPa 6.90V 06" +2021-11-07 23:16:13,2021-11-07 23:16:13,32.59917,-106.78867,26,32,19716.29,"166TxC -0.10C 46.17hPa 6.88V 06" +2021-11-07 23:16:31,2021-11-07 23:16:31,32.60017,-106.78800,28,33,19698.92,"166TxC -0.30C 46.05hPa 6.88V 06" +2021-11-07 23:16:49,2021-11-07 23:16:49,32.60117,-106.78717,24,33,19695.87,"166TxC -0.70C 45.96hPa 6.88V 06S SpaceTREx SHAB-7V" +2021-11-07 23:17:07,2021-11-07 23:17:07,32.60217,-106.78633,28,33,19681.24,"166TxC -1.00C 45.88hPa 6.90V 06S SpaceTREx SHAB-7V" +2021-11-07 23:17:25,2021-11-07 23:17:25,32.60317,-106.78567,26,31,19697.09,"167TxC -1.40C 45.74hPa 6.88V 08S SpaceTREx SHAB-7V" +2021-11-07 23:17:43,2021-11-07 23:17:43,32.60417,-106.78483,28,32,19694.96,"167TxC -1.90C 45.61hPa 6.90V 07" +2021-11-07 23:18:01,2021-11-07 23:18:01,32.60517,-106.78417,26,33,19682.46,"167TxC -1.70C 45.87hPa 6.90V 07S SpaceTREx SHAB-7V" +2021-11-07 23:18:19,2021-11-07 23:18:19,32.60617,-106.78333,26,33,19682.76,"167TxC -0.90C 46.20hPa 6.90V 07" +2021-11-07 23:18:37,2021-11-07 23:18:37,32.60717,-106.78267,26,33,19698.92,"167TxC -1.10C 45.88hPa 6.90V 07" +2021-11-07 23:18:55,2021-11-07 23:18:55,32.60817,-106.78183,26,36,19718.43,"167TxC -1.30C 45.64hPa 6.90V 07" +2021-11-07 23:19:13,2021-11-07 23:19:13,32.60917,-106.78083,24,47,19730.31,"167TxC -2.00C 44.74hPa 6.90V 07" +2021-11-07 23:19:31,2021-11-07 23:19:31,32.61000,-106.77983,28,42,19734.58,"167TxC 5.60C 48.99hPa 6.88V 07S SpaceTREx SHAB-7V" +2021-11-07 23:19:49,2021-11-07 23:19:49,32.61100,-106.77883,28,42,19745.55,"167TxC 4.50C 48.41hPa 6.88V 07" +2021-11-07 23:20:07,2021-11-07 23:20:07,32.61200,-106.77783,30,41,19732.14,"167TxC 2.70C 47.48hPa 6.88V 07" +2021-11-07 23:20:25,2021-11-07 23:20:25,32.61283,-106.77683,26,38,19735.50,"168TxC 1.60C 47.05hPa 6.90V 08" +2021-11-07 23:20:43,2021-11-07 23:20:43,32.61383,-106.77600,26,37,19702.58,"168TxC 0.80C 46.75hPa 6.88V 07" +2021-11-07 23:21:01,2021-11-07 23:21:01,32.61500,-106.77500,26,37,19696.79,"168TxC 0.40C 46.62hPa 6.90V 07" +2021-11-07 23:21:19,2021-11-07 23:21:19,32.61583,-106.77417,26,36,19700.75,"168TxC -0.10C 46.35hPa 6.90V 07" +2021-11-07 23:21:37,2021-11-07 23:21:37,32.61683,-106.77333,26,36,19699.22,"168TxC -0.40C 46.12hPa 6.88V 07" +2021-11-07 23:21:55,2021-11-07 23:21:55,32.61767,-106.77250,26,39,19726.66,"168TxC -0.60C 45.96hPa 6.88V 07" +2021-11-07 23:22:13,2021-11-07 23:22:13,32.61867,-106.77167,24,42,19722.08,"168TxC -0.80C 45.80hPa 6.88V 08" +2021-11-07 23:22:31,2021-11-07 23:22:31,32.61950,-106.77067,28,44,19731.53,"168TxC -1.00C 45.58hPa 6.88V 08" +2021-11-07 23:22:49,2021-11-07 23:22:49,32.62033,-106.76983,24,39,19742.81,"168TxC 0.30C 46.17hPa 6.88V 07" +2021-11-07 23:23:07,2021-11-07 23:23:07,32.62117,-106.76883,26,41,19744.94,"168TxC 5.90C 48.99hPa 6.88V 07" +2021-11-07 23:23:25,2021-11-07 23:23:25,32.62200,-106.76783,24,39,19725.13,"169TxC 11.00C 51.24hPa 6.88V 07S SpaceTREx SHAB-7V" +2021-11-07 23:23:43,2021-11-07 23:23:43,32.62300,-106.76700,24,39,19711.72,"169TxC 11.30C 51.58hPa 6.86V 08" +2021-11-07 23:24:01,2021-11-07 23:24:01,32.62383,-106.76617,26,43,19688.56,"169TxC 11.40C 51.79hPa 6.88V 07" +2021-11-07 23:24:19,2021-11-07 23:24:19,32.62467,-106.76517,24,41,19674.54,"169TxC 11.00C 51.73hPa 6.86V 08" +2021-11-07 23:24:37,2021-11-07 23:24:37,32.62567,-106.76433,26,41,19679.11,"169TxC 10.40C 51.41hPa 6.88V 08" +2021-11-07 23:24:55,2021-11-07 23:24:55,32.62650,-106.76350,22,43,19697.40,"169TxC 9.40C 50.93hPa 6.88V 07" +2021-11-07 23:25:13,2021-11-07 23:25:13,32.62733,-106.76250,26,41,19700.44,"169TxC 8.50C 50.36hPa 6.88V 07" +2021-11-07 23:25:31,2021-11-07 23:25:31,32.62833,-106.76167,26,34,19696.79,"169TxC 9.60C 50.73hPa 6.86V 07" +2021-11-07 23:25:49,2021-11-07 23:25:49,32.62917,-106.76067,26,39,19690.99,"169TxC 13.30C 52.50hPa 6.86V 07" +2021-11-07 23:26:07,2021-11-07 23:26:07,32.63017,-106.75967,26,41,19681.55,"169TxC 16.00C 53.60hPa 6.86V 07" +2021-11-07 23:26:27,2021-11-07 23:26:27,32.63117,-106.75850,28,45,19647.10,"170TxC 15.80C 53.98hPa 6.86V 08" +2021-11-07 23:26:45,2021-11-07 23:26:45,32.63200,-106.75767,24,46,19622.72,"170TxC 13.50C 53.39hPa 6.86V 08" +2021-11-07 23:27:03,2021-11-07 23:27:03,32.63283,-106.75667,24,43,19610.22,"170TxC 14.40C 53.97hPa 6.86V 07" +2021-11-07 23:27:21,2021-11-07 23:27:21,32.63367,-106.75567,26,46,19588.28,"170TxC 15.40C 54.41hPa 6.86V 07" +2021-11-07 23:27:39,2021-11-07 23:27:39,32.63450,-106.75467,24,44,19588.58,"170TxC 16.90C 54.83hPa 6.86V 07" +2021-11-07 23:27:57,2021-11-07 23:27:57,32.63517,-106.75367,22,46,19572.12,"170TxC 18.40C 55.40hPa 6.86V 08" +2021-11-07 23:28:15,2021-11-07 23:28:15,32.63583,-106.75267,24,53,19563.89,"170TxC 19.50C 55.89hPa 6.86V 08" +2021-11-07 23:28:33,2021-11-07 23:28:33,32.63650,-106.75167,22,57,19545.00,"170TxC 19.40C 55.94hPa 6.86V 08" +2021-11-07 23:28:51,2021-11-07 23:28:51,32.63700,-106.75067,20,60,19541.34,"170TxC 23.00C 57.54hPa 6.86V 07" +2021-11-07 23:29:09,2021-11-07 23:29:09,32.63733,-106.74950,19,69,19526.71,"170TxC 23.60C 57.74hPa 6.86V 07" +2021-11-07 23:29:27,2021-11-07 23:29:27,32.63750,-106.74850,19,80,19513.60,"171TxC 24.30C 57.89hPa 6.86V 07" +2021-11-07 23:29:45,2021-11-07 23:29:45,32.63767,-106.74750,19,84,19487.39,"171TxC 26.90C 58.92hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:30:03,2021-11-07 23:30:03,32.63767,-106.74667,19,89,19485.56,"171TxC 30.00C 59.86hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:31:16,2021-11-07 23:31:16,32.63767,-106.74267,19,92,19499.88,"171TxC 31.40C 59.98hPa 6.86V 08S SpaceTREx SHAB-7V" +2021-11-07 23:31:33,2021-11-07 23:31:33,32.63767,-106.74167,17,92,19496.53,"171TxC 28.90C 59.16hPa 6.86V 07S SpaceTREx SHAB-7V" +2021-11-07 23:31:51,2021-11-07 23:31:51,32.63750,-106.74067,19,93,19507.20,"171TxC 26.50C 58.31hPa 6.86V 07S SpaceTREx SHAB-7V" +2021-11-07 23:32:09,2021-11-07 23:32:09,32.63750,-106.73967,19,99,19499.58,"171TxC 23.90C 57.39hPa 6.86V 07S SpaceTREx SHAB-7V" +2021-11-07 23:32:27,2021-11-07 23:32:27,32.63750,-106.73867,22,101,19418.20,"172TxC 21.40C 56.66hPa 6.86V 06S SpaceTREx SHAB-7V" +2021-11-07 23:32:45,2021-11-07 23:32:45,32.63717,-106.73767,20,105,19472.76,"172TxC 18.80C 55.82hPa 6.85V 08S SpaceTREx SHAB-7V" +2021-11-07 23:33:03,2021-11-07 23:33:03,32.63683,-106.73650,22,109,19452.64,"172TxC 16.60C 55.67hPa 6.86V 06S SpaceTREx SHAB-7V" +2021-11-07 23:33:21,2021-11-07 23:33:21,32.63650,-106.73533,24,110,19445.33,"172TxC 21.40C 58.05hPa 6.86V 06S SpaceTREx SHAB-7V" +2021-11-07 23:33:39,2021-11-07 23:33:39,32.63600,-106.73417,24,112,19426.43,"172TxC 22.40C 57.33hPa 6.85V 06S SpaceTREx SHAB-7V" +2021-11-07 23:33:57,2021-11-07 23:33:57,32.63550,-106.73300,24,116,19429.17,"172TxC 24.80C 58.17hPa 6.85V 06S SpaceTREx SHAB-7V" +2021-11-07 23:34:15,2021-11-07 23:34:15,32.63483,-106.73167,26,120,19427.34,"172TxC 25.90C 58.83hPa 6.85V 06" +2021-11-07 23:34:33,2021-11-07 23:34:33,32.63433,-106.73050,33,118,19414.85,"172TxC 28.80C 60.35hPa 6.85V 07" +2021-11-07 23:34:51,2021-11-07 23:34:52,32.63383,-106.72917,28,119,19405.70,"172TxC 28.90C 59.74hPa 6.85V 06" +2021-11-07 23:35:09,2021-11-07 23:35:09,32.63317,-106.72783,28,118,19417.28,"172TxC 29.70C 59.87hPa 6.85V 06S SpaceTREx SHAB-7V" +2021-11-07 23:35:27,2021-11-07 23:35:27,32.63250,-106.72667,28,121,19418.81,"173TxC 30.20C 61.64hPa 6.85V 06S SpaceTREx SHAB-7V" +2021-11-07 23:35:45,2021-11-07 23:35:45,32.63183,-106.72533,30,121,19434.35,"173TxC 30.20C 60.53hPa 6.85V 08S SpaceTREx SHAB-7V" +2021-11-07 23:36:03,2021-11-07 23:36:03,32.63117,-106.72400,28,119,19437.10,"173TxC 27.20C 59.33hPa 6.85V 08S SpaceTREx SHAB-7V" +2021-11-07 23:36:21,2021-11-07 23:36:21,32.63050,-106.72267,28,120,19435.57,"173TxC 24.90C 58.38hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:36:39,2021-11-07 23:36:39,32.62983,-106.72133,30,119,19439.23,"173TxC 23.00C 57.68hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:36:57,2021-11-07 23:36:58,32.62917,-106.71983,30,117,19438.62,"173TxC 20.50C 56.81hPa 6.85V 08S SpaceTREx SHAB-7V" +2021-11-07 23:37:15,2021-11-07 23:37:16,32.62867,-106.71850,30,115,19412.71,"173TxC 18.20C 56.00hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:37:51,2021-11-07 23:37:51,32.62750,-106.71550,28,112,19402.35,"173TxC 14.60C 54.83hPa 6.85V 08S SpaceTREx SHAB-7V" +2021-11-07 23:38:09,2021-11-07 23:38:09,32.62700,-106.71400,30,111,19402.65,"173TxC 13.10C 54.31hPa 6.85V 07" +2021-11-07 23:38:27,2021-11-07 23:38:27,32.62650,-106.71250,30,113,19403.26,"174TxC 12.00C 53.88hPa 6.85V 07" +2021-11-07 23:38:45,2021-11-07 23:38:45,32.62600,-106.71100,28,113,19400.52,"174TxC 10.80C 53.32hPa 6.85V 07" +2021-11-07 23:39:03,2021-11-07 23:39:03,32.62533,-106.70967,28,123,19409.97,"174TxC 9.70C 52.81hPa 6.85V 06" +2021-11-07 23:39:21,2021-11-07 23:39:21,32.62483,-106.70817,30,115,19400.82,"174TxC 8.70C 52.42hPa 6.85V 07" +2021-11-07 23:39:39,2021-11-07 23:39:39,32.62433,-106.70667,28,111,19403.57,"174TxC 7.70C 51.99hPa 6.85V 07" +2021-11-07 23:39:57,2021-11-07 23:39:57,32.62383,-106.70517,30,114,19399.30,"174TxC 6.70C 51.65hPa 6.86V 07" +2021-11-07 23:40:15,2021-11-07 23:40:15,32.62333,-106.70383,28,110,19373.09,"174TxC 5.20C 51.13hPa 6.85V 07" +2021-11-07 23:40:33,2021-11-07 23:40:33,32.62283,-106.70233,26,112,19358.15,"174TxC 4.30C 51.03hPa 6.85V 07" +2021-11-07 23:40:51,2021-11-07 23:40:51,32.62233,-106.70083,28,110,19347.79,"174TxC 3.20C 50.63hPa 6.85V 08" +2021-11-07 23:41:09,2021-11-07 23:41:09,32.62200,-106.69950,30,110,19330.11,"174TxC 2.00C 50.23hPa 6.85V 07" +2021-11-07 23:41:27,2021-11-07 23:41:27,32.62150,-106.69800,31,104,19312.74,"175TxC 2.10C 50.41hPa 6.85V 06" +2021-11-07 23:41:45,2021-11-07 23:41:45,32.62100,-106.69633,31,105,19305.12,"175TxC 1.50C 50.23hPa 6.85V 07" +2021-11-07 23:42:03,2021-11-07 23:42:03,32.62067,-106.69450,33,110,19290.18,"175TxC 0.20C 49.77hPa 6.86V 06" +2021-11-07 23:42:21,2021-11-07 23:42:21,32.62017,-106.69267,37,108,19273.42,"175TxC -0.70C 49.52hPa 6.86V 06S SpaceTREx SHAB-7V" +2021-11-07 23:42:39,2021-11-07 23:42:39,32.61967,-106.69083,37,107,19267.93,"175TxC 0.40C 50.88hPa 6.86V 06S SpaceTREx SHAB-7V" +2021-11-07 23:42:57,2021-11-07 23:42:57,32.61917,-106.68883,37,106,19267.32,"175TxC 3.50C 51.87hPa 6.85V 06S SpaceTREx SHAB-7V" +2021-11-07 23:43:15,2021-11-07 23:43:15,32.61867,-106.68683,37,106,19277.99,"175TxC 3.90C 51.98hPa 6.85V 06" +2021-11-07 23:43:33,2021-11-07 23:43:33,32.61817,-106.68500,39,107,19292.62,"175TxC 2.90C 51.18hPa 6.85V 07" +2021-11-07 23:43:51,2021-11-07 23:43:51,32.61767,-106.68317,37,108,19319.75,"175TxC 1.30C 51.16hPa 6.85V 06" +2021-11-07 23:44:09,2021-11-07 23:44:09,32.61717,-106.68133,33,106,19328.89,"175TxC 5.70C 52.28hPa 6.85V 08" +2021-11-07 23:44:27,2021-11-07 23:44:27,32.61667,-106.67950,39,104,19328.59,"176TxC 4.90C 51.96hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:44:45,2021-11-07 23:44:45,32.61617,-106.67783,39,100,19334.07,"176TxC 5.30C 52.10hPa 6.85V 07" +2021-11-07 23:45:03,2021-11-07 23:45:03,32.61583,-106.67600,35,105,19317.92,"176TxC 8.60C 53.90hPa 6.85V 07" +2021-11-07 23:45:21,2021-11-07 23:45:21,32.61533,-106.67400,37,105,19297.50,"176TxC 8.90C 53.82hPa 6.85V 07" +2021-11-07 23:45:39,2021-11-07 23:45:40,32.61483,-106.67217,39,109,19271.89,"176TxC 7.70C 53.43hPa 6.85V 06S SpaceTREx SHAB-7V" +2021-11-07 23:45:57,2021-11-07 23:45:57,32.61417,-106.67000,39,105,19253.61,"176TxC 10.30C 55.15hPa 6.85V 06" +2021-11-07 23:46:17,2021-11-07 23:46:17,32.61367,-106.66767,41,104,19253.00,"176TxC 10.90C 55.64hPa 6.85V 08" +2021-11-07 23:46:35,2021-11-07 23:46:35,32.61333,-106.66550,41,103,19235.93,"176TxC 10.70C 55.47hPa 6.85V 06" +2021-11-07 23:46:53,2021-11-07 23:46:53,32.61283,-106.66333,41,104,19244.77,"176TxC 9.20C 54.72hPa 6.85V 06" +2021-11-07 23:47:11,2021-11-07 23:47:11,32.61233,-106.66100,43,108,19282.87,"176TxC 8.00C 53.96hPa 6.85V 07" +2021-11-07 23:47:29,2021-11-07 23:47:29,32.61183,-106.65900,41,105,19271.89,"177TxC 6.70C 53.41hPa 6.85V 08" +2021-11-07 23:47:47,2021-11-07 23:47:47,32.61133,-106.65683,41,106,19261.23,"177TxC 4.80C 52.62hPa 6.85V 06" +2021-11-07 23:48:05,2021-11-07 23:48:05,32.61083,-106.65450,46,103,19232.58,"177TxC 4.20C 52.63hPa 6.85V 07" +2021-11-07 23:48:23,2021-11-07 23:48:23,32.61050,-106.65217,44,101,19199.66,"177TxC 2.90C 52.28hPa 6.85V 07" +2021-11-07 23:48:59,2021-11-07 23:49:00,32.61000,-106.64733,44,94,19133.82,"177TxC 0.20C 51.70hPa 6.85V 07" +2021-11-07 23:49:17,2021-11-07 23:49:17,32.60983,-106.64500,44,91,19109.44,"177TxC -1.00C 51.40hPa 6.85V 09S SpaceTREx SHAB-7V" +2021-11-07 23:49:35,2021-11-07 23:49:35,32.60983,-106.64267,43,93,19090.84,"177TxC -2.30C 50.92hPa 6.85V 09S SpaceTREx SHAB-7V" +2021-11-07 23:49:53,2021-11-07 23:49:53,32.60967,-106.64050,43,90,19073.77,"177TxC -2.80C 50.70hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:50:11,2021-11-07 23:50:11,32.60983,-106.63817,41,88,19064.02,"177TxC -3.80C 50.26hPa 6.85V 09" +2021-11-07 23:50:29,2021-11-07 23:50:29,32.60967,-106.63600,43,89,19075.30,"178TxC -4.50C 49.92hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:50:47,2021-11-07 23:50:47,32.60983,-106.63367,41,89,19076.52,"178TxC -4.70C 49.78hPa 6.85V 07" +2021-11-07 23:51:05,2021-11-07 23:51:05,32.60983,-106.63133,43,89,19087.80,"178TxC -4.80C 49.49hPa 6.85V 08" +2021-11-07 23:51:25,2021-11-07 23:51:25,32.60983,-106.62883,43,88,19088.71,"178TxC -4.90C 49.33hPa 6.85V 09S SpaceTREx SHAB-7V" +2021-11-07 23:51:43,2021-11-07 23:51:43,32.61000,-106.62650,43,90,19087.19,"178TxC -5.90C 48.83hPa 6.85V 07" +2021-11-07 23:52:01,2021-11-07 23:52:01,32.61000,-106.62433,43,85,19077.13,"178TxC -6.60C 48.50hPa 6.85V 06S SpaceTREx SHAB-7V" +2021-11-07 23:52:19,2021-11-07 23:52:19,32.61017,-106.62217,41,83,19058.84,"178TxC -7.30C 48.35hPa 6.85V 07" +2021-11-07 23:52:37,2021-11-07 23:52:37,32.61050,-106.62000,39,81,19023.48,"178TxC -7.90C 48.30hPa 6.85V 09" +2021-11-07 23:52:55,2021-11-07 23:52:55,32.61083,-106.61800,37,79,19004.28,"178TxC -8.60C 48.07hPa 6.85V 09" +2021-11-07 23:53:13,2021-11-07 23:53:13,32.61100,-106.61617,35,79,18995.44,"178TxC -9.30C 47.91hPa 6.85V 09S SpaceTREx SHAB-7V" +2021-11-07 23:53:32,2021-11-07 23:53:32,32.61133,-106.61433,35,77,18985.99,"179TxC -9.60C 47.92hPa 6.85V 09S SpaceTREx SHAB-7V" +2021-11-07 23:53:49,2021-11-07 23:53:49,32.61167,-106.61250,33,77,18976.54,"179TxC -10.00C 48.17hPa 6.85V 09S SpaceTREx SHAB-7V" +2021-11-07 23:54:07,2021-11-07 23:54:07,32.61200,-106.61067,35,76,18960.39,"179TxC -10.30C 48.40hPa 6.85V 08S SpaceTREx SHAB-7V" +2021-11-07 23:54:25,2021-11-07 23:54:25,32.61250,-106.60883,33,75,18954.90,"179TxC -10.60C 48.29hPa 6.85V 07S SpaceTREx SHAB-7V" +2021-11-07 23:54:43,2021-11-07 23:54:43,32.61283,-106.60717,33,71,18941.19,"179TxC -10.80C 48.35hPa 6.86V 07S SpaceTREx SHAB-7V" +2021-11-07 23:55:01,2021-11-07 23:55:01,32.61317,-106.60533,33,78,18932.65,"179TxC -11.00C 48.35hPa 6.85V 07" +2021-11-07 23:55:37,2021-11-07 23:55:37,32.61367,-106.60183,33,82,18931.43,"179TxC -11.20C 49.10hPa 6.85V 08" +2021-11-07 23:55:55,2021-11-07 23:55:55,32.61400,-106.60000,31,84,18918.63,"179TxC -9.20C 49.67hPa 6.83V 09S SpaceTREx SHAB-7V" +2021-11-07 23:56:13,2021-11-07 23:56:13,32.61400,-106.59817,31,81,18920.16,"179TxC -6.20C 51.54hPa 6.83V 08S SpaceTREx SHAB-7V" +2021-11-07 23:56:31,2021-11-07 23:56:31,32.61417,-106.59650,31,86,18908.88,"180TxC -2.60C 53.01hPa 6.83V 08S SpaceTREx SHAB-7V" +2021-11-07 23:56:49,2021-11-07 23:56:49,32.61433,-106.59483,31,83,18911.32,"180TxC 0.00C 54.04hPa 6.83V 07S SpaceTREx SHAB-7V" +2021-11-07 23:57:07,2021-11-07 23:57:07,32.61433,-106.59317,30,84,18898.21,"180TxC 2.70C 55.32hPa 6.83V 08" +2021-11-07 23:57:25,2021-11-07 23:57:25,32.61450,-106.59167,28,81,18883.27,"180TxC 5.90C 56.94hPa 6.83V 07S SpaceTREx SHAB-7V" +2021-11-07 23:58:01,2021-11-07 23:58:01,32.61483,-106.58867,26,81,18868.95,"180TxC 10.80C 59.68hPa 6.81V 08S SpaceTREx SHAB-7V" +2021-11-07 23:58:19,2021-11-07 23:58:19,32.61500,-106.58717,26,82,18853.71,"180TxC 13.40C 60.73hPa 6.81V 08S SpaceTREx SHAB-7V" +2021-11-07 23:58:37,2021-11-07 23:58:37,32.61517,-106.58583,26,83,18854.32,"180TxC 15.50C 61.56hPa 6.81V 07S SpaceTREx SHAB-7V" +2021-11-07 23:58:55,2021-11-07 23:58:55,32.61533,-106.58450,26,83,18832.37,"180TxC 15.40C 61.60hPa 6.81V 07S SpaceTREx SHAB-7V" +2021-11-07 23:59:13,2021-11-07 23:59:13,32.61550,-106.58317,24,80,18818.05,"180TxC 13.80C 61.16hPa 6.81V 08S SpaceTREx SHAB-7V" +2021-11-07 23:59:31,2021-11-07 23:59:31,32.61567,-106.58183,24,79,18804.33,"181TxC 11.50C 60.23hPa 6.80V 09S SpaceTREx SHAB-7V" +2021-11-07 23:59:49,2021-11-07 23:59:49,32.61583,-106.58050,24,78,18787.26,"181TxC 10.40C 60.00hPa 6.81V 08" +2021-11-08 00:00:07,2021-11-08 00:00:07,32.61600,-106.57917,26,82,18772.33,"181TxC 8.60C 59.27hPa 6.81V 07" +2021-11-08 00:00:25,2021-11-08 00:00:25,32.61633,-106.57783,24,78,18757.70,"181TxC 7.00C 58.63hPa 6.80V 09" +2021-11-08 00:00:43,2021-11-08 00:00:43,32.61650,-106.57650,24,78,18747.64,"181TxC 5.70C 58.17hPa 6.80V 10" +2021-11-08 00:01:01,2021-11-08 00:01:02,32.61667,-106.57517,24,85,18740.32,"181TxC 4.40C 57.78hPa 6.81V 07S SpaceTREx SHAB-7V" +2021-11-08 00:01:19,2021-11-08 00:01:19,32.61683,-106.57367,28,88,18726.00,"181TxC 4.40C 58.12hPa 6.80V 08" +2021-11-08 00:01:37,2021-11-08 00:01:37,32.61683,-106.57217,31,93,18717.16,"181TxC 2.90C 57.15hPa 6.80V 07S SpaceTREx SHAB-7V" +2021-11-08 00:01:55,2021-11-08 00:01:55,32.61667,-106.57033,31,91,18684.85,"181TxC 5.60C 59.08hPa 6.80V 06S SpaceTREx SHAB-7V" +2021-11-08 00:02:13,2021-11-08 00:02:13,32.61667,-106.56867,31,89,18665.34,"181TxC 5.40C 59.29hPa 6.80V 07" +2021-11-08 00:02:31,2021-11-08 00:02:31,32.61667,-106.56683,33,89,18650.41,"182TxC 4.50C 59.06hPa 6.80V 07" +2021-11-08 00:02:49,2021-11-08 00:02:49,32.61667,-106.56517,33,85,18619.93,"182TxC 2.70C 58.52hPa 6.80V 07S SpaceTREx SHAB-7V" +2021-11-08 00:03:07,2021-11-08 00:03:07,32.61683,-106.56333,31,82,18596.46,"182TxC 0.50C 57.66hPa 6.80V 08S SpaceTREx SHAB-7V" +2021-11-08 00:03:25,2021-11-08 00:03:25,32.61700,-106.56150,33,80,18573.60,"182TxC -0.90C 57.40hPa 6.80V 07" +2021-11-08 00:03:43,2021-11-08 00:03:43,32.61717,-106.55983,31,79,18544.64,"182TxC -1.90C 57.15hPa 6.81V 09" +2021-11-08 00:04:01,2021-11-08 00:04:01,32.61750,-106.55800,31,84,18510.81,"182TxC -3.10C 56.88hPa 6.81V 07" +2021-11-08 00:04:19,2021-11-08 00:04:19,32.61767,-106.55633,31,85,18503.80,"182TxC -4.40C 56.48hPa 6.81V 07" +2021-11-08 00:04:37,2021-11-08 00:04:37,32.61767,-106.55467,28,89,18487.95,"182TxC -6.40C 55.83hPa 6.81V 08" +2021-11-08 00:04:55,2021-11-08 00:04:55,32.61783,-106.55317,28,87,18455.64,"182TxC -3.00C 57.71hPa 6.81V 07" +2021-11-08 00:05:13,2021-11-08 00:05:13,32.61783,-106.55183,26,82,18448.63,"182TxC -1.00C 58.67hPa 6.80V 10" +2021-11-08 00:05:31,2021-11-08 00:05:31,32.61800,-106.55033,24,79,18430.04,"183TxC 0.50C 59.52hPa 6.80V 09" +2021-11-08 00:05:49,2021-11-08 00:05:49,32.61817,-106.54917,24,78,18437.66,"183TxC 1.90C 60.49hPa 6.80V 10" +2021-11-08 00:06:07,2021-11-08 00:06:07,32.61833,-106.54783,24,80,18449.85,"183TxC 5.60C 61.90hPa 6.80V 09" +2021-11-08 00:06:25,2021-11-08 00:06:25,32.61867,-106.54650,24,77,18449.24,"183TxC 8.50C 63.15hPa 6.78V 08" +2021-11-08 00:06:43,2021-11-08 00:06:44,32.61883,-106.54517,24,79,18445.28,"183TxC 10.10C 63.89hPa 6.78V 09S SpaceTREx SHAB-7V" +2021-11-08 00:07:01,2021-11-08 00:07:02,32.61883,-106.54400,26,84,18434.00,"183TxC 10.90C 64.35hPa 6.78V 09S SpaceTREx SHAB-7V" +2021-11-08 00:07:19,2021-11-08 00:07:20,32.61900,-106.54267,2,84,18413.58,"183TxC 11.10C 64.58hPa 6.78V 08S SpaceTREx SHAB-7V" +2021-11-08 00:07:37,2021-11-08 00:07:38,32.61883,-106.54117,26,93,18385.23,"183TxC 11.50C 65.81hPa 6.78V 07S SpaceTREx SHAB-7V" +2021-11-08 00:07:55,2021-11-08 00:07:55,32.61883,-106.53967,28,94,18341.34,"183TxC 12.40C 66.46hPa 6.78V 08" +2021-11-08 00:08:13,2021-11-08 00:08:13,32.61867,-106.53833,22,91,18308.73,"183TxC 11.70C 66.16hPa 6.78V 09" +2021-11-08 00:08:31,2021-11-08 00:08:32,32.61867,-106.53717,19,85,18270.63,"184TxC 11.70C 66.59hPa 6.78V 09S SpaceTREx SHAB-7V" +2021-11-08 00:08:49,2021-11-08 00:08:49,32.61867,-106.53600,22,93,18238.62,"184TxC 11.20C 67.30hPa 6.78V 06" +2021-11-08 00:09:07,2021-11-08 00:09:07,32.61867,-106.53467,24,89,18213.93,"184TxC 8.50C 66.24hPa 6.78V 06" +2021-11-08 00:09:25,2021-11-08 00:09:25,32.61833,-106.53317,24,89,18178.27,"184TxC 5.80C 65.37hPa 6.78V 07" +2021-11-08 00:09:43,2021-11-08 00:09:43,32.61817,-106.53167,31,96,18145.66,"184TxC 3.00C 64.53hPa 6.78V 07" +2021-11-08 00:10:01,2021-11-08 00:10:02,32.61800,-106.53000,33,102,18093.23,"184TxC 1.00C 64.03hPa 6.78V 07S SpaceTREx SHAB-7V" +2021-11-08 00:10:19,2021-11-08 00:10:19,32.61767,-106.52817,37,100,18065.80,"184TxC 1.50C 64.81hPa 6.78V 06S SpaceTREx SHAB-7V" +2021-11-08 00:10:37,2021-11-08 00:10:37,32.61733,-106.52617,43,99,18028.31,"184TxC -0.60C 63.97hPa 6.78V 07" +2021-11-08 00:10:55,2021-11-08 00:10:55,32.61700,-106.52383,46,96,17992.65,"184TxC -0.80C 64.67hPa 6.78V 07" +2021-11-08 00:11:13,2021-11-08 00:11:13,32.61667,-106.52133,52,101,17958.82,"184TxC -1.70C 64.62hPa 6.78V 07" +2021-11-08 00:11:31,2021-11-08 00:11:32,32.61633,-106.51850,54,101,17931.69,"185TxC -2.80C 64.63hPa 6.78V 06S SpaceTREx SHAB-7V" +2021-11-08 00:11:49,2021-11-08 00:11:49,32.61583,-106.51567,57,102,17896.94,"185TxC -5.30C 63.57hPa 6.80V 07" +2021-11-08 00:12:07,2021-11-08 00:12:07,32.61533,-106.51267,61,100,17860.67,"185TxC -3.60C 65.10hPa 6.78V 09" +2021-11-08 00:12:25,2021-11-08 00:12:25,32.61500,-106.50917,67,97,17826.53,"185TxC -4.40C 65.21hPa 6.78V 07" +2021-11-08 00:12:46,2021-11-08 00:12:46,32.61467,-106.50550,74,95,17795.75,"185TxC -5.50C 65.06hPa 6.78V 07S SpaceTREx SHAB-7V" +2021-11-08 00:13:01,2021-11-08 00:13:01,32.61450,-106.50150,74,88,17758.56,"185TxC -8.80C 63.85hPa 6.78V 06" +2021-11-08 00:13:37,2021-11-08 00:13:37,32.61467,-106.49367,78,83,17676.57,"185TxC -9.80C 64.42hPa 6.78V 06" +2021-11-08 00:13:55,2021-11-08 00:13:56,32.61517,-106.48950,80,77,17638.47,"185TxC -10.40C 65.02hPa 6.80V 06S SpaceTREx SHAB-7V" +2021-11-08 00:14:13,2021-11-08 00:14:13,32.61617,-106.48517,80,72,17593.06,"185TxC -12.00C 64.64hPa 6.80V 07" +2021-11-08 00:14:31,2021-11-08 00:14:31,32.61717,-106.48117,78,77,17563.80,"186TxC -13.10C 64.67hPa 6.80V 08" +2021-11-08 00:14:49,2021-11-08 00:14:49,32.61783,-106.47717,74,77,17534.84,"186TxC -14.60C 64.48hPa 6.81V 06S SpaceTREx SHAB-7V" +2021-11-08 00:15:07,2021-11-08 00:15:07,32.61850,-106.47333,69,78,17481.80,"186TxC -14.70C 64.91hPa 6.80V 06" +2021-11-08 00:15:25,2021-11-08 00:15:25,32.61950,-106.46983,72,75,17459.86,"186TxC -17.30C 63.87hPa 6.80V 07S SpaceTREx SHAB-7V" +2021-11-08 00:15:44,2021-11-08 00:15:44,32.62050,-106.46617,72,67,17409.87,"186TxC -15.50C 65.60hPa 6.80V 05" +2021-11-08 00:16:01,2021-11-08 00:16:01,32.62150,-106.46283,65,71,17367.20,"186TxC -14.80C 66.89hPa 6.78V 06" +2021-11-08 00:16:19,2021-11-08 00:16:19,32.62250,-106.45967,61,72,17317.21,"186TxC -14.50C 67.71hPa 6.78V 08" +2021-11-08 00:16:37,2021-11-08 00:16:37,32.62333,-106.45650,59,75,17264.18,"186TxC -17.40C 66.77hPa 6.80V 08S SpaceTREx SHAB-7V" +2021-11-08 00:16:55,2021-11-08 00:16:55,32.62383,-106.45333,59,80,17221.50,"186TxC -15.10C 69.19hPa 6.78V 07" +2021-11-08 00:17:13,2021-11-08 00:17:13,32.62417,-106.45017,59,85,17166.34,"186TxC -16.90C 68.72hPa 6.78V 08S SpaceTREx SHAB-7V" +2021-11-08 00:17:31,2021-11-08 00:17:31,32.62433,-106.44717,57,86,17121.84,"187TxC -16.10C 70.09hPa 6.80V 05" +2021-11-08 00:17:49,2021-11-08 00:17:49,32.62483,-106.44400,57,79,17058.13,"187TxC -16.00C 70.78hPa 6.78V 07" +2021-11-08 00:18:07,2021-11-08 00:18:07,32.62533,-106.44100,61,77,17023.38,"187TxC -15.80C 72.03hPa 6.78V 06" +2021-11-08 00:18:25,2021-11-08 00:18:25,32.62583,-106.43800,57,77,16967.30,"187TxC -17.20C 72.36hPa 6.80V 07S SpaceTREx SHAB-7V" +2021-11-08 00:18:43,2021-11-08 00:18:43,32.62650,-106.43467,61,76,16924.02,"187TxC -19.50C 71.66hPa 6.80V 08" +2021-11-08 00:19:01,2021-11-08 00:19:01,32.62733,-106.43167,61,73,16883.18,"187TxC -19.40C 72.74hPa 6.80V 06" +2021-11-08 00:19:19,2021-11-08 00:19:19,32.62817,-106.42850,61,68,16844.77,"187TxC -18.70C 73.72hPa 6.80V 09" +2021-11-08 00:19:37,2021-11-08 00:19:37,32.62917,-106.42550,56,72,16813.68,"187TxC -19.60C 73.86hPa 6.78V 08" +2021-11-08 00:19:55,2021-11-08 00:19:55,32.63000,-106.42233,59,71,16760.04,"187TxC -19.80C 74.45hPa 6.78V 07" +2021-11-08 00:20:13,2021-11-08 00:20:13,32.63100,-106.41917,63,72,16728.03,"187TxC -20.10C 75.05hPa 6.78V 09" +2021-11-08 00:20:49,2021-11-08 00:20:49,32.63300,-106.41200,76,70,16665.24,"188TxC -22.20C 75.35hPa 6.78V 08" +2021-11-08 00:21:07,2021-11-08 00:21:07,32.63417,-106.40800,80,71,16630.19,"188TxC -23.30C 75.71hPa 6.78V 07" +2021-11-08 00:21:25,2021-11-08 00:21:25,32.63550,-106.40400,81,69,16580.51,"188TxC -25.00C 75.87hPa 6.80V 08" +2021-11-08 00:21:43,2021-11-08 00:21:43,32.63683,-106.39983,81,66,16502.79,"188TxC -25.50C 76.53hPa 6.80V 08" +2021-11-08 00:22:01,2021-11-08 00:22:01,32.63850,-106.39583,83,62,16466.21,"188TxC -26.90C 76.88hPa 6.78V 08" +2021-11-08 00:22:19,2021-11-08 00:22:19,32.64017,-106.39200,80,64,16411.35,"188TxC -28.00C 78.83hPa 6.80V 07" +2021-11-08 00:22:37,2021-11-08 00:22:37,32.64183,-106.38833,74,63,16361.05,"188TxC -29.00C 79.76hPa 6.78V 08" +2021-11-08 00:22:55,2021-11-08 00:22:55,32.64317,-106.38467,69,64,16313.20,"188TxC -29.90C 80.49hPa 6.80V 09S SpaceTREx SHAB-7V" +2021-11-08 00:23:13,2021-11-08 00:23:13,32.64450,-106.38133,67,62,16252.85,"188TxC -31.00C 82.17hPa 6.78V 06S SpaceTREx SHAB-7V" +2021-11-08 00:23:51,2021-11-08 00:25:51,32.64717,-106.37483,67,59,16040.71,"189TxC -36.10C 85.38hPa 6.73V 08S SpaceTREx SHAB-7V" +2021-11-08 00:29:41,2021-11-08 00:29:41,32.66933,-106.29050,96,74,12145.98,"189TxC -39.80C 192.68hPa 6.81V 04S SpaceTREx SHAB-7V" +2021-11-08 00:31:15,2021-11-08 00:31:15,32.67317,-106.26433,81,78,11170.01,"189TxC -38.80C 222.31hPa 6.65V 05S SpaceTREx SHAB-7V" +2021-11-08 00:31:33,2021-11-08 00:31:33,32.67383,-106.25967,93,76,11002.98,"189TxC -38.40C 228.19hPa 6.52V 09S SpaceTREx SHAB-7V" +2021-11-08 00:31:51,2021-11-08 00:31:51,32.67433,-106.25483,98,83,10826.50,"189TxC -37.90C 234.26hPa 5.69V 06" +2021-11-08 00:32:09,2021-11-08 00:32:09,32.67400,-106.25167,80,88,10468.05,"190TxC -37.30C 240.82hPa 6.39V 05" +2021-11-08 00:32:29,2021-11-08 00:32:29,32.67517,-106.24367,100,87,10582.35,"190TxC -36.50C 247.89hPa 6.55V 07" +2021-11-08 00:32:47,2021-11-08 00:32:47,32.67567,-106.23883,96,83,10290.35,"190TxC -35.90C 254.53hPa 6.60V 05" +2021-11-08 00:33:05,2021-11-08 00:33:05,32.67617,-106.23367,89,86,10115.70,"190TxC -35.20C 261.05hPa 6.62V 06" +2021-11-08 00:33:23,2021-11-08 00:33:23,32.67650,-106.22850,93,88,9944.10,"190TxC -34.60C 267.84hPa 6.65V 06" +2021-11-08 00:33:41,2021-11-08 00:33:41,32.67700,-106.22367,85,86,9786.82,"190TxC -33.90C 274.70hPa 6.47V 09S SpaceTREx SHAB-7V" +2021-11-08 00:34:02,2021-11-08 00:34:02,32.67750,-106.21900,91,80,9652.41,"190TxC -33.20C 280.33hPa 6.60V 09S SpaceTREx SHAB-7V" +2021-11-08 00:34:17,2021-11-08 00:34:17,32.67800,-106.21433,83,83,9515.25,"190TxC -32.70C 286.18hPa 6.65V 07S SpaceTREx SHAB-7V" +2021-11-08 00:34:35,2021-11-08 00:34:35,32.67867,-106.20983,87,78,9375.34,"190TxC -32.20C 291.98hPa 6.67V 06" +2021-11-08 00:35:29,2021-11-08 00:35:29,32.68150,-106.19617,91,72,8978.49,"191TxC -31.20C 310.76hPa 6.68V 09" +2021-11-08 00:35:48,2021-11-08 00:35:48,32.68217,-106.19133,89,79,8831.58,"191TxC -30.70C 317.70hPa 6.68V 08S SpaceTREx SHAB-7V" +2021-11-08 00:36:05,2021-11-08 00:36:05,32.68300,-106.18683,87,78,8689.24,"191TxC -30.00C 324.73hPa 6.70V 07S SpaceTREx SHAB-7V" +2021-11-08 00:36:23,2021-11-08 00:36:23,32.68367,-106.18233,87,80,8546.59,"191TxC -29.20C 331.93hPa 6.70V 09" +2021-11-08 00:36:41,2021-11-08 00:36:41,32.68400,-106.17767,85,85,8411.57,"191TxC -28.30C 339.17hPa 6.70V 07S SpaceTREx SHAB-7V" +2021-11-08 00:37:18,2021-11-08 00:37:18,32.68450,-106.16900,78,85,8110.73,"191TxC -26.60C 354.17hPa 6.72V 09S SpaceTREx SHAB-7V" +2021-11-08 00:37:53,2021-11-08 00:37:53,32.68533,-106.16100,72,82,7845.86,"191TxC -25.10C 369.25hPa 6.73V 07S SpaceTREx SHAB-7V" +2021-11-08 00:38:11,2021-11-08 00:38:11,32.68600,-106.15700,76,80,7713.27,"192TxC -24.30C 376.73hPa 6.72V 09" +2021-11-08 00:38:47,2021-11-08 00:38:47,32.68733,-106.14867,78,76,7433.77,"192TxC -22.40C 392.42hPa 6.72V 09" +2021-11-08 00:39:05,2021-11-08 00:39:05,32.68800,-106.14467,74,78,7287.46,"192TxC -21.40C 400.50hPa 6.72V 07S SpaceTREx SHAB-7V" +2021-11-08 00:39:23,2021-11-08 00:39:23,32.68850,-106.14100,69,81,7160.06,"192TxC -20.60C 408.09hPa 6.72V 08S SpaceTREx SHAB-7V" +2021-11-08 00:39:41,2021-11-08 00:39:41,32.68900,-106.13750,59,80,7028.99,"192TxC -19.70C 416.49hPa 6.72V 10S SpaceTREx SHAB-7V" +2021-11-08 00:40:17,2021-11-08 00:40:17,32.68967,-106.13133,59,79,6744.31,"192TxC -17.80C 432.83hPa 6.72V 10S SpaceTREx SHAB-7V" +2021-11-08 00:40:35,2021-11-08 00:40:35,32.69033,-106.12817,59,76,6630.31,"192TxC -16.70C 441.07hPa 6.70V 10S SpaceTREx SHAB-7V" +2021-11-08 00:40:53,2021-11-08 00:40:53,32.69083,-106.12533,54,79,6479.74,"192TxC -15.70C 449.41hPa 6.70V 09S SpaceTREx SHAB-7V" +2021-11-08 00:41:12,2021-11-08 00:41:12,32.69133,-106.12250,54,76,6347.16,"193TxC -14.50C 457.82hPa 6.70V 08S SpaceTREx SHAB-7V" +2021-11-08 00:41:29,2021-11-08 00:41:29,32.69183,-106.11967,52,73,6211.82,"193TxC -13.40C 466.39hPa 6.68V 08S SpaceTREx SHAB-7V" +2021-11-08 00:41:47,2021-11-08 00:41:47,32.69267,-106.11700,50,71,6073.75,"193TxC -12.20C 475.34hPa 6.70V 09" +2021-11-08 00:42:05,2021-11-08 00:42:05,32.69333,-106.11450,46,73,5940.55,"193TxC -11.00C 484.35hPa 6.70V 09" +2021-11-08 00:42:25,2021-11-08 00:42:25,32.69383,-106.11233,44,70,5811.93,"193TxC -9.80C 493.06hPa 6.70V 09S SpaceTREx SHAB-7V" +2021-11-08 00:42:42,2021-11-08 00:42:42,32.69450,-106.11000,39,75,5676.90,"193TxC -8.70C 501.67hPa 6.70V 09S SpaceTREx SHAB-7V" +2021-11-08 00:42:59,2021-11-08 00:43:00,32.69500,-106.10800,37,69,5546.45,"193TxC -7.50C 510.58hPa 6.58V 09S SpaceTREx SHAB-7V" +2021-11-08 00:43:17,2021-11-08 00:43:17,32.69567,-106.10617,35,72,5420.87,"193TxC -6.30C 519.36hPa 6.60V 10S SpaceTREx SHAB-7V" +2021-11-08 00:43:35,2021-11-08 00:43:35,32.69600,-106.10450,31,69,5302.30,"193TxC -5.20C 527.97hPa 6.52V 07S SpaceTREx SHAB-7V" +2021-11-08 00:43:53,2021-11-08 00:43:53,32.69650,-106.10317,24,65,5193.79,"193TxC -4.20C 536.21hPa 6.39V 07S SpaceTREx SHAB-7V" +2021-11-08 00:44:12,2021-11-08 00:44:12,32.69667,-106.10217,17,89,5058.16,"194TxC -3.30C 544.55hPa 6.57V 09S SpaceTREx SHAB-7V" +2021-11-08 00:44:29,2021-11-08 00:44:29,32.69667,-106.10117,15,96,4950.87,"194TxC -2.30C 552.84hPa 6.60V 11S SpaceTREx SHAB-7V" +2021-11-08 00:44:47,2021-11-08 00:44:47,32.69650,-106.10033,17,101,4850.89,"194TxC -1.30C 560.80hPa 6.62V 10S SpaceTREx SHAB-7V" +2021-11-08 00:45:05,2021-11-08 00:45:05,32.69633,-106.09967,15,99,4739.64,"194TxC -0.50C 567.88hPa 6.63V 07S SpaceTREx SHAB-7V" +2021-11-08 00:46:00,2021-11-08 00:46:00,32.69633,-106.09783,17,85,4447.64,"194TxC 1.00C 590.12hPa 6.67V 11S SpaceTREx SHAB-7V" +2021-11-08 00:46:17,2021-11-08 00:46:17,32.69650,-106.09667,20,71,4358.03,"194TxC 1.40C 597.70hPa 6.67V 08S SpaceTREx SHAB-7V" +2021-11-08 00:46:36,2021-11-08 00:46:36,32.69683,-106.09567,22,60,4248.30,"194TxC 1.80C 605.09hPa 6.68V 09S SpaceTREx SHAB-7V" +2021-11-08 00:46:53,2021-11-08 00:46:53,32.69750,-106.09450,26,53,4145.58,"194TxC 2.40C 613.55hPa 6.68V 08S SpaceTREx SHAB-7V" +2021-11-08 00:47:11,2021-11-08 00:47:11,32.69817,-106.09333,24,54,4026.71,"195TxC 3.00C 622.30hPa 6.68V 08S SpaceTREx SHAB-7V" +2021-11-08 00:47:29,2021-11-08 00:47:29,32.69883,-106.09233,22,48,3927.96,"195TxC 3.60C 630.74hPa 6.70V 09S SpaceTREx SHAB-7V" +2021-11-08 00:48:05,2021-11-08 00:48:05,32.70033,-106.09067,22,38,3706.06,"195TxC 5.40C 648.21hPa 6.70V 07S SpaceTREx SHAB-7V" +2021-11-08 00:48:41,2021-11-08 00:48:41,32.70183,-106.08900,22,46,3508.55,"195TxC 7.00C 664.18hPa 6.70V 08S SpaceTREx SHAB-7V" +2021-11-08 00:48:59,2021-11-08 00:48:59,32.70267,-106.08800,22,54,3437.23,"195TxC 7.60C 670.58hPa 6.67V 07S SpaceTREx SHAB-7V" +2021-11-08 00:49:17,2021-11-08 00:49:17,32.70317,-106.08717,19,55,3364.08,"195TxC 8.00C 677.71hPa 6.68V 10S SpaceTREx SHAB-7V" +2021-11-08 00:50:12,2021-11-08 00:50:12,32.70500,-106.08483,15,48,3056.23,"196TxC 8.80C 702.32hPa 6.70V 11S SpaceTREx SHAB-7V" +2021-11-08 00:50:48,2021-11-08 00:50:48,32.70617,-106.08333,19,49,2870.00,"196TxC 10.30C 720.98hPa 6.70V 10S SpaceTREx SHAB-7V" +2021-11-08 00:51:07,2021-11-08 00:51:07,32.70667,-106.08267,15,61,2755.39,"196TxC 11.20C 730.89hPa 6.70V 11S SpaceTREx SHAB-7V" +2021-11-08 00:51:59,2021-11-08 00:51:59,32.70783,-106.08067,15,53,2441.45,"196TxC 14.00C 758.77hPa 6.72V 08S SpaceTREx SHAB-7V" +2021-11-08 00:52:35,2021-11-08 00:52:35,32.70900,-106.07933,15,47,2221.08,"196TxC 15.90C 779.93hPa 6.72V 07S SpaceTREx SHAB-7V" +2021-11-08 00:53:11,2021-11-08 00:53:11,32.71033,-106.07783,22,37,1993.39,"197TxC 18.00C 802.03hPa 6.72V 07S SpaceTREx SHAB-7V" +2021-11-08 00:53:29,2021-11-08 00:53:29,32.71117,-106.07717,22,33,1890.67,"197TxC 19.00C 812.50hPa 6.72V 09S SpaceTREx SHAB-7V" +2021-11-08 00:53:47,2021-11-08 00:53:47,32.71217,-106.07633,22,35,1784.30,"197TxC 20.00C 822.86hPa 6.72V 07S SpaceTREx SHAB-7V" +2021-11-08 00:54:23,2021-11-08 00:54:23,32.71400,-106.07517,24,24,1564.84,"197TxC 21.90C 844.32hPa 6.73V 09S SpaceTREx SHAB-7V" diff --git a/config_earth.py b/config_earth.py index ed1720d..cdd98e1 100644 --- a/config_earth.py +++ b/config_earth.py @@ -4,6 +4,7 @@ balloon_properties = dict( shape = 'sphere', +<<<<<<< HEAD d = 5.8, # (m) Diameter of Sphere Balloon mp = 1.15, # (kg) Mass of Payload areaDensityEnv = 939.*7.87E-6, # (Kg/m^2) rhoEnv*envThickness @@ -33,11 +34,87 @@ simulation = dict( start_time = start_time, # (UTC) Simulation Start Time, updated above sim_time = 16, # (hours) Simulation time in hours (for trapezoid.py) +======= + d = 6, # (m) Diameter of Sphere Balloon + mp = 0.7, # (kg) Mass of Payload + areaDensityEnv = 939.*7.87E-6, # (Kg/m^2) rhoEnv*envThickness + mEnv = 2.0, # (kg) Mass of Envelope - SHAB1 + cp = 2000., # (J/(kg K)) Specific heat of envelope material + absEnv = .98, # Absorbiviy of envelope material + emissEnv = .95, # Emisivity of enevelope material + Upsilon = 4.5, # Ascent Resistance coefficient +) + +#forecast_start_time = "2021-03-29 12:00:00" # Forecast start time, should match a downloaded forecast +#start_time = datetime.fromisoformat("2021-03-29 11:32:00") # Simulation start time. The end time needs to be within the downloaded forecast +#balloon_trajectory = None + +#SHAB10 +#forecast_start_time = "2022-04-09 12:00:00" # Forecast start time, should match a downloaded forecast +#start_time = datetime.fromisoformat("2022-04-09 18:14:00") # Simulation start time. The end time needs to be within the downloaded forecast +#balloon_trajectory = "balloon_data/SHAB10V-APRS.csv" # Only Accepting Files in the Standard APRS.fi format for now + +#SHAB3 +#forecast_start_time = "2020-11-20 06:00:00" # Forecast start time, should match a downloaded forecast in the forecasts directory +#start_time = datetime.fromisoformat("2020-11-20 15:47:00") # Simulation start time. The end time needs to be within the downloaded forecast +#balloon_trajectory = "balloon_data/SHAB3V-APRS.csv" # Only Accepting Files in the Standard APRS.fi format for now + +#SHAB5 +#forecast_start_time = "2021-05-12 12:00:00" # Forecast start time, should match a downloaded forecast in the forecasts directory +#start_time = datetime.fromisoformat("2021-05-12 14:01:00") # Simulation start time. The end time needs to be within the downloaded forecast +#balloon_trajectory = "balloon_data/SHAB5V_APRS_Processed.csv" # Only Accepting Files in the Standard APRS.fi format for now + +#SHAB14-V Example for EarthSHAB software +forecast_start_time = "2022-08-22 12:00:00" # Forecast start time, should match a downloaded forecast in the forecasts directory +start_time = datetime.fromisoformat("2022-08-22 14:01:00") # Simulation start time. The end time needs to be within the downloaded forecast +balloon_trajectory = "balloon_data/SHAB12V-APRS.csv" # Only Accepting Files in the Standard APRS.fi format for now + +#Hawaii +#forecast_start_time = "2023-04-18 00:00:00" # Forecast start time, should match a downloaded forecast +#start_time = datetime.fromisoformat("2023-04-18 18:00:00") # Simulation start time. The end time needs to be within the downloaded forecast +#balloon_trajectory = None # Only Accepting Files in the Standard APRS.fi format for now + + +forecast = dict( + forecast_type = "GFS", # GFS or ERA5 + forecast_start_time = forecast_start_time, # Forecast start time, should match a downloaded forecast in the forecasts directory + GFSrate = 60, # (s) After how many iterated dt steps are new wind speeds are looked up +) + +#These parameters are for both downloading new forecasts, and running simulations with downloaded forecasts. +netcdf_gfs = dict( + #DO NOT CHANGE + nc_file = ("forecasts/gfs_0p25_" + forecast['forecast_start_time'][0:4] + forecast['forecast_start_time'][5:7] + forecast['forecast_start_time'][8:10] + "_" + forecast['forecast_start_time'][11:13] + ".nc"), # DO NOT CHANGE - file structure for downloading .25 resolution NOAA forecast data. + nc_start = datetime.fromisoformat(forecast['forecast_start_time']), # DO NOT CHANGE - Start time of the downloaded netCDF file + hourstamp = forecast['forecast_start_time'][11:13], # parsed from gfs timestamp + + res = 0.25, # (deg) DO NOT CHANGE + + #The following values are for savenetcdf.py for forecast downloading and saving + lat_range = 40, # (.25 deg) + lon_range= 60, # (.25 deg) + download_days = 1, # (1-10) Number of days to download for forecast This value is only used in saveNETCDF.py +) + +netcdf_era5 = dict( + #filename = "SHAB3V_era_20201120_20201121.nc", #SHAB3 + #filename = "SHAB5V-ERA5_20210512_20210513.nc", #SHAB5V + #filename = "shab10_era_2022-04-09to2022-04-10.nc", #SHAB10V + filename = "SHAB12V_ERA5_20220822_20220823.nc", #SHAB12/13/14/15V + #filename = "hawaii-ERA5-041823.nc", + resolution_hr = 1 + ) + +simulation = dict( + start_time = start_time, # (UTC) Simulation Start Time, updated above + sim_time = 15, # (int) (hours) Number of hours to simulate +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 vent = 0.0, # (kg/s) Vent Mass Flow Rate (Do not have an accurate model of the vent yet, this is innacurate) alt_sp = 15000.0, # (m) Altitude Setpoint v_sp = 0., # (m/s) Altitude Setpoint, Not Implemented right now start_coord = { +<<<<<<< HEAD "lat": 39.828, # (deg) Latitude "lon": -98.5795, # (deg) Longitude "alt": 408., # (m) Elevation @@ -49,6 +126,18 @@ GFS = dict( GFSrate = 60, # (#) After how many iterated dt steps are new wind speeds are looked up +======= + "lat": 34.60, #33.66, #21.4, # 34.60, # (deg) Latitude + "lon": -106.80, #-114.22, #-158, #-106.80, # (deg) Longitude + "alt": 1000., # (m) Elevation + "timestamp": start_time, # current timestamp + }, + min_alt = 1000., # starting altitude. Generally the same as initial coordinate + float = 23000, # for simulating in trapezoid.py + dt = 1.0, # (s) Integration timestep for simulation (If error's occur, use a lower step size) + + balloon_trajectory = balloon_trajectory # Default is None. Only accepting trajectories in aprs.fi csv format. +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 ) earth_properties = dict( @@ -59,7 +148,10 @@ emissGround = .95, # assumption albedo = 0.17, # assumption ) +<<<<<<< HEAD dt = 3.0 # (s) Time Step for integrating (If error's occur, use a lower step size) +======= +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 diff --git a/craig_files/ERA5.py b/craig_files/ERA5.py new file mode 100644 index 0000000..7dcfd5a --- /dev/null +++ b/craig_files/ERA5.py @@ -0,0 +1,711 @@ +""" +This version was tailored to work with the flight_simulater.py +and trapezoid_era.py. program. + +Version 1.2 (02-25-2022) +Authors: MR and CEM +""" +import logging +import numpy as np +import netCDF4 +from termcolor import colored +import math +from geographiclib.geodesic import Geodesic +import sys +import os +import mathtime_utilities as mt +from scipy import interpolate +import properties.era5_properties as netcdf_prop + +logging.basicConfig(filename='era5.log', + level=logging.WARNING, # Changed from Info for Demo + format='%(asctime)s | %(levelname)s | %(message)s', + datefmt="%Y-%m-%d %H:%M") + +class ERA5: + def __init__(self, start_coord, end_coord, input_file, dt_sec, sim_time_hours, use_time): + """Create a class object containing information about an ERA5. Along the way, + it checks whether it can take a subset of your model data. For example, if you have + data before or after your simulation times, you can ignore these data through saving + indexes. + + Parameters + ---------- + start_coord : dict + Contains information about the starting location. + end_coord : dict + Contains information about the ending location, can contain + all None or empty values + input_file : str + file name of NetCDF ERA5 climate data. Its name is relative to + where the code is run from. + dt_sec : float + Sampling rate of simulation in seconds + sim_time_hours : integer or None + Number of hours to do simulation, can be None, then will try to + get simulation time off of start_coord - end_coord + use_time: boolean + When false don't extract time variable from the NETCDF data + + Returns + ------- + ERA5 : Class Object + Object with our NetCDF data. + + Notes + ----- + Similar to class GFS which stores NOAA GFS data from NOMAD server + + See Also + -------- + GFS + """ + + file_path = os.path.realpath(__file__) + logging.debug(f"Initializing ERA5 class in File path = {file_path}") + full_file_path = netcdf_prop.forecast_dir + input_file + + try: + logging.debug(f" Extracting netCDF data from {full_file_path}") + self.file = netCDF4.Dataset(full_file_path, 'r') + except: + logging.error(f'Unable to locate netcdf file {full_file_path}, terminating program') + logging.debug(f'Unable to locate netcdf file {full_file_path}, terminating program') + sys.exit(1) + + self.geod = Geodesic.WGS84 + self.resolution_hr = netcdf_prop.netcdf["resolution_hr"] + self.num_model_hrs = sim_time_hours + if use_time: + self.init_with_time(start_coord, end_coord, dt_sec, sim_time_hours) + else: + self.init_without_time(start_coord, end_coord, dt_sec, sim_time_hours) + + + + def init_without_time(self, start_coord, end_coord, dt_sec, sim_time_hours): # modded the number of varibales for troubleshootin + ''' adds to class object containing information about an ERA5 but without any time + variables. + + Parameters + ---------- + start_coord : dict + Contains information about the starting location. + end_coord : dict + Contains information about the ending location, can contain + all None or empty values + dt_sec : float + Sampling rate of simulation in seconds + + Returns + ------- + ERA5 : ERA5 Class Object + Initialize class objectwith our NetCDF data. + + Notes + ----- + Similar to class GFS which stores NOAA GFS data from NOMAD server + + See Also + -------- + + ''' + logging.debug("Now saving model data independent of time. Happens when we use time averaged data.") + print("Now saving model data independent of time. Happens when we use time averaged data.") + + + balloon_launch_time = start_coord['timestamp'] + balloon_last_time = end_coord['end_datetime'] + + logging.debug(f"Ballon flight times are from {balloon_launch_time} to {balloon_last_time}") + logging.info(f"Ballon flight times are from {balloon_launch_time} to {balloon_last_time}") + print(f"Ballon flight times are from {balloon_launch_time} to {balloon_last_time}") + print(f"Ballon flight times are from {balloon_launch_time} to {balloon_last_time}") + + self.start_coord = start_coord + self.min_alt_m = start_coord['alt_m'] + + # Initialize min/max lat/lon index values from netcdf4 subset + + # Determine Index values from netcdf4 subset + lla = self.file.variables['u'][0, :, :] + self.latlon_index_range(lla) + logging.debug(f"By default will use the following latitude index boundaries: {self.lat_top_idx}, {self.lat_bot_idx}") + logging.debug(f"In degrees this covers : {self.file.variables['latitude'][self.lat_top_idx]} to {self.file.variables['latitude'][self.lat_bot_idx-1]}") + logging.debug(f"By default will use the following longitude index boundaries: {self.lon_left_idx}, {self.lon_right_idx}") + logging.debug(f"In degrees this covers : {self.file.variables['longitude'][self.lon_left_idx]} to {self.file.variables['longitude'][self.lon_right_idx-1]}") + print(f"By default will use the following latitude index boundaries: {self.lat_top_idx}, {self.lat_bot_idx}") + print(f"In degrees this covers : {self.file.variables['latitude'][self.lat_top_idx]} to {self.file.variables['latitude'][self.lat_bot_idx-1]} degrees") + print(f"By default will use the following longitude index boundaries: {self.lon_left_idx}, {self.lon_right_idx} degrees") + print(f"In degrees this covers : {self.file.variables['longitude'][self.lon_left_idx]} to {self.file.variables['longitude'][self.lon_right_idx-1]}") + + # smaller array of downloaded forecast subset + self.test = self.file.variables['latitude'] + logging.debug(f"Current shape of the latitude variable: {self.file.variables['latitude'].shape}") + self.lat = self.file.variables['latitude'][self.lat_top_idx:self.lat_bot_idx] + self.lon = self.file.variables['longitude'][self.lon_left_idx:self.lon_right_idx] + logging.debug(f"Final shape of the latitude variable: {self.lat.shape}") + + # min/max lat/lon degree values from netcdf4 subset + self.lat_bot_deg = self.file.variables['latitude'][self.lat_bot_idx-1] + self.lon_left_deg = self.file.variables['longitude'][self.lon_left_idx] + self.lat_top_deg = self.file.variables['latitude'][self.lat_top_idx] + self.lon_right_deg = self.file.variables['longitude'][self.lon_right_idx-1] + + message = "LAT RANGE - min:" + str(self.lat_bot_deg) + " max: " + str(self.lat_top_deg) + " size: " + str( + abs(self.lat_bot_idx - self.lat_top_idx)) + logging.info(message) + message = "LON RANGE - min:" + str(self.lon_left_deg) + " max: " + str(self.lon_right_deg) + " size: " + str( + abs(self.lon_left_idx - self.lon_right_idx)) + logging.info(message) + + # Import the netcdf4 subset to speed up table lookup in this script + self.levels = self.file.variables['level'][:] + level_dim, lat_dim, lon_dim = self.file.variables['u'].shape + + # currently, using balloon start and end time to get simulation points. + # should retest this method below to see if still works + if self.num_model_hrs != None: + simulation_points = int(self.num_model_hrs * int(3600 * (1 / dt_sec))) # Simulation time in seconds + else: + simulation_points = None + + + g = 9.80665 # gravitation constant used to convert geopotential height to height + logging.debug(f"Original model wind shape: {self.file.variables['u'].shape}") + self.ugdrps0 = self.file.variables['u'][:, self.lat_top_idx:self.lat_bot_idx, + self.lon_left_idx:self.lon_right_idx] + logging.debug(f"Reduced or final model wind shape: {self.ugdrps0.shape}") + self.vgdrps0 = self.file.variables['v'][:, self.lat_top_idx:self.lat_bot_idx, + self.lon_left_idx:self.lon_right_idx] + self.hgtprs = self.file.variables['z'][:, self.lat_top_idx:self.lat_bot_idx, + self.lon_left_idx:self.lon_right_idx] / g + + #self.temp0 = self.file.variables['t'][start_time_idx:end_time_idx+1, :, self.lat_top_idx:self.lat_bot_idx, + # self.lon_left_idx:self.lon_right_idx] + + logging.info("ERA5 Data Finished downloading.\n\n") + + + + def init_with_time(self, start_coord, end_coord, dt_sec, sim_time_hours): + ''' adds to class object containing information about an ERA5 but without any time + variables. + + Parameters + ---------- + start_coord : dict + Contains information about the starting location. + end_coord : dict + Contains information about the ending location, can contain + all None or empty values + dt_sec : float + Sampling rate of simulation in seconds + + Returns + ------- + ERA5 : ERA5 Class Object + Initialize class objectwith our NetCDF data. + + Notes + ----- + Similar to class GFS which stores NOAA GFS data from NOMAD server + + See Also + -------- + + ''' + try: + time_arr = self.file.variables['time'] # do not cast to numpy array yet, time units are different than in GFS + print(time_arr) + except: + time_arr = [0.00, 0.01] + time_convert = netCDF4.num2date(time_arr[:], time_arr.units, time_arr.calendar) + time_model = [] + + self.model_start_datetime = time_convert[0] + self.model_end_datetime = time_convert[-1] + + balloon_launch_time = start_coord['timestamp'] + balloon_last_time = end_coord['end_datetime'] + start_time_idx = 0 + + logging.debug(f"Original model start and times are {self.model_start_datetime} to {self.model_end_datetime}") + logging.debug(f"Balloon flight times are from {balloon_launch_time} to {balloon_last_time}") + logging.info(f"Model data spans the time from {time_convert[0]} to {time_convert[-1]}") + logging.info(f"Balloon flight times are from {balloon_launch_time} to {balloon_last_time}") + print(f"Model data spans the time from {time_convert[0]} to {time_convert[-1]}") + print(f"Balloon flight times are from {balloon_launch_time} to {balloon_last_time}") + + # Depending on the dates chosen, we can sometimes remove unused model data the is prior or after + # our simulation run as performed below + + original = self.model_start_datetime + for i in range(0, len(time_convert)): + logging.debug(f"Check if can remove model start times not used #{i}: model={time_convert[i]}, balloon start time: {balloon_launch_time}") + if time_convert[i] > balloon_launch_time: + start_time_idx = i-1 + logging.debug(f"Set model time index start to {start_time_idx} with model time of {time_convert[start_time_idx]}") + + if start_time_idx < 0: + start_time_idx = 0 # just make sure that your model data start isn't negative + logging.debug("Resetting model start time to first instance of model data, did you get the right model data?") + + self.model_start_datetime = time_convert[start_time_idx] + if original != self.model_start_datetime: + logging.debug(f"Changed model start time to {self.model_start_datetime} from {original}") + break + + if balloon_last_time == None: + logging.debug("Because you did not specify a balloon last time, run until hits ground or out of model data...") + end_time_idx = len(time_convert) - 1 + else: + end_time_idx = len(time_convert) - 1 + original = end_time_idx + for i in range(start_time_idx, len(time_convert)): + logging.debug(f"Check if can remove model times not used #{i}: {time_convert[i]}, end time: {balloon_last_time}") + if time_convert[i] > balloon_last_time: + end_time_idx = i + self.model_end_datetime = time_convert[end_time_idx] + + logging.debug(f"Set model time index end to {end_time_idx}, original was set to {original}") + logging.debug(f"Model end time set to: {self.model_end_datetime}") + break + + ok = self.ok_model_balloon_times(balloon_launch_time, self.model_start_datetime) + if ok is False: + sys.exit(2) + + for i in range(start_time_idx, end_time_idx+1): + t = time_convert[i] + dt = t.strftime("%Y-%m-%d %H:%M:%S") + time_model.append(dt) + #epoch_time = time.mktime(t.timetuple()) will give an answer dependent on your time zone + #gmt = timezone('GMT') # already defined above + #naive_ts = datetime.strptime(dt,"%Y-%m-%d %H:%M:%S") + #local_ts = gmt.localize(naive_ts) + #epoch_ts = local_ts.timestamp() + #epoch_model.append(int(epoch_ts)) + + model_hours = (mt.datetime_epoch(self.model_end_datetime) - mt.datetime_epoch(self.model_start_datetime))/3600 + + self.hour_index_check = 0 + self.diff_check = 0.0 + logging.debug(f"First datetime {time_model[0]}, Next datetime {time_model[1]}, last datetime {time_model[-1]}") + + + self.start_coord = start_coord + self.min_alt_m = start_coord['alt_m'] + + # Initialize min/max lat/lon index values from netcdf4 subset + #lat_top_idx = netcdf_prop.netcdf["lat_top"] + #lat_bot_idx = netcdf_prop.netcdf["lat_bot"] + #lon_left_idx = netcdf_prop.netcdf["lon_left"] + #lon_right_idx = netcdf_prop.netcdf["lon_right"] + + # Determine Index values from netcdf4 subset + lla = self.file.variables['u'][0, 0, :, :] + self.latlon_index_range(lla) + logging.debug(f"By default will use the following latitude index boundaries: {self.lat_top_idx}, {self.lat_bot_idx}") + logging.debug(f"In degrees this covers : {self.file.variables['latitude'][self.lat_top_idx]} to {self.file.variables['latitude'][self.lat_bot_idx-1]} degrees") + logging.debug(f"By default will use the following longitude index boundaries: {self.lon_left_idx}, {self.lon_right_idx} degrees") + logging.debug(f"In degrees this covers : {self.file.variables['longitude'][self.lon_left_idx]} to {self.file.variables['longitude'][self.lon_right_idx-1]}") + + print(f"By default will use the following latitude index boundaries: {self.lat_top_idx}, {self.lat_bot_idx}") + print(f"In degrees this covers : {self.file.variables['latitude'][self.lat_top_idx]} to {self.file.variables['latitude'][self.lat_bot_idx-1]} degrees") + print(f"By default will use the following longitude index boundaries: {self.lon_left_idx}, {self.lon_right_idx} degrees") + print(f"In degrees this covers : {self.file.variables['longitude'][self.lon_left_idx]} to {self.file.variables['longitude'][self.lon_right_idx-1]}") + + # smaller array of downloaded forecast subset + self.test = self.file.variables['latitude'] + logging.debug(f"Current shape of the latitude variable: {self.file.variables['latitude'].shape}") + self.lat = self.file.variables['latitude'][self.lat_top_idx:self.lat_bot_idx] + self.lon = self.file.variables['longitude'][self.lon_left_idx:self.lon_right_idx] + logging.debug(f"Final shape of the latitude variable: {self.lat.shape}") + + # min/max lat/lon degree values from netcdf4 subset + self.lat_bot_deg = self.file.variables['latitude'][self.lat_bot_idx-1] + self.lon_left_deg = self.file.variables['longitude'][self.lon_left_idx] + self.lat_top_deg = self.file.variables['latitude'][self.lat_top_idx] + self.lon_right_deg = self.file.variables['longitude'][self.lon_right_idx-1] + + message = "LAT RANGE - min:" + str(self.lat_bot_deg) + " max: " + str(self.lat_top_deg) + " size: " + str( + abs(self.lat_bot_idx - self.lat_top_idx)) + logging.info(message) + message = "LON RANGE - min:" + str(self.lon_left_deg) + " max: " + str(self.lon_right_deg) + " size: " + str( + abs(self.lon_left_idx - self.lon_right_idx)) + logging.info(message) + + # Import the netcdf4 subset to speed up table lookup in this script + self.levels = self.file.variables['level'][:] + time_dim, level_dim, lat_dim, lon_dim = self.file.variables['u'].shape + hour_index = 0 # start simulating at netcdf file start time + if self.num_model_hrs == None: + self.simulation_points = int((mt.datetime_epoch(self.model_end_datetime) - mt.datetime_epoch(self.model_start_datetime))/dt_sec) + end_index = int(hour_index + model_hours+1) + else: + end_index = int(hour_index + self.num_model_hrs + 1) + simulation_points = int(self.num_model_hrs * int(3600 * (1 / dt_sec))) # Simulation time in seconds + + if end_index > time_dim: + logging.debug(f"Warning: Number of hours to simulate are set at {end_index} but your model data only contains {time_dim} hours. Will reduce to hours to match available model data") + logging.warning( + f"Warning: Number of hours to simulate are set at {end_index} but your model data only contains {time_dim} hours. Will reduce to hours to match available model data") + end_index = time_dim + + g = 9.80665 # gravitation constant used to convert geopotential height to height + logging.debug(f"Original model wind shape: {self.file.variables['u'].shape}") + self.ugdrps0 = self.file.variables['u'][start_time_idx:end_time_idx+1, :, self.lat_top_idx:self.lat_bot_idx, + self.lon_left_idx:self.lon_right_idx] + logging.debug(f"Reduced or final model wind shape: {self.ugdrps0.shape}") + self.vgdrps0 = self.file.variables['v'][start_time_idx:end_time_idx+1, :, self.lat_top_idx:self.lat_bot_idx, + self.lon_left_idx:self.lon_right_idx] + self.hgtprs = self.file.variables['z'][start_time_idx:end_time_idx+1, :, self.lat_top_idx:self.lat_bot_idx, + self.lon_left_idx:self.lon_right_idx] / g + + #self.temp0 = self.file.variables['t'][start_time_idx:end_time_idx+1, :, self.lat_top_idx:self.lat_bot_idx, + # self.lon_left_idx:self.lon_right_idx] + + logging.info("ERA5 Data Finished downloading.\n\n") + + + def ok_model_balloon_times(self, balloon_launch_time, model_start_datetime): + ''' + This function checks if we have model data to cover are expect flight times + + :param balloon_launch_time: + :param model_start_datetime: + :return: + ''' + logging.debug("For valid model data, the model start should be before or equal to your simulation start") + logging.debug("Further, cannot be more than one 59 minutes before") + logging.debug(f"Model start date is {model_start_datetime}, simulation start is {balloon_launch_time}") + minutes_diff = (balloon_launch_time - model_start_datetime).total_seconds() / 60.0 + logging.debug(f"Difference in minutes is {minutes_diff}") + if minutes_diff > 0 and minutes_diff <= 59: + logging.debug("Model data is in correct time window and passes test.") + return True + else: + logging.error("Model data not cover time of balloon flight and program will exit.") + logging.error(f"Model start date is {model_start_datetime}, simulation start is {balloon_launch_time}") + print("Model data not cover time of balloon flight and program will exit.") + print(f"Model start date is {model_start_datetime}, simulation start is {balloon_launch_time}") + return False + + def latlon_index_range(self, lla): + """ + Determine the dimensions of actual data. If you have columns or rows with missing data + as indicated by NaN, then this function will return your actual shape size so you can + resize your data being used. + """ + logging.debug("Scraping given netcdf4 forecast file\n (" + str(self.file) + "\n for subset size") + logging.info("Scraping given netcdf4 forecast file (" + str(self.file) + " for subset size") + logging.info(colored('...', 'white', attrs=['blink'])) + + logging.debug(f"Shape of u data compent: {lla.shape}") + results = np.all(~lla.mask) + if results == False: + logging.debug("Found missing data inside the latitude, longitude, grid will determine range and set new latitude, longitude boundary indexes.") + rows, columns = np.nonzero(~lla.mask) + logging.debug('Row values :', (rows.min(), rows.max())) # print the min and max rows + logging.debug('Column values :', (columns.min(), columns.max())) # print the min and max columns + self.lat_top_idx = rows.min() + self.lat_bot_idx = rows.max() + self.lon_left_idx = columns.min() + self.lon_right_idx = columns.max() + else: + lati, loni = lla.shape + self.lat_bot_idx = lati + self.lat_top_idx = 0 + self.lon_right_idx = loni + self.lon_left_idx = 0 + + def closestIdx(self, arr, k): + """ Given an ordered array and a value, determines the index of the closest item contained in the array. + """ + return min(range(len(arr)), key=lambda i: abs(arr[i] - k)) + + def getNearestLatIdx(self, lat, min, max): + """ Determines the nearest latitude index (to .25 degrees), which will be integer index starting at 0 where you data is starting + """ + # arr = np.arange(start=min, stop=max, step=self.res) + # i = self.closest(arr, lat) + i = self.closestIdx(self.lat, lat) + return i + + def getNearestLonIdx(self, lon, min, max): + """ Determines the nearest longitude (to .25 degrees) + """ + + # lon = lon % 360 #convert from -180-180 to 0-360 + # arr = np.arange(start=min, stop=max, step=self.res) + i = self.closestIdx(self.lon, lon) + return i + + def getNearestAltbyIndex(self, int_hr_idx, lat_i, lon_i, alt_m): + """ Determines the nearest altitude based off of geo potential height of a .25 degree lat/lon area. + at a given latitude, longitude index + """ + i = self.closestIdx(self.hgtprs[int_hr_idx, :, lat_i, lon_i], alt_m) + + return i + + def getNearestAltbyIndexNoTime(self, lat_i, lon_i, alt_m): + """ Determines the nearest altitude based off of geopotential height of a .25 degree lat/lon area. + at a given latitude, longitude index. note, this version has no dimension + + :returns integer index into nearest height + """ + i = self.closestIdx(self.hgtprs[:, lat_i, lon_i], alt_m) + + return i + + + def wind_alt_Interpolate(self, alt_m, diff_time, lat_idx, lon_idx): + """ + Performs a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest + .25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time. + + Parameters + ---------- + alt_m : float + Contains current altitude of balloon object. + diff_time: ? + This parameter is calculated in two different places, need to clean up this parameter + lon_idx : integer + Closest index into longitude array + lat_idx : integer + Closest index into latitude array + + Returns: + u : float + u component wind vector + v : float + v component wind vector + """ + #we need to clean this up, ends up we check for the hour_index before we call this function + #diff = coord["timestamp"] - self.model_start_datetime + hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + int_hr_idx = int(hour_index) + self.diff_check = diff_time + self.hour_index_check = int_hr_idx + int_hr_idx2 = int_hr_idx + 1 + + hgt_m = alt_m + + #Check to see if we have exceeded available model time + time_indices, height_indices, lat_indices, lon_indices = self.vgdrps0.shape + if int_hr_idx2 >= time_indices: + return [None, None] + + # First interpolate wind speeds between 2 closest time steps to match altitude estimates (hgtprs), which can change with time + v_0 = self.vgdrps0[int_hr_idx, :, lat_idx, lon_idx] # Round hour index to nearest int + v_0 = self.fill_missing_data(v_0) # Fill the missing wind data if occurs at upper heights + + u_0 = self.ugdrps0[int_hr_idx, :, lat_idx, lon_idx] + u_0 = self.fill_missing_data(u_0) + + #t_0 = self.temp0[int_hr_idx, :, lat_idx, lon_idx] + #t_0 = self.fill_missing_data(t_0) + + xp_0 = self.hgtprs[int_hr_idx, :, lat_idx, lon_idx] + xp_0 = self.fill_missing_data(xp_0) + + #f = interpolate.interp1d(xp_0, t_0, assume_sorted=False, fill_value="extrapolate") + #t0_pt = f(hgt_m) + f = interpolate.interp1d(xp_0, u_0, assume_sorted=False, fill_value="extrapolate") + u0_pt = f(hgt_m) + f = interpolate.interp1d(xp_0, v_0, assume_sorted=False, fill_value="extrapolate") + v0_pt = f(hgt_m) + + # Next interpolate the wind velocities with respect to time. + v_1 = self.vgdrps0[int_hr_idx2, :, lat_idx, lon_idx] + v_1 = self.fill_missing_data(v_1) + u_1 = self.ugdrps0[int_hr_idx2, :, lat_idx, lon_idx] + u_1 = self.fill_missing_data(u_1) + #t_1 = self.temp0[int_hr_idx2, :, lat_idx, lon_idx] + #t_1 = self.fill_missing_data(t_1) + xp_1 = self.hgtprs[int_hr_idx2, :, lat_idx, lon_idx] + xp_1 = self.fill_missing_data(xp_1) + + #f = interpolate.interp1d(xp_1, t_1, assume_sorted=False, fill_value="extrapolate" ) + + #t1_pt = f(hgt_m) + f = interpolate.interp1d(xp_1, u_1, assume_sorted=False, fill_value="extrapolate") + u1_pt = f(hgt_m) + f = interpolate.interp1d(xp_1, v_1, assume_sorted=False, fill_value="extrapolate") + v1_pt = f(hgt_m) + + fp = [int_hr_idx, int_hr_idx2] + u = np.interp(hour_index, fp, [u0_pt, u1_pt]) + v = np.interp(hour_index, fp, [v0_pt, v1_pt]) + #t = np.interp(hour_index, fp, [t0_pt, t1_pt]) + + return [u, v] + + def wind_alt_InterpolateNoTime(self, alt_m, lat_idx, lon_idx): + """ + Performs a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest + .25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time. + + Parameters + ---------- + alt_m : float + Contains altitude of balloon object. + lon_idx : integer + Closest index into longitude array + lat_idx : integer + Closest index into latitude array + + Returns: + u : float + u component wind vector + v : float + v component wind vector + """ + + hgt_m = alt_m + + + # First interpolate wind speeds between 2 closest time steps to match altitude estimates (hgtprs), which can change with time + v_0 = self.vgdrps0[:, lat_idx, lon_idx] # Round hour index to nearest int + v_0 = self.fill_missing_data(v_0) # Fill the missing wind data if occurs at upper heights + + u_0 = self.ugdrps0[:, lat_idx, lon_idx] + u_0 = self.fill_missing_data(u_0) + + # t_0 = self.temp0[int_hr_idx, :, lat_idx, lon_idx] + # t_0 = self.fill_missing_data(t_0) + + xp_0 = self.hgtprs[:, lat_idx, lon_idx] + xp_0 = self.fill_missing_data(xp_0) + + # f = interpolate.interp1d(xp_0, t_0, assume_sorted=False, fill_value="extrapolate") + # t0_pt = f(hgt_m) + f = interpolate.interp1d(xp_0, u_0, assume_sorted=False, fill_value="extrapolate") + u0_pt = f(hgt_m) + f = interpolate.interp1d(xp_0, v_0, assume_sorted=False, fill_value="extrapolate") + v0_pt = f(hgt_m) + + return [u0_pt, v0_pt] + + def fill_missing_data(self, data): + """Helper function to fill in linearly interpolate and fill in missing data + """ + + data = data.filled(np.nan) + nans, x = np.isnan(data), lambda z: z.nonzero()[0] + data[nans] = np.interp(x(nans), x(~nans), data[~nans]) + return data + + def getNewCoord(self, coord, dt): + """ + Determines the new coordinates of the balloon based on the effects of U and V wind components. + + Parameters + ---------- + coord : dict + Contains current position, altitude and time of balloon object. + dt : float + Integration time + + Returns: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, closest_lat, closest_lon, closest alt + + """ + + diff_time = coord["timestamp"] - self.model_start_datetime + hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + int_hr_idx = int(hour_index) + self.diff_check = diff_time + self.hour_index_check = int_hr_idx + + lat_idx = self.getNearestLatIdx(coord["lat"], self.lat_top_idx, self.lat_bot_idx) + lon_idx = self.getNearestLonIdx(coord["lon"], self.lon_left_idx, self.lon_right_idx) + #z = self.getNearestAltbyIndex(lat_idx, lon_idx, coord["alt_m"]) # fix this for lower and Upper + z = self.getNearestAltbyIndex(int_hr_idx, lat_idx, lon_idx, coord["alt_m"]) # fix this for lower and Upper + + try: + x_wind_vel, y_wind_vel = self.wind_alt_Interpolate(coord['alt_m'], diff_time, lat_idx, lon_idx) # for now hour index is 0 + if x_wind_vel == None: + return [None, None, None, None, None, None, None, None] + # x_wind_vel, y_wind_vel = self.wind_interpolate_by_index(coord, i, j, z) # for now hour index is 0 + except: + logging.error(f'Simulation Timestamp: , {coord["timestamp"]}') + logging.error(f"Model Forecast Start time: {self.model_start_datetime}") + logging.error(f"Last valid difference: {self.diff_check}") + logging.error(f"Last valid hour index {self.hour_index_check}") + logging.error(colored( + "Mismatch with simulation and forecast timstamps. Check simulation start time and/or download a new forecast.", + "red")) + + sys.exit(1) + + bearing = math.degrees(math.atan2(y_wind_vel, x_wind_vel)) + bearing = 90 - bearing # perform 90 degree rotation for bearing from wind data + d = math.pow((math.pow(y_wind_vel, 2) + math.pow(x_wind_vel, 2)), .5) * dt # dt multiplier + g = self.geod.Direct(coord["lat"], coord["lon"], bearing, d) + + if coord["alt_m"] <= self.min_alt_m: + # Balloon should remain stationary if it's reached the minimum altitude + return [coord['lat'], coord['lon'], x_wind_vel, y_wind_vel, bearing, self.lat[lat_idx], self.lon[lon_idx], + self.hgtprs[0, z, lat_idx, lon_idx]] # hgtprs doesn't matter here so is set to 0 + else: + return [g['lat2'], g['lon2'], x_wind_vel, y_wind_vel, bearing, self.lat[lat_idx], self.lon[lon_idx], + self.hgtprs[0, z, lat_idx, lon_idx]] + + def getNewCoordNoTime(self, coord, dt): + """ + Determines the new coordinates of the balloon based on the effects of U and V wind components. + Here the model data does not have a time dimension so model value changes are only a function + of height (or level) and latitude, longitude. + + Parameters + ---------- + coord : dict + Contains current position, altitude and time of balloon object. + dt : float + Integration time + + Returns: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, closest_lat, closest_lon, closest alt + + """ + + #diff_time = coord["timestamp"] - self.model_start_datetime + #hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + #int_hr_idx = int(hour_index) + #self.diff_check = diff_time + #self.hour_index_check = int_hr_idx + + lat_idx = self.getNearestLatIdx(coord["lat"], self.lat_top_idx, self.lat_bot_idx) + lon_idx = self.getNearestLonIdx(coord["lon"], self.lon_left_idx, self.lon_right_idx) + z = self.getNearestAltbyIndexNoTime(lat_idx, lon_idx, coord["alt_m"]) # fix this for lower and Upper + + try: + x_wind_vel, y_wind_vel = self.wind_alt_InterpolateNoTime(coord['alt_m'], lat_idx, lon_idx) # for now hour index is 0 + if x_wind_vel == None: + return [None, None, None, None, None, None, None, None] + # x_wind_vel, y_wind_vel = self.wind_interpolate_by_index(coord, i, j, z) # for now hour index is 0 + except: + logging.error(f'Simulation Timestamp: , {coord["timestamp"]}') + logging.error(f"Last valid difference: {self.diff_check}") + logging.error(f"Last valid hour index {self.hour_index_check}") + logging.error(colored( + "Mismatch with simulation and forecast timstamps. Check simulation start time and/or download a new forecast.", + "red")) + + sys.exit(1) + + bearing = math.degrees(math.atan2(y_wind_vel, x_wind_vel)) + bearing = 90 - bearing # perform 90 degree rotation for bearing from wind data + d = math.pow((math.pow(y_wind_vel, 2) + math.pow(x_wind_vel, 2)), .5) * dt # dt multiplier + g = self.geod.Direct(coord["lat"], coord["lon"], bearing, d) + + if coord["alt_m"] <= self.min_alt_m: + # Balloon should remain stationary if it's reached the minimum altitude + return [coord['lat'], coord['lon'], x_wind_vel, y_wind_vel, bearing, self.lat[lat_idx], self.lon[lon_idx], + self.hgtprs[z, lat_idx, lon_idx]] # hgtprs doesn't matter here so is set to 0 + else: + return [g['lat2'], g['lon2'], x_wind_vel, y_wind_vel, bearing, self.lat[lat_idx], self.lon[lon_idx], + self.hgtprs[z, lat_idx, lon_idx]] diff --git a/craig_files/era5_properties.py b/craig_files/era5_properties.py new file mode 100644 index 0000000..2d58f33 --- /dev/null +++ b/craig_files/era5_properties.py @@ -0,0 +1,28 @@ +''' +Note, currently this program must be manually meet to match how the user made a data download from copernicus dataset. +Unlike use of GFS data where the file downloaded is automatically named appropriately, you must manually rename it +to fit the format shown below. So for example, if our time for runtime = "2021-09-20 16:00:00" rename your downloaded +file as "era_20210920_160000.nc" +''' +from datetime import datetime +runtime = "2022-03-01 12:00:00" # Forecast start time, should match a downloaded forecast +#filename = "era_" + runtime[0:4] + runtime[5:7] + runtime[8:10] + "_" + runtime[11:13] + runtime[14:16]+runtime[17:19]+".nc" +filename = "era.nc" + +forecast_dir = "./forecasts/" +netcdf = dict( + nc_file=(filename), + # file structure for downloading .25 resolution NOAA forecast data. + nc_start_datetime=datetime.fromisoformat(runtime), # Start time of the downloaded netCDF file + hourstamp=runtime[11:13], # parsed from gfs timestamp + res =-0.25, # (deg) Do not change + lat_range =40, # (index into number .25 deg coordinates plus or minus from the start coordinates) + lon_range =60, # (.25 deg) + hours1 =5, # originally was 8 in (1-80) In intervals of 3 hours. hour_index of 8 is 8*3=24 hours + lat_bot =47.0, # How is this figured out? How does this relate to the index, for soem reason I am leaning to have these be index value? + lat_top =27.0, # How is this figured out? + lon_left =137.0, # How is this figured out? + lon_right =165.0, # How is this figured out? + resolution_hr = 1, # Added this + res_deg =0.25 # added this as well +) diff --git a/craig_files/flight_plans.py b/craig_files/flight_plans.py new file mode 100644 index 0000000..69d14d2 --- /dev/null +++ b/craig_files/flight_plans.py @@ -0,0 +1,1202 @@ +''' +Flight plans is a file where we store the details about a proposed simulation. Details include launch and optional +landing coordinates and altitudes, balloon ascent and descent rates. This file is written to be at least a temporary +database, where new data is just appended and accessed via the flight_id. This file is meant to be a data +repository for flights. + +Programs will access data here, using the file "simulation_plan.py". Simulation_plan.py is modified for each new +simulation and serves as a temporary starting location. In "simulation_plan.py" you will see something like +the following: + +flight_id = 'NRL20211217' # this must be changed for different simulations +GMT = 7 # local time offset +compare_to_telemetry = True # if set to true will compare to a telemetry file. +etc + +This is where you enter the key to grab data from here. + + +Version 1.4 (15-May-2022) + + +Optional parameters can be replaced with None: + +compare_to_telemetry When set to False, how height calculations are set using model, when set true, use height from + telemetry to get balloon height, and also compare model produced trajectories to telemetry position. + Note, you can in fact, have use_telemetry set True and have use_telemetry_set False, but would + not advise these settings. +use_telemetry_set When set to False or None, we will use settings below to (1) determine balloon start and end times, + starting latitude, longitude, altitude, and number of simulation points. But when set to True + all settings in the flight plan our ignored and all simulation is run off the telemetry data you + provide. + +use_time_dimension When set true, we will assume that our netcdf has a time variable, if it doesn't program will fail. + When set false, we will be using monthly or yearly climatological data that has no time variable + or dimension. + +model_datetime Take the model datetime start from the netcdf_properties.py file used in saveNETCDF.py to create + the model. Note, you might think we just use netcdf_properties here and not bother, but netcdf_properties + is used and then the properties are changed but not save. Flight_plans archives what our parameters + were + +data_source Confirms your model file is GFS or ERA5. Note, the code will check to see the source from + model_file. So this is more of check to make sure you know you are doing. + +model_file GFS or ERA5 netcdf file containing the data. + +optimize_by Our current options are 'static', 'dynamic', 'distance', 'ensemble', 'psuedo_gradient' + +telemetry_file If using telemetry give enough of a path to make your file unique either csv, or excel + +telemetry_source Currently either, NAVY, NRL, or APRSFI, note different telemetry files have different formats. + You will almost surely need to add a new format to match yours and modify code in + telemetry_retriever.py to properly parse your data + +work_sheet_index If we are using telemetry from an excel file, you need to specify the work sheet number, if + only one work sheet then 0 (its 0 based), if not using Excel files, ignore. Excel files are + only used when we are comparing our predicted flight to known positions in the telemetry file + +last_time When set the simulation will stop at this time, otherwise (2) will end when model data runs out, + or (3) when balloon hits ground or (4) when exceeded by flight_hours. + Note, if we set flight_hours to a number that ends up before last_time, flight_hours will + be used over last_time or vice versa. If you want to do a full simulation and you know the time a balloon + hit ground, usually better to use last_time and set flight_hours = None. Note, it is required + that either last_time or flight_hours be set (both can't be None). + +last_latitude Can be used to set a target for say station keeping, or say the last latitude from a telemetry file. In the + first case, its the location you want to get to, and the later case it's the observed last location. + +last_longitude See above + +last_altitude When set (not None), flight will terminate when balloon falls below this height. Default minimum + altitude is given by the launch altitude. Say you release a balloon on a hill, then you will + want to set this altitude to something lower, like sea-level or 0 meters. + +burst When set to False balloon will not burst and its altitude will be controlled (see burst_hgt_m). When + set to True, balloon will burst at its burst_hgt_m + +burst_hgt_m When burst is set to True, balloon will not exceed burst height and will fall when it reached this height + +max_hgt_m When burst is set to False, balloon will level out and fly at this height. + +strato_boundary_m When this is not None we assume different ascent and descent rates above this value. + If balloon has constant ascent and descent rates set to None. + +strato_ascent_m Only used when strato_boundary_m is not None. When set assumes balloon ascent and descent rates + are different in the area above the boundary. Note, it is called strato_boundary_m but it + can be set to any arbitrary boundary where the balloon behavior changes (meters per sec). + +strato_descent_m Note, we assume at most two different ascent/descent rates, we could extend this to n ascent/descent rates (meters per sec) + +flight_hours Normally set to None, but if you want the flight simulation to end after a specific number of hours + then use. Note, this option will soon be depreciated. We currently have too many ways of controlling + the number of simulation points, such as using balloon start and end times, or the start and end times + in the telemetry file or this variable flight_hours. Note, previously, this was referred to as sim_time_hours. +''' +flight = { + 'DEFAULT': { + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + 'use_time_dimension': False, + 'compare_to_telemetry': False, + 'data_source': 'era', + 'model_file': 'westpac_jan_2003-2021_mean.nc', + 'model_datetime': '2022-01-01 12:00:00', + 'launch_time': '2022-01-01 11:30:00', # GMT time we want the simulation to start out + 'last_time': "2022-01-02 14:30:00", # this is pulled from the defualt for troubleshooing + 'launch_latitude': 15.134, + 'launch_longitude': 145.73, + 'launch_altitude': 74, + 'last_latitude': 17.42, + 'last_longitude': 163.619, + 'last_altitude': 16000, + 'flight_hours': 27, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 20000, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by' : 'psuedo_gradient', + 'burst': False, + 'stratosphere_boundary_ave_m': 30000.0, + 'strato_boundary_m': 30000.0, + 'ascent_rate_ms': 2, + 'descent_rate_ms': -14.68, + 'tropo_ascent_rate_ms': 3.628, # Added from Superpressue for dev + 'tropo_descent_rate_ms': -6.3489, # Added from Superpressue for dev + 'strato_ascent_rate_ms': 0.2822, # Added from Superpressue for dev + 'strato_descent_rate_ms': -0.2822 # Added from Superpressue for dev + }, + 'SAMPLE_STATIC': { + 'dt_sec': 3, + 'balloon_type': 'SPB', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + 'use_time_dimension': False, + 'compare_to_telemetry': False, + 'data_source': 'gfs', + 'model_file': 'gfs_0p25_20220525_12.nc', + 'model_datetime': '2022-05-25 12:00:00', + 'launch_time': '2022-05-25 12:30:00', # GMT time we want the simulation to start out + 'last_time': None, # this is pulled from the defualt for troubleshooing + 'launch_latitude': 37.775, # San Francisco CA + 'launch_longitude': -122.419, + 'launch_altitude': 100, + 'last_latitude': 39.53, # last_latitude, etc, can also be used as target location, for Reno Nevada + 'last_longitude': -119.8143, + 'last_altitude': 1373, + 'flight_hours': 30, # Optional, if set will either stop when simulation gets to last_time (if not set to None) + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 28042, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by': 'static', # static, if fly whole path along a given altitude and compare results + 'burst': False, + #'float_hgt_m': [14000, 15000, 16000, 17000, 18000, 19000, 20000, 21000, 22000, 23000], + 'float_hgt_m': [14000, 15000, 16000], + 'leg_time_hr': 3, # (hours) Simulation time in hours (for trapezoid.py) + 'path_direction': 'forward', + 'tolerance_level': 0.9, + 'target_range': 250, + 'hover_minute_interval': 30, + 'strato_boundary_m': 14000.0, + 'ascent_rate_ms': 2, + 'descent_rate_ms': -14.68, + 'tropo_ascent_rate_ms': 3.628, # Added from Superpressure for dev + 'tropo_descent_rate_ms': -6.3489, # Added from Superpressrue for dev + 'strato_ascent_rate_ms': 0.2822, # Added from Superpressure for dev + 'strato_descent_rate_ms': -0.2822 # Added from Superpressure for dev + }, + 'SAMPLE_DIRECTION': { + 'dt_sec': 3, + 'balloon_type': 'SPB', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + 'use_time_dimension': False, + 'compare_to_telemetry': False, + 'data_source': 'gfs', + 'model_file': 'gfs_0p25_20220525_12.nc', + 'model_datetime': '2022-05-25 12:00:00', + 'launch_time': '2022-05-25 12:30:00', # GMT time we want the simulation to start out + 'last_time': None, # this is pulled from the defualt for troubleshooing + 'launch_latitude': 37.775, # San Francisco CA + 'launch_longitude': -122.419, + 'launch_altitude': 100, + 'last_latitude': 39.53, # last_latitude, etc, can also be used as target location, for Reno Nevada + 'last_longitude': -119.8143, + 'last_altitude': 1373, + 'flight_hours': 30, # Optional, if set will either stop when simulation gets to last_time (if not set to None) + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 28042, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by': 'direction', + 'burst': False, + 'float_hgt_m': [14000, 19000, 20000, 22000, 24000], + 'leg_time_hr': 1, # (hours) Simulation time in hours (for trapezoid.py) + 'path_direction': 'forward', + 'tolerance_level': 0.9, + 'target_range': 250, + 'hover_minute_interval': 30, + 'strato_boundary_m': 14000.0, + 'ascent_rate_ms': 2, + 'descent_rate_ms': -14.68, + 'tropo_ascent_rate_ms': 3.628, # Added from Superpressure for dev + 'tropo_descent_rate_ms': -6.3489, # Added from Superpressrue for dev + 'strato_ascent_rate_ms': 0.2822, # Added from Superpressure for dev + 'strato_descent_rate_ms': -0.2822 # Added from Superpressure for dev + }, + 'SAMPLE_DISTANCE': { + 'dt_sec' : 3, + 'balloon_type': 'SPB', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + 'use_time_dimension': False, + 'compare_to_telemetry': False, + 'data_source': 'gfs', + 'model_file': 'gfs_0p25_20220525_12.nc', + 'model_datetime': '2022-05-25 12:00:00', + 'launch_time': '2022-05-25 12:30:00', # GMT time we want the simulation to start out + 'last_time': None, # this is pulled from the defualt for troubleshooing + 'launch_latitude': 37.775, # San Francisco CA + 'launch_longitude': -122.419, + 'launch_altitude': 100, + 'last_latitude': 39.53, # last_latitude, etc, can also be used as target location, for Reno Nevada + 'last_longitude': -119.8143, + 'last_altitude': 1373, + 'flight_hours': 30, # Optional, if set will either stop when simulation gets to last_time (if not set to None) + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 28042, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by': 'distance', + 'burst': False, + 'float_hgt_m' : [14000, 19000, 20000, 22000, 24000], + 'leg_time_hr' : 1, # (hours) Simulation time in hours (for trapezoid.py) + 'path_direction' : 'forward', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'strato_boundary_m': 14000.0, + 'ascent_rate_ms': 2, + 'descent_rate_ms': -14.68, + 'tropo_ascent_rate_ms': 3.628, # Added from Superpressure for dev + 'tropo_descent_rate_ms': -6.3489, # Added from Superpressrue for dev + 'strato_ascent_rate_ms': 0.2822, # Added from Superpressure for dev + 'strato_descent_rate_ms': -0.2822 # Added from Superpressure for dev + }, + 'SAMPLE_ENSEMBLE': { + 'balloon_type': 'SPB', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + 'use_time_dimension': False, + 'compare_to_telemetry': False, + 'data_source': 'gfs', + 'model_file': 'gfs_0p25_20210913_12.nc', + 'model_datetime': '2021-09-13 12:00:00', + 'launch_time': '2021-09-13 11:32:00', # GMT time we want the simulation to start out + 'last_time': None, # this is pulled from the defualt for troubleshooing + 'launch_latitude': 37.775, + 'launch_longitude': -122.419, + 'launch_altitude': 100, + 'last_latitude': 40.7608, # last_latitude, etc, can also be used as target location + 'last_longitude': -111.8910, + 'last_altitude': 1673, + 'flight_hours': 30, # Optional, if set will either stop when simulation gets to last_time (if not set to None) + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 28042, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by': 'ensemble', + 'burst': False, + 'float_hgt_m': [14000, 18000, 22000, 26000], + 'leg_time_hr': 6, # (hours) Simulation time in hours (for trapezoid.py) + 'path_direction': 'forward', + 'dt_sec' : 6, + 'tolerance_level': 0.9, + 'target_range': 250, + 'hover_minute_interval': 30, + 'strato_boundary_m': 14000.0, + 'ascent_rate_ms': 2, + 'descent_rate_ms': -14.68, + 'tropo_ascent_rate_ms': 3.628, # Added from Superpressure for dev + 'tropo_descent_rate_ms': -6.3489, # Added from Superpressrue for dev + 'strato_ascent_rate_ms': 0.2822, # Added from Superpressure for dev + 'strato_descent_rate_ms': -0.2822 # Added from Superpressure for dev + }, + 'DEFAULT_GFS': { # for some reason this has the era datafile as the data source? why? + 'data_source': 'gfs', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + 'use_time_dimension': False, + 'compare_to_telemetry': False, + 'model_file': 'gfs_0p25_20220301_12.nc', + 'model_datetime': '2022-03-01 12:00:00', + 'launch_time': '2022-03-01 11:30:00', # GMT time we want the simulation to start out + 'last_time': "2022-03-02 14:30:00", # this is pulled from the defualt for troubleshooing + 'launch_latitude': 15.134, + 'launch_longitude': 145.73, + 'launch_altitude': 74, + 'last_latitude': 17.42, + 'last_longitude': 163.619, + 'last_altitude': 16000, + 'flight_hours': 27, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 20000, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by': 'psuedo_gradient', + 'burst': False, + 'stratosphere_boundary_ave_m': 30000.0, + 'strato_boundary_m': 30000.0, + 'ascent_rate_ms': 2, + 'descent_rate_ms': -14.68, + 'tropo_ascent_rate_ms': 3.628, # Added from Superpressue for dev + 'tropo_descent_rate_ms': -6.3489, # Added from Superpressue for dev + 'strato_ascent_rate_ms': 0.2822, # Added from Superpressue for dev + 'strato_descent_rate_ms': -0.2822 # Added from Superpressue for dev + }, + 'SAMPLE': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + 'use_time_dimension': False, + 'compare_to_telemetry': False, + 'model_file': 'westpac_jan_2003-2021_mean.nc', + 'model_datetime': '2022-02-17 12:00:00', + 'launch_time': '2020-01-17 14:01:32', # GMT time we want the simulation to start out + 'last_time': None, # we don't know how long this + 'launch_latitude': 15.18, + 'launch_longitude': 145.74, + 'launch_altitude': 0, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': 4, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 20000, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': 4.68, + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + 'tropo_ascent_rate_ms': 3.628, # Added from Superpressue for dev + 'tropo_descent_rate_ms': -6.3489 # Added from Superpressue for dev + }, + 'GFS_SAMPLE': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'Weather Balloon', + 'title': 'GFS Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + 'use_time_dimension': False, + 'compare_to_telemetry': False, + 'model_file': 'gfs_0p25_20220301_12.nc', + 'model_datetime': '2022-03-01 12:00:00', + 'launch_time': '2022-03-01 12:30:00', # GMT time we want the simulation to start out + 'last_time': '2022-03-02 15:30:00', # we don't know how long this + 'launch_latitude': 15.18, + 'launch_longitude': 145.74, + 'launch_altitude': 0, + 'last_latitude': 17.42, + 'last_longitude': 163.619, + 'last_altitude': None, + 'flight_hours': 27, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 20000, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by': 'psuedo_gradient', + 'burst': False, + 'strato_boundary_m': 30000.0, + 'ascent_rate_ms': 4.68, + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + 'tropo_ascent_rate_ms': 3.628, # Added from Superpressue for dev + 'tropo_descent_rate_ms': -6.3489 # Added from Superpressue for dev + }, + 'SAMPLE_ORIG': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + # 'use_time_dimension': True, + 'use_time_dimension': False, # Mod for t/s + 'compare_to_telemetry': False, + # 'model_file': 'gfs_0p25_20220217_12.nc', + 'model_file': 'era.nc', # This was changed to test the file. + 'model_datetime': '2022-02-17 12:00:00', + 'launch_time': '2022-02-17 14:01:32', # GMT time we want the simulation to start out + 'last_time': None, # we don't know how long this + 'launch_latitude': 39.2735, + 'launch_longitude': -80.736, + 'launch_altitude': 579.73, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': 4, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': 20068.0, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': True, + 'strato_boundary_m': None, + 'ascent_rate_ms': 4.68, + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'SAMPLE0': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan', + 'telemetry_file': None, + 'telemetry_source': None, + 'use_telemetry_set': False, + # 'use_time_dimension': True, + 'use_time_dimension': False, # Mod for t/s + 'compare_to_telemetry': False, + # 'model_file': 'gfs_0p25_20220217_12.nc', + 'model_file': 'era.nc', # This was changed to test the file. + 'model_datetime': '2022-02-17 12:00:00', + 'launch_time': '2022-02-17 12:01:32', # GMT time we want the simulation to start out + 'last_time': None, # we don't know how long this + 'launch_latitude': 39.2735, + 'launch_longitude': -80.736, + 'launch_altitude': 579.73, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': 4, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': 20068.0, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 20500, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': 4.68, + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'SAMPLE2': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + # Duruisseau et al: Assessment of the ERA-Interim Winds Using High-Altitude Stratospheric Balloons JAS 2017 + 'balloon_type': 'Weather Balloon', + 'title': 'Sample of Using Telemetry to get Balloon Height', + 'telemetry_file': 'aprsfi_export_W0OAH*.xlsx', + 'work_sheet_index': 0, + 'telemetry_source': 'APRSFI', + 'compare_to_telemetry': True, + 'use_telemetry_set': True, + # 'use_time_dimension': True, + 'use_time_dimension': False, # Mod for t/s + # 'model_file': 'gfs_0p25_20210512_12.nc', + 'model_file': 'era.nc', # This was changed to test the file. + 'model_datetime': '2021-05-12 12:00:00', + 'launch_time': None, # GMT time we want the simulation to start out + 'last_time': None, # we don't know how long this + 'launch_latitude': None, + 'launch_longitude': None, + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': 4.68, + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'shab10v': { + 'notes': 'Flight plan used to test against shab10v-aprs.csv using telemetry and era5 model data', + 'data_source': 'era', + 'tolerance_level': 0.9, # na + 'target_range': 250, # na + 'hover_minute_interval': 30, # ignore + 'path_direction': 'forward', # ignore + 'leg_time_hr': 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m': [None], + 'dt_sec': 3, + # Duruisseau et al: Assessment of the ERA-Interim Winds Using High-Altitude Stratospheric Balloons JAS 2017 + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan for Readme', + 'telemetry_file': 'SHAB10V-APRS.CSV', + 'work_sheet_index': 0, + 'telemetry_source': 'APRS2', + 'compare_to_telemetry': True, # compare against a telemetry file the position + 'use_telemetry_set' : True, #when set to true use telemetry to get simulation time, false use flight_hours or balloon start and end times + 'use_time_dimension': True, + 'model_file': 'shab10_era_2022-04-09to2022-04-10.nc', + 'model_datetime': '2022-04-09 00:00:00', # ignore for era5 data + 'launch_time': None, # GMT time we want the simulation to start out + 'last_time': None, # we don't know how long this + 'launch_latitude': None, + 'launch_longitude': None, + 'launch_altitude': None, # units are meters + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by': None, + 'burst': None, # balloon will pop + 'strato_boundary_m': None, + 'ascent_rate_ms': None, # units are meters/second + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + 'tropo_ascent_rate_ms': None, + 'tropo_descent_rate_ms': None + }, + 'era_sample_2022-06-01': { + 'notes': 'Flight plan used to fly a weather balloon that burst at a given altitude, tested 6/1/2022 with trapezoid_era5', + 'data_source': 'era', + 'tolerance_level' : 0.9, #na + 'target_range' : 250, #na + 'hover_minute_interval' : 30, #ignore + 'path_direction' : 'forward', #ignore + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [17000], + 'dt_sec' : 3, + # Duruisseau et al: Assessment of the ERA-Interim Winds Using High-Altitude Stratospheric Balloons JAS 2017 + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan for Readme', + 'telemetry_file': None, + 'work_sheet_index': 0, + 'telemetry_source': None, + 'compare_to_telemetry': False, + 'use_telemetry_set': False, + 'use_time_dimension': True, + 'model_file': 'kauai_2021_June_01.nc', + 'model_datetime': '2021-06-01 12:00:00', #ignore for era5 data + 'launch_time': '2021-06-01 18:17:35', # GMT time we want the simulation to start out + 'last_time': None, # we don't know how long this + 'launch_latitude': 21.99, + 'launch_longitude': -159.34, + 'launch_altitude': 74.0, # units are meters + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': 16, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': 28000, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'optimize_by' : None, + 'burst':True, # balloon will pop + 'strato_boundary_m': None, + 'ascent_rate_ms': 5.00, # units are meters/second + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + 'tropo_ascent_rate_ms': None, + 'tropo_descent_rate_ms' : None + }, + 'era_sample1': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + # Duruisseau et al: Assessment of the ERA-Interim Winds Using High-Altitude Stratospheric Balloons JAS 2017 + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan for Readme', + 'telemetry_file': None, + 'work_sheet_index': 0, + 'telemetry_source': None, + 'compare_to_telemetry': False, + 'use_telemetry_set': False, + 'use_time_dimension': True, + 'model_file': 'kauai_2021_jun.nc', + 'launch_time': '2021-06-01 18:17:35', # GMT time we want the simulation to start out + 'last_time': None, # we don't know how long this + 'launch_latitude': 21.99, + 'launch_longitude': -159.34, + 'launch_altitude': 74.0, # units are meters + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': 6, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': 35000, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 20500, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, # balloon will pop + 'strato_boundary_m': None, + 'ascent_rate_ms': 5.00, # units are meters/second + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'era_sample2': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + # Duruisseau et al: Assessment of the ERA-Interim Winds Using High-Altitude Stratospheric Balloons JAS 2017 + 'balloon_type': 'Weather Balloon', + 'title': 'Sample Flight Plan for Readme using Telemetry', + 'work_sheet_index': 0, + 'telemetry_source': 'APRSFI', + 'telemetry_file': "aprsfi_201015-201016.xlsx", + # must be in the ./balloon_data with respect to where this program is + 'compare_to_telemetry': True, + 'use_telemetry_set': True, + 'use_time_dimension': True, + 'model_file': 'havasu_2020_oct.nc', + 'launch_time': None, # GMT time we want the simulation to start out + 'last_time': None, # we don't know how long this + 'launch_latitude': None, + 'launch_longitude': None, + 'launch_altitude': None, # units are meters + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': 6, # Optional, if set will either stop when simulation gets to last_time (if not set to None + 'burst_hgt_m': 35000, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'ceiling_hgt_m': 20500, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, # balloon will pop + 'strato_boundary_m': None, + 'ascent_rate_ms': 5.00, # units are meters/second + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + '10_1_20_APRS_RAW': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'Solar', + 'title': 'Solar Balloon from Tucson Tech Park', + 'telemetry_file': "10_1_20_APRS_RAW.csv", + 'telemetry_source': 'APRS', + 'era_file': '20200919-22.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'NRL20210920': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'NRL', + 'title': 'West Virginia Launch', + 'telemetry_file': "gps_analysis_2.csv", + 'telemetry_source': 'NRL', + 'use_time_dimension': True, + 'use_telemetry_set': True, + 'model_file': 'era_20210920_160000.nc', + 'launch_time': '2021-09-20 16:17:35', + 'last_time': '2021-09-20 18:32:15', + 'launch_latitude': 39.0461, + 'launch_longitude': -78.7574, # -negative degrees are degrees west + 'launch_altitude': 406., + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': 3, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': 22227.4, # when burst_hgt is not None, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'strato_boundary_m': None, + 'ascent_rate_ms': 4.68, + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': 2.67, + 'strato_descent_rate_ms': -14.68, + }, + 'NRL20210920_Original': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'NRL', + 'title': 'West Virginia Launch', + 'telemetry_file': "gps_analysis_2.csv", + 'telemetry_source': 'NRL', + 'model_file': 'era_20210920_160000.nc', + 'launch_time': '2021-09-20 16:17:35', + 'last_time': '2021-09-20 18:32:15', + 'launch_latitude': 39.0461, + 'launch_longitude': -78.7574, # -negative degrees are degrees west + 'launch_altitude': 406., + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': 22227.4, # when burst_hgt is not None, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'strato_boundary_m': 5518.0, + 'ascent_rate_ms': 4.68, + 'descent_rate_ms': -14.68, + 'strato_ascent_rate_ms': 2.67, + 'strato_descent_rate_ms': -14.68, + }, + 'NRL20211217': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'NRL', + 'title': 'West Virginia Launch', + 'telemetry_file': "nrl_20211223_150740.csv", + 'telemetry_source': 'NRL', + 'model_file': '2021-12-21_17--23.nc', + 'launch_time': '2021-12-21 17:06:22', + 'last_time': '2021-12-21 21:40:20', + 'launch_latitude': 39.27350, + 'launch_longitude': -80.73600, # -negative degrees are degrees west + 'launch_altitude': 579.73, + 'last_latitude': 40.76500, + 'last_longitude': -74.90400, + 'last_altitude': 470.92, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': 33241.49, # when burst_hgt is not None, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'strato_boundary_m': None, + 'ascent_rate_ms': 2.4798, + 'descent_rate_ms': -16.6603, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0458': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'TW VS-20 CFT-1 Yankee-4', + 'telemetry_file': "HBAL0458*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': '20200919-22.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0448': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0448 -- TW VS-20 CFT-1 Yankee-4', + 'telemetry_file': "HBAL0448*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': '2020_09_18-19.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0445': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0445', + 'telemetry_file': "HBAL0445*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': '2020_09_21-26.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0446': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0446', + 'telemetry_file': "HBAL0446*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': '2020_09_14-15.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0447': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0447', + 'telemetry_file': "HBAL0447*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': '2020_09_18-19b.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0449': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0449', + 'telemetry_file': "HBAL0449*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': '2020_09_18-20.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0450': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0450', + 'telemetry_file': "HBAL0450*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': 'westpac_sep_full.nc', + 'use_telemetry_set': True, + 'use_time_dimension': False, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0450_PLAN': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0450_Plan', + 'telemetry_file': "None", + 'telemetry_source': 'NAVY', + 'era_file': 'westpac_sep_full.nc', + 'use_telemetry_set': True, + 'use_time_dimension': False, + # optional parameters follow + 'launch_time': '2022-06-21 17:06:22', + 'last_time': '2022-06-24 21:40:20', + 'launch_latitude': 13.44, + 'launch_longitude': 144.0, # -negative degrees are degrees west + 'launch_altitude': 0, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': 3.71, + 'descent_rate_ms': -8.65, + 'flight_levels': 17500, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0451': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0451', + 'telemetry_file': "HBAL0451*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': '2020_09_16-20.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0452': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0452', + 'telemetry_file': "HBAL0452*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': '2020_09_17-17.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, + 'HBAL0448': { + 'data_source': 'era', + 'tolerance_level' : 0.9, + 'target_range' : 250, + 'hover_minute_interval' : 30, + 'path_direction' : 'forward', + 'leg_time_hr' : 3, # (hours) Simulation time in hours (for trapezoid.py) + 'float_hgt_m' : [20000], + 'dt_sec' : 3, + 'balloon_type': 'TH-208', + 'title': 'HBAL0448', + 'telemetry_file': "HBAL0448*.xlsx", + 'telemetry_source': 'NAVY', + 'era_file': 'era_2020_09_19_00-06.nc', + 'use_telemetry_set': True, + 'use_time_dimension': True, + # optional parameters follow + 'launch_time': None, + 'last_time': None, + 'launch_latitude': None, + 'launch_longitude': None, # -negative degrees are degrees west + 'launch_altitude': None, + 'last_latitude': None, + 'last_longitude': None, + 'last_altitude': None, + 'flight_hours': None, # Set to None if want to either use all model data or last_time + 'burst_hgt_m': None, # when burst_hgt is greater than 0, implies balloon gets to that height in pops + 'max_hgt_m': None, # when ceiling hgt is greater than 0, implies balloon gets to that height in floats + 'burst': False, + 'strato_boundary_m': None, + 'ascent_rate_ms': None, + 'descent_rate_ms': None, + 'strato_ascent_rate_ms': None, + 'strato_descent_rate_ms': None, + }, +} diff --git a/craig_files/load_config.py b/craig_files/load_config.py new file mode 100644 index 0000000..43a8f8a --- /dev/null +++ b/craig_files/load_config.py @@ -0,0 +1,422 @@ +''' +This is to build a common config between all of the methods. +''' +# One thing I want to do is to pass the +# sim_prop.flight_id +# to the clase so that we can load based on that. +# Otherwise the config can be adjusted by individual params +# in the respective code +import sys +from datetime import datetime + +import properties.simulation_plan as sim_prop # getting rid of simulation_properties +import properties.balloon_properties as balloon_prop +import properties.mission_properties as mission_prop +import properties.netcdf_properties as net_prop +import properties.demo_properties as demo_prop +import properties.flight_plans as flt_prop +import properties.era5_properties as era_prop +import logging +import mathtime_utilities as mt + +logging.basicConfig(filename='load_config.log', + level=logging.WARNING, + format='%(asctime)s | %(levelname)s | %(message)s', + datefmt="%Y-%m-%d %H:%M") + + +class sim_config: + def __init__(self, savenetcdf=False, flight_id=sim_prop.flight_id): + if savenetcdf: + # For saveNETCDF only, creates a superset of data to be used in further simulations + self.snc_lat_range = net_prop.netcdf['lat_range'] + self.snc_lon_range = net_prop.netcdf['lon_range'] + self.snc_hours3 = net_prop.netcdf['hours3'] + self.snc_hourstamp = net_prop.netcdf['hourstamp'] + self.snc_res = net_prop.netcdf['res'] + self.snc_nc_start = net_prop.netcdf['nc_start_datetime'] + + self.snc_nc_file = net_prop.netcdf['nc_file'] + self.snc_start_coord = net_prop.netcdf['start_coord'] + else: + # For the flight plan page + # This will be added later perhaps + # for now it seems to have to be dynamic based ont a front end + # selection. + self.flight_id = flight_id + + # From Trapezoid + self.model_datetime = flt_prop.flight[flight_id]["model_datetime"] + + self.forecast_dir = sim_prop.forecast_dir + self.output_dir = sim_prop.output_dir + self.GMT = sim_prop.GMT + self.MIN_ALT_M = flt_prop.flight[flight_id]['launch_altitude'] + self.DT_SEC = flt_prop.flight[flight_id][ + "dt_sec"] # important time for numerical integration of the physics models + self.dt_sec = self.DT_SEC + self.SIM_TIME_HOURS = flt_prop.flight[flight_id]["flight_hours"] + self.BALLOON_NAME = flt_prop.flight[flight_id]["balloon_type"] + self.ASCENT_RATE_MS = flt_prop.flight[flight_id]['ascent_rate_ms'] + self.GFS_RATE_SEC = sim_prop.GFSrate_sec + self.OUTPUT_DIR = sim_prop.output_dir + self.FLOAT_HGT_M = flt_prop.flight[flight_id]['float_hgt_m'] + + + try: + self.LEG_TIME_HOURS = flt_prop.flight[flight_id]["leg_time_hr"] + except: + self.LEG_TIME_HOURS = None + self.LEG_TIME_ITERATIONS = None + self.LEG_TIME_SEGMENTS = None + if self.LEG_TIME_HOURS == None: + self.LEG_TIME_ITERATIONS = None + else: + self.LEG_TIME_ITERATIONS = self.LEG_TIME_HOURS * int(3600 * (1 / self.DT_SEC)) # number of simulation points + try: + self.LEG_TIME_SEGMENTS = self.SIM_TIME_HOURS / self.LEG_TIME_HOURS + except: + self.LEG_TIME_SEGMENTS = None + + self.calc_methods = sim_prop.calc_methods + self.optimize_by = flt_prop.flight[flight_id]['optimize_by'] + self.OUTPUT = sim_prop.output + self.STRATO_BOUNDARY = flt_prop.flight[flight_id]['strato_boundary_m'] + self.TROPO_ASCENT_MS = flt_prop.flight[flight_id]['tropo_ascent_rate_ms'] + self.TROPO_DESCENT_MS = flt_prop.flight[flight_id]['tropo_descent_rate_ms'] + self.STRATO_ASCENT_MS = flt_prop.flight[flight_id]['tropo_ascent_rate_ms'] + self.STRATO_DESCENT_MS = flt_prop.flight[flight_id]['tropo_descent_rate_ms'] + self.CEILING_M = flt_prop.flight[flight_id]['ceiling_hgt_m'] + self.PATH_DIRECTION = flt_prop.flight[flight_id]['path_direction'] + + # This is done for date changes + self.SIM_GFS = self.model_datetime + self.NET_GFS = self.model_datetime + + # New stuff for the hover stage + self.TOLERANCE_LEVEL = flt_prop.flight[flight_id][ + 'tolerance_level'] # this will be a percentage of target range and adjustable + self.TARGET_RANGE = flt_prop.flight[flight_id]['target_range'] # This will be pulled from the mission params + self.HOVER_BOUNDRY = self.TOLERANCE_LEVEL * self.TARGET_RANGE # This is calculated based on the above + self.HOVER_TIME_MINUTES = flt_prop.flight[flight_id]['hover_minute_interval'] + self.HOVER_ITERATIONS = self.HOVER_TIME_MINUTES * int(60 * (1 / self.DT_SEC)) + # For the Graph + self.ALTITUDE_DIR = sim_prop.alt_graph_dir + + # For the datasource + self.data_source = flt_prop.flight[flight_id]["data_source"] + if self.data_source == None: + logging.error("You must define data_source as either 'era', 'gfs', or 'navgem'") + sys.exit(2) + + # new era options + self.telemetry_dir = sim_prop.telemetry_dir + # These are outputs (from simulation_plan) + self.html_map = sim_prop.output['html'] # this is a htmlmap output + self.leaflet_map = sim_prop.output['leaflet_map'] # this is a leaflet map output + self.geojson_file = sim_prop.output['geojson'] # this is a geojson output + self.csv_file = sim_prop.output['csv'] # this is a csv output + self.cartopy_map = sim_prop.output['cartopy_map'] # this is a cartopy output + self.balloon_height = sim_prop.output['balloon_height'] # this is a blloon hieght output + + self.compare_to_telemetry = flt_prop.flight[flight_id]["compare_to_telemetry"] + self.telemetry_file = None + self.telemetry_source = None + self.use_telemetry_set = flt_prop.flight[flight_id]["use_telemetry_set"] + self.use_time_dimension = flt_prop.flight[flight_id]["use_time_dimension"] + if self.compare_to_telemetry: + self.telemetry_file = flt_prop.flight[flight_id]["telemetry_file"] + self.telemetry_source = flt_prop.flight[flight_id]["telemetry_source"] + self.work_sheet_index = flt_prop.flight[flight_id]["work_sheet_index"] + else: + self.telemetry_file = None + self.telemetry_source = None + self.use_telemetry_set = False + + self.balloon_type = flt_prop.flight[flight_id]["balloon_type"] + self.start = flt_prop.flight[flight_id]['launch_time'] + self.end = flt_prop.flight[flight_id]['last_time'] + if self.start == None: + self.BALLOON_START_DATETIME = None + else: + self.BALLOON_START_DATETIME = datetime.fromisoformat(self.start) + + if self.end != None: + self.BALLOON_END_DATETIME = datetime.fromisoformat(self.end) + else: + self.BALLOON_END_DATETIME = None + + self.balloon_end_datetime = self.BALLOON_END_DATETIME + self.input_file = flt_prop.flight[flight_id]["model_file"] + + self.launch_latitude = flt_prop.flight[flight_id]["launch_latitude"] + self.launch_longitude = flt_prop.flight[flight_id]['launch_longitude'] + self.launch_altitude = flt_prop.flight[flight_id]['launch_altitude'] + + self.last_latitude = flt_prop.flight[flight_id]["last_latitude"] + self.last_longitude = flt_prop.flight[flight_id]['last_longitude'] + self.last_altitude = flt_prop.flight[flight_id]['last_altitude'] + # min_alt_m = launch_altitude # matched + + # sim_time_hrs = flt_prop.flight[flight_id]["flight_hours"] #Matched + self.sim_time_hours = flt_prop.flight[flight_id]["flight_hours"] + self.SIM_TIME_HOURS = self.sim_time_hours + if self.sim_time_hours == None and self.compare_to_telemetry == False: + if self.balloon_end_datetime == None: + logging.error( + "In your flight time you must either set the number of hours to simulate via 'flight_hours' or ") + logging.error("you must set the 'last_time' or being using telemetry else unknown length of simulation") + sys.exit(1) + elif self.compare_to_telemetry == True: + logging.info("Simulation time is taken from the first and last points of your telemetry file") + + # ascent_rate_ms = flt_prop.flight[flight_id]['ascent_rate_ms'] # matched + self.descent_rate_ms = flt_prop.flight[flight_id]['descent_rate_ms'] + self.strato_boundary_m = flt_prop.flight[flight_id]['strato_boundary_m'] + if self.strato_boundary_m == None: + self.strato_ascent_rate_ms = None + self.strato_descent_rate_ms = None + else: + self.strato_ascent_rate_ms = flt_prop.flight[flight_id]['strato_ascent_rate_ms'] + self.strato_descent_rate_ms = flt_prop.flight[flight_id]['strato_descent_rate_ms'] + + self.burst_hgt_m = flt_prop.flight[flight_id]['burst_hgt_m'] + if self.burst_hgt_m == None: + self.burst_balloon = False + else: + self.burst_balloon = flt_prop.flight[flight_id]['burst'] + if self.burst_balloon == True and self.burst_hgt_m == None: + print("Your flight plan you set 'burst=True', then you must have a burst height but you set to None") + logging.error("Your flight plan you set 'burst=True', then you must have a burst height but you set to None") + sys.exit(2) + elif self.burst_balloon == False and self.burst_hgt_m != None: + print(f"Your flight plan you set 'burst=False', but you gave a burst height {self.burst_hgt_m}, will override and set Burst=True") + logging.warning(f"Your flight plan you set 'burst=False', but you gave a burst height {self.burst_hgt_m}, will override and set Burst=True") + self.burst_balloon = True + + self.ceiling_hgt_m = flt_prop.flight[flight_id]['ceiling_hgt_m'] + if self.burst_balloon == True and self.ceiling_hgt_m != None: + logging.debug( + "Warning you say you want the balloon to burst, but you also gave us a ceiling or float height, results may not be as expected") + + # hrs2sec = 3600 + + # start_timestamp = mt.datetime_epoch(balloon_start_datetime) + self.start_timestamp = self.BALLOON_START_DATETIME + #if self.BALLOON_END_DATETIME != None: + self.end_timestamp = self.BALLOON_END_DATETIME + + self.start_coord = dict({ + "lat": flt_prop.flight[flight_id]['launch_latitude'], + "lon": flt_prop.flight[flight_id]['launch_longitude'], + "alt_m": flt_prop.flight[flight_id]['launch_altitude'], + "timestamp": self.BALLOON_START_DATETIME, # timestamp + }) + self.end_coord = dict({ + "lat": flt_prop.flight[flight_id]['last_latitude'], + "lon": flt_prop.flight[flight_id]['last_longitude'], + "alt_m": flt_prop.flight[flight_id]['last_altitude'], + "end_datetime": self.BALLOON_END_DATETIME, # timestamp + }) + + if self.SIM_TIME_HOURS != None: + self.SIM_TIME_ITERATIONS = self.SIM_TIME_HOURS * int( + 3600 * (1 / self.DT_SEC)) # number of simulation points + elif self.end_timestamp != None and self.start_timestamp != None: + self.sim_time_sec = mt.datetime_epoch(self.end_timestamp) - mt.datetime_epoch(self.start_timestamp) + self.SIM_TIME_ITERATIONS = int(self.sim_time_sec / self.DT_SEC) + + self.TRACK_DATETIME = self.BALLOON_START_DATETIME + self.TRACK_ALTITUDE = self.MIN_ALT_M + print("Finished loading configuration properties...") + + def load_new(self, flight_id): + GMT = sim_prop.GMT + MIN_ALT_M = flt_prop.flight[flight_id]['launch_altitude'] + DT_SEC = sim_prop.dt_sec # important time for numerical integration of the physics models + SIM_TIME_HOURS = flt_prop.flight[flight_id]["flight_hours"] + BALLOON_NAME = sim_prop.simulation["balloon_name"] + ASCENT_RATE_MS = flt_prop.flight[flight_id]['ascent_rate_ms'] + GFS_RATE_SEC = sim_prop.GFS["GFSrate_sec"] + OUTPUT_DIR = sim_prop.output_dir + FLOAT_HGT_M = sim_prop.simulation['float_hgt_m'] + START_COORD = dict(sim_prop.simulation['start_coord']) + END_COORD = dict(sim_prop.simulation['end_coord']) + + # New Variable to add to properites + LEG_TIME_HOURS = sim_prop.simulation["leg_time_hr"] + LEG_TIME_ITERATIONS = LEG_TIME_HOURS * int(3600 * (1 / DT_SEC)) # number of simulation points + LEG_TIME_SEGMENTS = SIM_TIME_HOURS / LEG_TIME_HOURS + calc_methods = sim_prop.simulation["calc_methods"] + OUTPUT = sim_prop.output + STRATO_BOUNDARY = flt_prop.flight[flight_id]['strato_boundary_m'] + TROPO_ASCENT_MS = flt_prop.flight[flight_id]['tropo_ascent_rate_ms'] + TROPO_DESCENT_MS = flt_prop.flight[flight_id]['tropo_descent_rate_ms'] + STRATO_ASCENT_MS = flt_prop.flight[flight_id]['tropo_ascent_rate_ms'] + STRATO_DESCENT_MS = flt_prop.flight[flight_id]['tropo_descent_rate_ms'] + CEILING_M = sim_prop.simulation['ceiling_alt_m'] + PATH_DIRECTION = sim_prop.simulation['path_direction'] + + # This is done for date changes + SIM_GFS = sim_prop.gfs + NET_GFS = net_prop.gfs + + # New stuff for the hover stage + TOLERANCE_LEVEL = sim_prop.simulation[ + 'tolerance_level'] # this will be a percentage of target range and adjustable + TARGET_RANGE = sim_prop.simulation['target_range'] # This will be pulled from the mission params + HOVER_BOUNDRY = TOLERANCE_LEVEL * TARGET_RANGE # This is calculated based on the above + + # For the Graph + ALTITUDE_DIR = sim_prop.simulation['alt_graph_dir'] + + # For the daatsource + DATA_SOURCE = sim_prop.datasource + + # new era options + telemetry_dir = sim_prop.telemetry_dir + + # These are outputs + html_map = sim_prop.output['html'] # this is a htmlmap output + leaflet_map = sim_prop.output['leaflet_map'] # this is a leaflet map output + geojson_file = sim_prop.output['geojson'] # this is a geojson output + csv_file = sim_prop.output['csv'] # this is a csv output + cartopy_map = sim_prop.output['cartopy_map'] # this is a cartopy output + balloon_height = sim_prop.output['balloon_height'] # this is a blloon hieght output + + compare_to_telemetry = flt_prop.flight[flight_id]["compare_to_telemetry"] + telemetry_file = None + telemetry_source = None + use_telemetry_set = flt_prop.flight[flight_id]["use_telemetry_set"] + use_time_dimension = flt_prop.flight[flight_id]["use_time_dimension"] + if compare_to_telemetry or use_telemetry_set: + telemetry_file = flt_prop.flight[flight_id]["telemetry_file"] + telemetry_source = flt_prop.flight[flight_id]["telemetry_source"] + work_sheet_index = flt_prop.flight[flight_id]["work_sheet_index"] + + balloon_type = flt_prop.flight[flight_id]["balloon_type"] + start = flt_prop.flight[flight_id]['launch_time'] + end = flt_prop.flight[flight_id]['last_time'] + if start == None: + BALLOON_START_DATETIME = None + else: + BALLOON_START_DATETIME = datetime.fromisoformat(start) + + if end != None: + BALLOON_END_DATETIME = datetime.fromisoformat(end) + else: + BALLOON_END_DATETIME = None + + input_file = flt_prop.flight[flight_id]["model_file"] + + launch_latitude = flt_prop.flight[flight_id]["launch_latitude"] + launch_longitude = flt_prop.flight[flight_id]['launch_longitude'] + launch_altitude = flt_prop.flight[flight_id]['launch_altitude'] + + last_latitude = flt_prop.flight[flight_id]["last_latitude"] + last_longitude = flt_prop.flight[flight_id]['last_longitude'] + last_altitude = flt_prop.flight[flight_id]['last_altitude'] + + if SIM_TIME_HOURS == None: + if BALLOON_END_DATETIME == None: + logging.debug("In your flight time you must either set the number of hours to simulate via 'flight_hours' or ") + logging.debug("you must set the 'last_time' or being using telemetry else unknown length of simulation") + + descent_rate_ms = flt_prop.flight[flight_id]['descent_rate_ms'] + strato_boundary_m = flt_prop.flight[flight_id]['strato_boundary_m'] + if strato_boundary_m == None: + strato_ascent_rate_ms = None + strato_descent_rate_ms = None + else: + strato_ascent_rate_ms = flt_prop.flight[flight_id]['strato_ascent_rate_ms'] + strato_descent_rate_ms = flt_prop.flight[flight_id]['strato_descent_rate_ms'] + + burst_hgt_m = flt_prop.flight[flight_id]['burst_hgt_m'] + if burst_hgt_m == None: + burst_balloon = False + else: + burst_balloon = flt_prop.flight[flight_id]['burst'] + + ceiling_hgt_m = flt_prop.flight[flight_id]['ceiling_hgt_m'] + if burst_balloon == True and ceiling_hgt_m != None: + logging.debug("Warning you say you want the balloon to burst, but you also gave us a ceiling or float height, results may not be as expected") + + start_timestamp = BALLOON_START_DATETIME + if BALLOON_END_DATETIME != None: + end_timestamp = BALLOON_END_DATETIME + + start_coord = dict({ + "lat": flt_prop.flight[flight_id]['launch_latitude'], + "lon": flt_prop.flight[flight_id]['launch_longitude'], + "alt_m": flt_prop.flight[flight_id]['launch_altitude'], + "timestamp": BALLOON_START_DATETIME, # timestamp + }) + end_coord = dict({ + "lat": flt_prop.flight[flight_id]['last_latitude'], + "lon": flt_prop.flight[flight_id]['last_longitude'], + "alt_m": flt_prop.flight[flight_id]['last_altitude'], + "end_datetime": BALLOON_END_DATETIME, # timestamp + }) + + if SIM_TIME_HOURS != None: + SIM_TIME_ITERATIONS = SIM_TIME_HOURS * int(3600 * (1 / DT_SEC)) # number of simulation points + else: + sim_time_sec = mt.datetime_epoch(end_timestamp) - mt.datetime_epoch(start_timestamp) + SIM_TIME_ITERATIONS = int(sim_time_sec / DT_SEC) + + TRACK_DATETIME = BALLOON_START_DATETIME + TRACK_ALTITUDE = MIN_ALT_M + + return 1 + + ''' + This will be added later to remove it and standardize it, + We will need to have the version be passed someway, maybe thats the thing passed? + def log_configuration(self): + """Logs parameters to start the simulation + + Parameters: + rc (run_config object): Class that stores input paremeters + + Returns: + None + + readme = "Running trapezoid version 1.4 (03-01-2022)" + logging.info(readme) + logging.info("=======================================================================================================") + logging.info("Runtime settings are taking from simulation_plan, flight_plans, and to a lesser extent era5_properties and balloon_properties") + logging.info("We start the simulation as follows: ") + logging.info(f"flight_id: {self.flight_id}") + logging.info(f"NetCDF data will be obtained from {self.input_file}") + logging.info(f"GMT offset: {rc.GMT}") + if rc.compare_to_telemetry: + logging.info(f"telemetry_dir: {rc.telemetry_file}") + logging.info(f"gfs_rate_s in seconds: {rc.gfs_rate_s}, sampling rate or dt_sec: {rc.dt_sec}") + + logging.info(f"balloon_type: {rc.balloon_type}") + logging.info(f"Balloon start and end datatime:{rc.balloon_start_datetime}, {rc.balloon_end_datetime}") + logging.info(f"launch_latitude: {rc.launch_latitude}, launch_longitude: {rc.launch_longitude}, launch_altitude: {rc.launch_altitude}") + logging.info(f"last_latitude: {rc.last_latitude}, last_longitude: {rc.last_longitude}, last_altitude: {rc.last_altitude}") + logging.info(f"Minimum alt: {rc.min_alt_m}") + logging.info(" ") + logging.info(f"Simulation time in hours: {rc.sim_time_hrs}") + logging.info(f"ascent_rate_ms: {rc.ascent_rate_ms}, descent_rate_ms: {rc.descent_rate_ms}") + + + if rc.strato_boundary_m != None: + logging.info(f"strato_boundary_m: {rc.strato_boundary_m}") + logging.info(f"strato_ascent_rate_ms: {rc.strato_ascent_rate_ms}, strato_descent_rate_ms: {rc.strato_descent_rate_ms}") + + logging.info(f"burst_hgt_m: {rc.burst_hgt_m}") + ''' + + +def main(flight_id): + default_config = sim_config(flight_id) + + return default_config + + +if __name__ == "__main__": + main(flight_id=sim_prop.flight_id) + diff --git a/craig_files/mathtime_utilities.py b/craig_files/mathtime_utilities.py new file mode 100644 index 0000000..2f8063a --- /dev/null +++ b/craig_files/mathtime_utilities.py @@ -0,0 +1,91 @@ +from math import radians, degrees, sin, cos, asin, acos, atan2, pi, sqrt +import datetime as dt +from datetime import datetime +from pytz import timezone + +import logging + +logging.basicConfig(level=logging.WARNING) + +def great_circle(lon1, lat1, lon2, lat2): + if abs(lat2 - lat1) < .01 and abs(lon2 - lon1) < .01: + return 0.0 + lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) + + try: + x = acos(sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2)) + gc = 6371.0 * x + return gc + except: + logging.info("Problem doing calculation, with the following values:") + logging.info(f"lat1={lat1}, lon1={lon1}, lat2={lat2}, lon2={lon2}") + return None + +def move_point(latitude, longitude, distance_metres, bearing): + bearing_rad = radians(bearing) + lat_rad = radians(latitude) + lon_rad = radians(longitude) + earth_radius_metres = 6371000 + dist_frac = distance_metres / earth_radius_metres + + latitude_result = asin(sin(lat_rad) * cos(dist_frac) + cos(lat_rad) * sin(dist_frac) * cos(bearing_rad)); + a = atan2(sin(bearing_rad) * sin(dist_frac) * cos(lat_rad), cos(dist_frac) - sin(lat_rad) * sin(latitude_result)); + longitude_result = (lon_rad + a + 3 * pi) % (2 * pi) - pi + return latitude_result, longitude_result + +def isValidNumber(num): + if float('-inf') < float(num) < float('inf'): + return True + else: + return False + +''' +By default, Python, when use timestamp for some unexplained reason will give an opoch with an offset +for local time. If you run the code in Hawaii the epoch time will be different from say 3 hours from +PST or 3 X 60 X 60. + +So to force python to give you true GMT you need to take time wasting extra steps. The code is confirmed +using the web page: https://www.unixtimestamp.com/index.php +''' +def datetime_epoch(timedate_obj): + gmt = timezone('GMT') + try: + dt = timedate_obj.strftime("%Y-%m-%d %H:%M:%S") + naive_ts = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S") + except: + naive_ts = datetime.strptime(timedate_obj, "%Y-%m-%d %H:%M:%S") + + local_ts = gmt.localize(naive_ts) + epoch_ts = local_ts.timestamp() + + return int(epoch_ts) + +def str_to_datetime(time_str): + ''' + Convert string to datetime object + :param time_str: + :return: + ''' + format = '%Y-%m-%d %H:%M:%S' # The format + try: + datetime_obj = datetime.strptime(time_str, format) + except: + logging.info(f"Unable to convert string {time_str} to datetime object") + + return datetime_obj + +def num_to_month(month): + return { + 1: 'January', + 2: 'February', + 3: 'March', + 4: 'April', + 5: 'May', + 6:'June', + 7:'July', + 8:'August', + 9:'September', + 10:'October', + 11:'November', + 12:'December' + }[month] diff --git a/craig_files/radiation.py b/craig_files/radiation.py new file mode 100644 index 0000000..bcfc5cc --- /dev/null +++ b/craig_files/radiation.py @@ -0,0 +1,248 @@ +import math +import fluids +import numpy as np + +import properties.config_earth as config_earth + +""" +radiation3.py solves for radiation due to the enviorment for a particular datetime and altitude. +""" + +class Radiation: + # Constants + I0 = 1358 # Direct Solar Radiation Level + e = 0.016708 # Eccentricity of Earth's Orbit + P0 = 101325 # Standard Atmospheric Pressure at Sea Level + cloudElev = 3000 # (m) + cloudFrac = 0.0 # Percent cloud coverage [0,1] + cloudAlbedo = .65 # [0,1] + albedoGround = .2 # Ground albedo [0,1] + tGround = 293 # (K) Temperature of Ground + emissGround = .95 # [0,1] + SB = 5.670373E-8 # Stefan Boltzman Constant + RE = 6371000 # (m) Radius of Earth + radRef= .1 # [0,1] Balloon Reflectivity + radTrans = .1 # [0,1] Balloon Transmitivity + + start_coord = config_earth.simulation['start_coord'] + t = config_earth.simulation['start_time'] + lat = math.radians(start_coord['lat']) + Ls = t.timetuple().tm_yday + d = config_earth.balloon_properties['d'] + emissEnv = config_earth.balloon_properties['emissEnv'] + absEnv = config_earth.balloon_properties['absEnv'] + + projArea = 0.25*math.pi*d*d + surfArea = math.pi*d*d + + def getTemp(self, el): + atm = fluids.atmosphere.ATMOSPHERE_1976(el) + return atm.T + + def getPressure(self, el): + atm = fluids.atmosphere.ATMOSPHERE_1976(el) + return atm.P + + def getDensity(self, el): + atm = fluids.atmosphere.ATMOSPHERE_1976(el) + return atm.rho + + def getGravity(self, el): + atm = fluids.atmosphere.ATMOSPHERE_1976(el) + return atm.g + + def get_SI0(self): + """ Incident solar radiation above Earth's atmosphere (W/m^2) + + :returns: The incident solar radiation above Earths atm (W/m^2) + :rtype: float + """ + + f = 2*math.pi*Radiation.Ls/365 #true anomaly + e2 = pow(((1.+Radiation.e)/(1.-Radiation.e)),2) -1. + return Radiation.I0*(1.+0.5*e2*math.cos(f)) + + def get_declination(self): + """Expression from http://en.wikipedia.org/wiki/Position_of_the_Sun + + :returns: Approximate solar declination (rad) + :rtype: float + """ + + return -.4091*math.cos(2*math.pi*(Radiation.Ls+10)/365) + + def get_zenith(self, t, coord): + """ Calculates solar zenith angle + + :param t: Latitude (rad) + :type t: Datetime + :param coord: Solar Hour Angle (rad) + :type coord: dict + :returns: The approximate solar zenith angle (rad) + :rtype: float + """ + + solpos = fluids.solar_position(t, coord["lat"], coord["lon"], Z = coord["alt_m"]) + zen = math.radians(solpos[0]) #get apparent zenith + + # For determining adjusted zenith at elevation + # https://github.com/KosherJava/zmanim/blob/master/src/main/java/com/kosherjava/zmanim/util/AstronomicalCalculator.java#L176 + refraction = 4.478885263888294 / 60. + solarRadius = 16 / 60. + earthRadius = 6356.9; # in KM + elevationAdjustment = math.acos(earthRadius / (earthRadius + (coord["alt_m"]/1000.))); + + + adjusted_zen =zen - elevationAdjustment + math.radians(solarRadius + refraction) + return adjusted_zen + + def get_air_mass(self,zen, el): + """Air Mass at elevation + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: The approximate air mass (unitless) + :rtype: float + """ + + p = self.getPressure(el) #pressure at current elevation + am = (p/Radiation.P0)*(math.sqrt(1229 + pow((614*math.cos(zen)),2))-614*math.cos(zen)) + return am + + def get_trans_atm(self,zen,el): + """get zenith angle + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: The atmospheric trasmittance (unitless) + :rtype: float + """ + + am = self.get_air_mass(zen, el) + trans = 0.5*(math.exp(-0.65*am) + math.exp(-0.095*am)) + return trans + + def get_direct_SI(self,zen,el): + """Calculates Direct Solar Radiation + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: Tntensity of the direct solar radiation (W/m^2) + :rtype: float + """ + + SI0 = self.get_SI0() + trans = self.get_trans_atm(zen, el) + if zen > math.pi/2 : + direct_SI = 0 + else: + direct_SI = trans*SI0 + + return direct_SI + + def get_diffuse_SI(self,zen,el): + """Calculates Diffuse Solar Radiation from sky + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: The intensity of the diffuse solar radiation from the sky (W/m^2) + :rtype: float + """ + + if(zen > math.pi/2.): + return 0.0 + SI0 = self.get_SI0() + trans = self.get_trans_atm(zen, el) + if el < Radiation.cloudElev: + return (1-Radiation.cloudFrac)*0.5*SI0*math.sin(math.pi/2.-zen)*(1.-trans)/(1-1.4*math.log(trans)) + else: + return 0.5*SI0*math.sin(math.pi/2.-zen)*(1.-trans)/(1-1.4*math.log(trans)) + + def get_reflected_SI(self,zen,el): + """Calculates Reflected Solar Radiation from from the Earth's Surface + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: The intensity solar radiation reflected by the Earth (W/m^2) + :rtype: float + """ + + incident_SI = self.get_SI0() + tau_atm = self.get_trans_atm(zen,el) + if el < Radiation.cloudElev: + albedo = (1.-Radiation.cloudFrac)*Radiation.albedoGround; + else: + albedo = (1.-Radiation.cloudFrac)*(1-Radiation.cloudFrac)*Radiation.albedoGround + Radiation.cloudAlbedo*Radiation.cloudFrac + + return albedo*tau_atm*incident_SI*math.sin(math.pi/2.-zen) + + def get_earth_IR(self,el): + """Calculates Infared Radiation emitted from Earth's surface + + :param el: Elevation (m) + :type el: float + :returns: Intensity of IR radiation emitted from earth (W/m^2) + :rtype: float + """ + p = self.getPressure(el)#pressure at current elevation + IR_trans = 1.716-0.5*(math.exp(-0.65*p/Radiation.P0) + math.exp(-0.095*p/Radiation.P0)) + if el < Radiation.cloudElev: + tEarth = Radiation.tGround + else: + clouds = fluids.atmosphere.ATMOSPHERE_1976(Radiation.cloudElev) + tEarth = Radiation.tGround*(1.-Radiation.cloudFrac) + clouds.T*Radiation.cloudFrac + return IR_trans*Radiation.emissGround*Radiation.SB*pow(tEarth,4) + + def get_sky_IR(self,el): + """Calculates Infared Radiation emitted the from Sky + + :param el: Elevation (m) + :type el: float + :returns: Intensity of IR radiation emitted from sky (W/m^2) + :rtype: float + """ + + return np.fmax(-0.03*el+300.,50.0) + + def get_rad_total(self,datetime,coord): + """Total Radiation as a function of elevation, time of day, and balloon surface area + + """ + + zen = self.get_zenith(datetime, coord) + el = coord["alt"] + + #radRef = Radiation.radRef + Radiation.radRef*Radiation.radRef + Radiation.radRef*Radiation.radRef*Radiation.radRef + totAbs = Radiation.absEnv # + Radiation.absEnv*Radiation.radTrans + Radiation.absEnv*Radiation.radTrans*radRef + + hca = math.asin(Radiation.RE/(Radiation.RE+el)) #half cone angle + vf = 0.5*(1. - math.cos(hca)) #viewfactor + + direct_I = self.get_direct_SI(zen, el) + power_direct = direct_I*totAbs*Radiation.projArea + + diffuse_I = self.get_diffuse_SI(zen, el) + power_diffuse = diffuse_I*totAbs*(1.-vf)*Radiation.surfArea + + reflected_I = self.get_reflected_SI(zen, el) + power_reflected = reflected_I*totAbs*vf*Radiation.surfArea + + earth_IR = self.get_earth_IR(el) + power_earth_IR = earth_IR*Radiation.emissEnv*vf*Radiation.surfArea + + sky_IR = self.get_sky_IR(el) + power_sky_IR = sky_IR*Radiation.emissEnv*(1.-vf)*Radiation.surfArea + + rad_tot_bal = power_direct + power_diffuse + power_reflected + power_earth_IR + power_sky_IR + + return rad_tot_bal diff --git a/craig_files/simulation_plan.py b/craig_files/simulation_plan.py new file mode 100644 index 0000000..b63534d --- /dev/null +++ b/craig_files/simulation_plan.py @@ -0,0 +1,61 @@ +''' +This is a very simple file that just tells us what flight plan we want to do Its based on. +what we give it as flight_id. + +We separate flight plans from simulation so that we can create a database of previous flights, if we +want to go back. So here we just point to a flight plan (based on flight_id) and tell the simulation +what output options we want. + +Data dependency note: +This program can compare computed flight paths with actual flight paths. It should be noted that currently, +we assume a specific format for the data as given by our first sample sets of NRL data. In the future, +we will build in support for different telemetry types. + +See also: flight_simulator, flight_plans.py +''' +#flight_id = 'NRL20210920' +#flight_id = 'HBAL0445' +#flight_id = 'HBAL0446' +#flight_id = 'HBAL0447' +#flight_id = 'HBAL0449' +#flight_id = 'HBAL0448' + +flight_id = 'era_sample_2022-06-01' +#flight_id = 'SAMPLE_DISTANCE' +#flight_id = 'SAMPLE_DIRECTION' +#flight_id = 'era_sample2' +#flight_id = 'HBAL0458' +flight_id = 'shab10v' +#flight_id = 'NRL20211217' # this must be changed for different simulations + +GMT = 7 # local time offset + +output = dict( + html = True, # create a google.map representation of the optimized track + leaflet_map = False, # create a leaflet map representation of the optimized track + geojson = False, # output optimized track to geojson + cartopy_map = True, # create a mapplotlib + balloon_height = True, # will map balloon height on a graph as a function of time + csv = False, + altitude = 'all', + track = 'all' +) +forecast_dir = "./forecasts" +output_dir = "./trajectories/" +telemetry_dir = "./balloon_data" +alt_graph_dir = './alt_graph' +data_sample_rate_s = 60 # (s) How often New Wind speeds are looked up +dt_sec = 3.0 # (s) Time Step for integrating (If error's occur, use a lower step size) +GFSrate_sec = 60 # (s) How often New Wind speeds are looked up +tmp_calc_methods = ['trapezoid_optimizer', 'ensemble_cc', 'psuedo_gradient', 'best_track'], +calc_methods = list(tmp_calc_methods[0]) # this is a quick workaround, need to solve the underlying issue +# for some reason the above is cast as a tuple. so this is forcing it to not be, theres a better way we an address later. +# optional leaflet map configuration don't normally use this +leaflet_config = { + "center": [39.05,-78.75], # initial map center point + "zoom": 6, # initial zoom level + "show_zoom_control": False, # hide / show zoom control + "tile_provider": 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}', + "attribution": 'Earth HAB', # map attribution + "show_attribution": False # show / hide map attribution +} diff --git a/craig_files/solve_states.py b/craig_files/solve_states.py new file mode 100644 index 0000000..c9cd3ab --- /dev/null +++ b/craig_files/solve_states.py @@ -0,0 +1,167 @@ +import math +import properties.radiation +import sphere_balloon +import properties.config_earth #Import parameters from configuration file. + +import logging + +logging.basicConfig(level=logging.WARNING) + +""" solve_states.py uses numerical integration to solve for the dynamic response of the balloon. +""" + +class SolveStates: + def __init__(self): + """Initializes all of the solar balloon paramaters from the configuration file""" + + self.Cp_air0 = config_earth.earth_properties['Cp_air0'] + self.Rsp_air = config_earth.earth_properties['Rsp_air'] + + self.d = config_earth.balloon_properties['d'] + self.vol = math.pi*4/3*pow((self.d/2),3) #volume m^3 + self.surfArea = math.pi*self.d*self.d #m^2 + self.cs_area = math.pi*self.d*self.d/4.0 #m^2 + + #self.emissEnv = config_earth.balloon_properties['emissEnv'] + self.areaDensityEnv = config_earth.balloon_properties['areaDensityEnv'] + self.mp = config_earth.balloon_properties['mp'] + self.mdot = 0 + self.massEnv = config_earth.balloon_properties['mEnv'] + self.Upsilon = config_earth.balloon_properties['Upsilon'] + + self.vent = config_earth.simulation['vent'] + self.coord = config_earth.simulation['start_coord'] + self.t = config_earth.simulation['start_time'] + self.lat = math.radians(self.coord['lat']) + self.Ls = self.t.timetuple().tm_yday + self.min_alt = config_earth.simulation['min_alt'] + + self.vm_coeff = .1 #virtual mass coefficient + self.k = self.massEnv*config_earth.balloon_properties['cp'] #thermal mass coefficient + + self.dt = config_earth.dt + + def get_acceleration(self,v,el,T_s,T_i): + """Solves for the acceleration of the solar balloon after one timestep (dt). + + :param T_s: Surface Temperature (K) + :type T_s: float + :param T_i: Internal Temperature (K) + :type T_i: float + :param el: Elevation (m) + :type el: float + :param v: Velocity (m) + :type v: float + + :returns: acceleration of balloon (m/s^2) + :rtype: float + """ + + rad = radiation.Radiation() + T_atm = rad.getTemp(el) + p_atm = rad.getPressure(el) + rho_atm = rad.getDensity(el) + g = rad.getGravity(el) + + + rho_int = p_atm/(self.Rsp_air*T_i) # Internal air density + + Cd = .5 # Drag Coefficient + F_b = (rho_atm - rho_int)*self.vol*g # Force due to buyoancy + F_d = Cd*(0.5*rho_atm*math.fabs(v)*v)*self.cs_area# Force due to Drag + + if F_d > 0: + F_d = F_d * self.Upsilon + vm = (self.massEnv + self.mp) + rho_atm*self.vol + self.vm_coeff*rho_atm*self.vol #Virtual Mass + accel = ((F_b - F_d - (self.massEnv + self.mp)*g)/vm) + + return accel + + def get_convection_vent(self,T_i,el): + """Calculates the heat lost to the atmosphere due to venting + + :param T_i: Internal Temperature (K) + :type T_i: float + :param el: Elevation (m) + :type el: float + + :returns: Convection due to Venting (unit?) + :rtype: float + """ + + rad = radiation.Radiation() + T_atm = rad.getTemp(el) + + Q_vent = self.mdot*self.Cp_air0*(T_i-T_atm) # Convection due to released air + return Q_vent + + + def solveVerticalTrajectory(self,t,T_s,T_i,el,v,coord,alt_sp,v_sp): + """This function numerically integrates and solves for the change in Surface Temperature, Internal Temperature, and accelleration + after a timestep, dt. + + :param t: Datetime + :type t: datetime + :param T_s: Surface Temperature (K) + :type T_s: float + :param T_i: Internal Temperature (K) + :type T_i: float + :param el: Elevation (m) + :type el: float + :param v: Velocity (m) + :type v: float + :param alt_sp: Altitude Setpoint (m) + :type alt_sp: float + :param v_sp: Velocity Setpoint (m/s) + :type v_sp: float + + :returns: Updated parameters after dt (seconds) + :rtype: float [T_s,T_i,el,v] + """ + + bal = sphere_balloon.Sphere_Balloon() + rad = radiation.Radiation() + + T_atm = rad.getTemp(el) + p_atm = rad.getPressure(el) + rho_atm = rad.getDensity(el) + + rho_int = p_atm/(self.Rsp_air*T_i) + tm_air = rho_int*self.vol*self.Cp_air0 + + #Numerically integrate change in Surface Temperature + coord["alt"] = el + q_rad = rad.get_rad_total(t,coord) + q_surf = bal.get_sum_q_surf(q_rad, T_s, el, v) + q_int = bal.get_sum_q_int(T_s, T_i, el) + dT_sdt = (q_surf-q_int)/self.k + + #Numerically integrate change in Surface Temperature + tm_air = rho_atm*self.vol*self.Cp_air0 + dT_idt = (q_int-self.get_convection_vent(T_i,el))/tm_air + + #Add the new surface and internal Temperatures + T_s_new = T_s+dT_sdt*self.dt + T_i_new = T_i+dT_idt*self.dt + + #solve for accellration, position, and velocity + dzdotdt = self.get_acceleration(v,el,T_s,T_i) + zdot = v + dzdotdt*self.dt + z = el+zdot*self.dt + + #Add the new velocity and position + if z < self.min_alt: + v_new = 0 + el_new = self.min_alt + else: + v_new = zdot + el_new = z + + # Venting commands for an altitude setpoint. Vent is either on or off. + if el_new > alt_sp: + self.mdot = self.vent + + if el_new < alt_sp: + self.mdot = 0 + + return [T_s_new,T_i_new,T_atm,el_new,v_new, q_rad, q_surf, q_int] diff --git a/craig_files/telemetry_retriever.py b/craig_files/telemetry_retriever.py new file mode 100644 index 0000000..946556c --- /dev/null +++ b/craig_files/telemetry_retriever.py @@ -0,0 +1,330 @@ +import numpy as np +import mathtime_utilities as mt +import glob +import pandas as pd +import datetime as dt +from datetime import datetime +import sys + +import logging + +logging.basicConfig(level=logging.WARNING) + +def get_telemetry(df, r_config): + """ + From telemetry data stored in the dataframe, get position data of the GPS telemetry + and return in a data frame + + Note, need to migrate more parsers from discovery_balloon_prop.py + + Parameters + ---------- + df: dataframe + Dataframe from parsing the telemetry data + + r_config : class obj + Object that contains all the parameters of our simulation + + Returns + ------- + df: dataframe + dataframe containing position and height information of observed tracks from + + + Examples + -------- + + """ + if r_config.telemetry_source == "NRL": + df_nrl = pd.read_csv("./balloon_data/" + r_config.telemetry_file, index_col=False) + df_nrl['Time'] = (pd.to_datetime(df['Time'].str.strip(), format='%Y-%m-%d %H:%M:%S')) + # reduce data sample size to second level precision + + df_nrl['Time'] = df['Time'].values.astype('= hgt["burst_m"] and hgt["burst"]: + hgt["burst_occurred"] = True + else: + el_new += hgt["descent_ms"] * hgt["dt_sec"] + + hgt["elevation_m"] = el_new + return hgt + + +def get_new_height(h_m, epoch, timestamp): + """Here we pass the current timestamp, then we perform linear interpolation to get the index of epoch array, that + is closest to the the timestamp. Lastly, we use the index to grab the height in meters from h_m. + :param h_m: An array of Height of balloon in meters + :param epoch: An array of epoch time values + :param timestamp: timestamp to use in interpolating values from epoch + :returns: height associated with where the balloon is in time + """ + #Given an ordered array and a value, determines the index of the closest item contained in the array. + + closest_idx = min(range(len(epoch)), key=lambda i: abs(epoch[i] - timestamp)) + height_m = h_m[closest_idx] + + return height_m + + +def compare_to_telemetry(df, gmap, source): + ''' + + :param df: dataframe from csv or excel + :param gmap: google map object + :param source: string that tells us where data came from, helps in parsing + :return: + ''' + + if source == "NRL": + + gps_hgt_m = df['altitude'].tolist() + gps_lat = df['lat'].tolist() + gps_lon = df['lng'].tolist() + gps_lat_arr = np.array(gps_lat) + gps_lon_arr = np.array(gps_lon) + + # NRL dataset has a lot of missing numbers which must be removed before plotting (Navy doesn't) + nan_array = np.isnan(gps_lat_arr) + not_nan_array = ~ nan_array + gpslat_deg = gps_lat_arr[not_nan_array] + nan_array = np.isnan(gps_lon_arr) + not_nan_array = ~ nan_array + gpslon_deg = gps_lon_arr[not_nan_array] + elif source == 'APRSFI' or source == 'APRS' or source == 'APRS2': + gps_hgt_m = df['altitude'].tolist() + gpslat_deg = df['latitude'].tolist() + gpslon_deg = df['longitude'].tolist() + + gmap.plot(gpslat_deg, gpslon_deg, 'blue', edge_width=2.5) + gmap.marker(gpslat_deg[-1], gpslon_deg[-1], 'blue', title="End Observed Location") + + +def main(flight_id, rc): + if rc == None: + savenetcdf = False + rc = lc.sim_config(savenetcdf, flight_id) + logging.info(f"Loading config from {flight_id}") # switch to info level logging when tests are done + else: + logging.error('Config provided') # switch to info level logging when tests are done + readme = "Running trapezoid_era version 1.3 (03-01-2022)" + logging.debug(readme) + if rc.compare_to_telemetry: + df, rc = tm.get_flight_plan_by_telemetry(rc) + h_m = df['altitude'] + times = df['Time'] + try: + df['date'] = pd.to_datetime(df['Time']) + epoch = (df['date'] - dt.datetime(1970, 1, 1)).dt.total_seconds() + logging.debug(pd.to_datetime(epoch[0], unit='s')) + except: + logging.debug("ugh, unable to convert timestamp to unix epoch, will take nap, bye") + sys.exit(-1) + + log_configuration(rc) + model = get_era5(rc) + logging.info(readme) + logging.info(f"Balloon will be launched at {rc.start_coord['lat']}, {rc.start_coord['lon']}") + logging.info(f"Starting at {rc.start_coord['timestamp']}") + GMT = 7 + + # Import configuration file variables + coord = rc.start_coord + start = rc.BALLOON_START_DATETIME + end = rc.BALLOON_END_DATETIME + first_sec = start + t = start + min_alt_m = rc.MIN_ALT_M + # float_hgt_m = sim_prop.simulation['altitude_setpt_m'] + burst_hgt_m = rc.burst_hgt_m + burst_balloon = rc.burst_balloon + ceiling_hgt_m = rc.ceiling_hgt_m + dt_sec = rc.DT_SEC + SIM_TIME_HOURS = rc.SIM_TIME_HOURS + GFSrate_sec = rc.GFS_RATE_SEC + balloon_name = rc.BALLOON_NAME + balloon_ascent_ms = rc.ASCENT_RATE_MS + balloon_descent_ms = rc.descent_rate_ms + + # determine how many simulations we will do as a function of our flight time and integration seconds + if rc.use_telemetry_set: + print("Telemetry file provided the following:") + sim_time_sec = rc.sim_time_sec + SIM_TIME_ITERATIONS = rc.SIM_TIME_ITERATIONS + print(f"Simulation seconds {sim_time_sec} and {SIM_TIME_ITERATIONS} iterations") + logging.info("Telemetry file provided the following:") + logging.info(f"Simulation seconds {sim_time_sec} and {SIM_TIME_ITERATIONS} iterations") + SIM_TIME_HOURS = sim_time_sec/3600.0 + print(f"This will run simulation for approximately {SIM_TIME_HOURS} hours.") + logging.info(f"This will run simulation for approximately {SIM_TIME_HOURS} hours.") + else: + if SIM_TIME_HOURS != None: + sim_time_sec = SIM_TIME_HOURS * 3600.0 + SIM_TIME_ITERATIONS = int((SIM_TIME_HOURS * 3600.0)/ dt_sec) # number of simulation points + else: + sim_time_sec = mt.datetime_epoch(end) - mt.datetime_epoch(start) + SIM_TIME_ITERATIONS = int(sim_time_sec / dt_sec) + + simulation_points = SIM_TIME_ITERATIONS + logging.debug(f"Simulation time in hours: {SIM_TIME_HOURS} and iterations: {SIM_TIME_ITERATIONS}") + # Initialize trajectory variables + el = [min_alt_m] # 9000 + coord_new = coord + + lat_deg = [coord["lat"]] # won't be used in trapezoid routines + lon_deg = [coord["lon"]] # """ + balloon_datetime = [coord["timestamp"]] + height_m = el.copy() + + ttt = [t - pd.Timedelta(hours=GMT)] # Just for visualizing plot better] + gfscount = 0 + + first_burst = False + + # the following segment is used when we float a balloon and then + # tell it to land. We need to know how long we need to start descending + if ceiling_hgt_m != None and burst_balloon == False: + logging.debug("determine how many seconds you will need to descend your balloon") + distance = ceiling_hgt_m - min_alt_m + time_in_sec = abs(distance/balloon_descent_ms) + stop_sec = sim_time_sec - time_in_sec + + if rc.compare_to_telemetry == True: + logging.debug("Do simulation using telemetry based heights... ") + for i in range(0, simulation_points): + t = t + pd.Timedelta(hours=(1 / 3600 * dt_sec)) + epoch_t = mt.datetime_epoch(t) + + # Store coordinates that change every iteration + + if i % GFSrate_sec == 0: + el_new = get_new_height(h_m, epoch, epoch_t) + coord_new['alt_m'] = el_new + coord_new['timestamp'] = t + if rc.use_time_dimension: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, nearest_lat, nearest_lon, nearest_alt = model.getNewCoord(coord_new, dt_sec * GFSrate_sec) + else: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, nearest_lat, nearest_lon, nearest_alt = model.getNewCoordNoTime(coord_new, dt_sec * GFSrate_sec) + gfscount += 1 + if lat_new == None: + logging.debug("Program likely came to the end of model data at epoch {t}") + break + + lat_deg.append(lat_new) + lon_deg.append(lon_new) + height_m.append(el_new) + balloon_datetime.append(t) + # store coordinates that change at a lower resolution + coord_new['lat'] = lat_new + coord_new['lon'] = lon_new + el.append(el_new) + + else: + logging.debug("Do simulation using modeled elevation and heights... ") + height_parameters = dict( + elevation_m=min_alt_m, + burst=burst_balloon, + burst_occurred=False, + ceiling_m=ceiling_hgt_m, + burst_m=burst_hgt_m, + ascent_ms=balloon_ascent_ms, + descent_ms=balloon_descent_ms, + min_alt_m=min_alt_m, # (m) Elevation + dt_sec=dt_sec + + ) + + for i in range(0, simulation_points): + t = t + pd.Timedelta(hours=(1 / 3600 * dt_sec)) + hr_diff = t - first_sec + timedelta_seconds = hr_diff.total_seconds() + if burst_balloon == False: + if timedelta_seconds >= stop_sec: + if first_burst == False: + logging.debug(f"Time to start balloon descent at {t}") + height_parameters["burst_occurred"] = True + rad = radiation.Radiation() + zen = rad.get_zenith(t, coord_new) + + height_parameters = get_height(height_parameters) + el_new = height_parameters["elevation_m"] + + if height_parameters["burst_occurred"] == True and first_burst == False: + first_burst = True + coord_new['alt_m'] = el_new + coord_new['timestamp'] = t + if rc.use_time_dimension: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, nearest_lat, nearest_lon, nearest_alt = model.getNewCoord(coord_new, dt_sec * GFSrate_sec) + else: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, nearest_lat, nearest_lon, nearest_alt = model.getNewCoordNoTime(coord_new, dt_sec * GFSrate_sec) + gfscount += 1 + lat_deg.append(lat_new) + lon_deg.append(lon_new) + height_m.append(el_new) + balloon_datetime.append(t) + # store coordinates that change at a lower resolution + coord_new['lat'] = lat_new + coord_new['lon'] = lon_new + logging.debug(f"Balloon burst at {t} after {i} iterations") + + if el_new < height_parameters["min_alt_m"]: + logging.debug(f"Balloon hit grount at {t} after {i} iterations") + break + # Store coordinates that change every iteration + + coord_new['alt_m'] = el_new + coord_new['timestamp'] = t + + if i % GFSrate_sec == 0: + if rc.use_time_dimension: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, nearest_lat, nearest_lon, nearest_alt = model.getNewCoord(coord_new, dt_sec * GFSrate_sec) + else: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, nearest_lat, nearest_lon, nearest_alt = model.getNewCoordNoTime(coord_new, dt_sec * GFSrate_sec) + + + + if lat_new == None: + break + + gfscount += 1 + lat_deg.append(lat_new) + lon_deg.append(lon_new) + height_m.append(el_new) + balloon_datetime.append(t) + # store coordinates that change at a lower resolution + coord_new['lat'] = lat_new + coord_new['lon'] = lon_new + + # if zen > math.radians(90): uncommented out these two lines in the original + # el_new -= 3 + + el.append(el_new) + ttt.append(t - pd.Timedelta(hours=GMT)) # Just for visualizing plot better + + if i % 1000 * (1 / dt_sec) == 0: + logging.debug(str(t - pd.Timedelta(hours=GMT)) # Just for visualizing better + + " el " + str("{:.4f}".format(el_new)) + + " zen " + str(math.degrees(zen)) + ) + + logging.debug(colored( + ("U wind speed: " + str(x_wind_vel) + " V wind speed: " + str(y_wind_vel) + " Bearing: " + str( + bearing)), + "yellow")) + logging.debug(colored(("Lat: " + str(lat_new) + " Lon: " + str(lon_new)), "green")) + logging.debug(colored( + ("Nearest Lat:" + str(nearest_lat) + " Nearest Lon:" + str(nearest_lon) + " (" + str( + 360 - nearest_lon) + + ") Nearest Alt: " + str(nearest_alt)), "cyan")) + + if rc.BALLOON_END_DATETIME != None and t >= rc.BALLOON_END_DATETIME: + logging.debug(f"Ending simulation reached end of balloon flight time") + logging.debug(t) + break + + # Store the last point of data after loops finished + lat_deg.append(coord_new['lat']) + lon_deg.append(coord_new['lon']) + height_m.append(coord_new['alt_m']) + balloon_datetime.append(coord_new['timestamp']) + max_hgt_m = max(height_m) + + # Outline Downloaded forecast subset: + region = zip(*[ + (model.lat_bot_deg, model.lon_left_deg), + (model.lat_top_deg, model.lon_left_deg), + (model.lat_top_deg, model.lon_right_deg), + (model.lat_bot_deg, model.lon_right_deg) + ]) + logging.debug(f"{min(lat_deg)}, {max(lat_deg)}, {min(lon_deg)}, {max(lon_deg)}, {ttt[0]} {ttt[-1]}") + logging.info(f"Balloon flew to a maximum height of {max_hgt_m}") + + # Google Plotting of Trajectory + if rc.html_map: + gmap1 = gmplot.GoogleMapPlotter(coord["lat"], coord["lon"], 8) + gmap1.plot(lat_deg, lon_deg, 'red', edge_width=2.5) + gmap1.marker(lat_deg[-1], lon_deg[-1], 'red', title="End Forecasted Position") + gmap1.polygon(*region, color='cornflowerblue', edge_width=1, alpha=.2) + gmap1.marker(lat_deg[0], lon_deg[0], 'black', title="Start Location") + if rc.compare_to_telemetry == True: + compare_to_telemetry(df, gmap1, rc.telemetry_source) + + my_datetime = datetime.now().strftime("%Y-%m-%d_%H%M") + model_datetime = str(t.year) + "-" + str(t.month) + "-" + str(start.day) + full_file_path = sim_prop.output_dir+"TrapezoidERA" + my_datetime+"_" + model_datetime + ".html" + + gmap1.draw(full_file_path) + +# Plot balloon height versus time + if rc.balloon_height: + plt.style.use('seaborn-pastel') + fig, ax = plt.subplots(figsize=(8, 8)) + height_ft = np.asarray(height_m) * 3.28084 + ax.plot(balloon_datetime, height_m) + ax.set_ylabel('Altitude (m)') + ax2 = ax.twinx() + ax2.plot(balloon_datetime, height_ft) + ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x:,.0f}')) + ax2.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x:,.0f}')) + ax2.set_ylabel('Altitude (ft)') + ax.set_xlabel('Datetime (GMT)') + plt.title('Altitude Profile for Solar Balloon') + + model_datetime = str(t.year) + "-" + str(t.month) + "-" + str(start.day) + full_file_path = rc.OUTPUT_DIR+'HAB-height_'+model_datetime+".png" + plt.savefig(full_file_path) + #plt.show() + +# Create geojson output + if rc.geojson_file: + number_of_balloon_runs = 1 # do simulation for single balloon in trapezoid + my_datetime = datetime.now().strftime("%Y-%m-%d_%H%M") + file_identifier = my_datetime + "_model-" + model.model_start_datetime.strftime("%Y-%m-%d_%H") + output_file = geo.j_init(rc.OUTPUT_DIR, file_identifier) + number_of_features = number_of_balloon_runs - 1 + geo.j_write(output_file, lat_deg, lon_deg, height_m, number_of_features) + geo.j_close(output_file, number_of_balloon_runs) + +# Create a csv file output + if rc.csv_file: + my_datetime = datetime.now().strftime("%Y-%m-%d_%H%M") + file_identifier = my_datetime + "_ERA5-model-" + model.model_start_datetime.strftime("%Y-%m-%d_%H") + column_headers = ["count","latitude","longitude","height","datetime"] + output_file = csv.init(column_headers,rc.OUTPUT_DIR, file_identifier) + csv.write(output_file, lat_deg, lon_deg, height_m, balloon_datetime) + + + #t1_mod = time.time() + #return t1_mod - t0_mod + # These are placeholder values, I need to see whats going on with these varibales + min_dist_datetime = balloon_datetime[0] + min_dist_km = 50.0 + + + return lat_deg, lon_deg, height_m, balloon_datetime, min_dist_datetime, min_dist_km + +if __name__ == "__main__": + total_mod = main(flight_id=sim_prop.flight_id, rc=None) + logging.info(f"Total run time: {total_mod}") \ No newline at end of file diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..af0d16c --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = . + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/doctrees/API/GFS.doctree b/docs/doctrees/API/GFS.doctree new file mode 100644 index 0000000..4b0ca32 Binary files /dev/null and b/docs/doctrees/API/GFS.doctree differ diff --git a/docs/doctrees/API/era5.doctree b/docs/doctrees/API/era5.doctree new file mode 100644 index 0000000..6b2641b Binary files /dev/null and b/docs/doctrees/API/era5.doctree differ diff --git a/docs/doctrees/API/index.doctree b/docs/doctrees/API/index.doctree new file mode 100644 index 0000000..0453b87 Binary files /dev/null and b/docs/doctrees/API/index.doctree differ diff --git a/docs/doctrees/API/radiation.doctree b/docs/doctrees/API/radiation.doctree new file mode 100644 index 0000000..34c99f3 Binary files /dev/null and b/docs/doctrees/API/radiation.doctree differ diff --git a/docs/doctrees/API/solve_states.doctree b/docs/doctrees/API/solve_states.doctree new file mode 100644 index 0000000..d896c3e Binary files /dev/null and b/docs/doctrees/API/solve_states.doctree differ diff --git a/docs/doctrees/API/sphere_balloon.doctree b/docs/doctrees/API/sphere_balloon.doctree new file mode 100644 index 0000000..c621c17 Binary files /dev/null and b/docs/doctrees/API/sphere_balloon.doctree differ diff --git a/docs/doctrees/API/windmap.doctree b/docs/doctrees/API/windmap.doctree new file mode 100644 index 0000000..591bfee Binary files /dev/null and b/docs/doctrees/API/windmap.doctree differ diff --git a/docs/doctrees/citing.doctree b/docs/doctrees/citing.doctree new file mode 100644 index 0000000..7114828 Binary files /dev/null and b/docs/doctrees/citing.doctree differ diff --git a/docs/doctrees/environment.pickle b/docs/doctrees/environment.pickle new file mode 100644 index 0000000..5b52e0a Binary files /dev/null and b/docs/doctrees/environment.pickle differ diff --git a/docs/doctrees/examples/downloadERA5.doctree b/docs/doctrees/examples/downloadERA5.doctree new file mode 100644 index 0000000..983da49 Binary files /dev/null and b/docs/doctrees/examples/downloadERA5.doctree differ diff --git a/docs/doctrees/examples/downloadGFS.doctree b/docs/doctrees/examples/downloadGFS.doctree new file mode 100644 index 0000000..05a9a23 Binary files /dev/null and b/docs/doctrees/examples/downloadGFS.doctree differ diff --git a/docs/doctrees/examples/index.doctree b/docs/doctrees/examples/index.doctree new file mode 100644 index 0000000..de2c04f Binary files /dev/null and b/docs/doctrees/examples/index.doctree differ diff --git a/docs/doctrees/index.doctree b/docs/doctrees/index.doctree new file mode 100644 index 0000000..d97ff62 Binary files /dev/null and b/docs/doctrees/index.doctree differ diff --git a/docs/doctrees/installation.doctree b/docs/doctrees/installation.doctree new file mode 100644 index 0000000..8eb81a4 Binary files /dev/null and b/docs/doctrees/installation.doctree differ diff --git a/docs/era5.log b/docs/era5.log new file mode 100644 index 0000000..ec47e21 --- /dev/null +++ b/docs/era5.log @@ -0,0 +1,3 @@ +2023-10-12 13:11 | ERROR | Unable to locate netcdf file forecasts/SHAB15V_ERA5_20220822_20220823.nc, terminating program +2023-10-12 13:14 | ERROR | Unable to locate netcdf file forecasts/SHAB15V_ERA5_20220822_20220823.nc, terminating program +2023-10-12 13:14 | ERROR | Unable to locate netcdf file forecasts/SHAB15V_ERA5_20220822_20220823.nc, terminating program diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo new file mode 100644 index 0000000..02333b2 --- /dev/null +++ b/docs/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: baf1332703da8e97823d23bc730fcf92 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/html/API/GFS.html b/docs/html/API/GFS.html new file mode 100644 index 0000000..222b887 --- /dev/null +++ b/docs/html/API/GFS.html @@ -0,0 +1,219 @@ + + + + + + + GFS — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GFS

+

GFS extracts meteorological data from a NOAA netcdf (.nc file) data set. To speed up predicting trajectories, +saveNETCDF.py should be run before main.py. This way, the large data set doesn’t need to be redownloaded each time the trajectory is run. +For now, only wind velocity is used for the simulation prediction. Atmposheric properties such as temperarature and pressure are based off of +the U.S. Standard Atmosphere tables from 1976, and the fluids library is used for these, which can be seen in radiation3.py

+
+
+class GFS.GFS(centered_coord)[source]
+
+
+__init__(centered_coord)[source]
+
+ +
+
+closest(arr, k)[source]
+

Given an ordered array and a value, determines the index of the closest item contained in the array.

+
+ +
+
+determineRanges(netcdf_ranges)[source]
+

Determine the following variable ranges (min/max) within the netcdf file:

+

-time +-lat +-lon

+
+

Note

+

the levels variable is uncessary for knowing the ranges for, because they vary from +coordinate to coordinate, and all levels in the array are always be used.

+
+
+ +
+
+fill_missing_data(data)[source]
+

Helper function to fill in linearly interpolate and fill in missing data

+
+ +
+
+getNearestAlt(hour_index, lat, lon, alt)[source]
+

Determines the nearest altitude based off of geo potential height of a .25 degree lat/lon area.

+
+ +
+
+getNearestLat(lat, min, max)[source]
+

Determines the nearest lattitude (to .25 degrees)

+
+ +
+
+getNearestLon(lon, min, max)[source]
+

Determines the nearest longitude (to .25 degrees)

+
+ +
+
+getNewCoord(coord, dt)[source]
+

Determines the new coordinates every second due to wind velocity +:param coord: Coordinate of balloon +:type coord: dict +:returns: [lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, closest_lat, closest_lon, closest alt] +:rtype: array

+
+ +
+
+wind_alt_Interpolate(coord)[source]
+

This function performs a 2-step linear interpolation to determine horizontal wind velocity at a +3d desired coordinate and timestamp.

+

The figure below shows a visual representation of how wind data is stored in netcdf forecasts based on +lat, lon, and geopotential height. The data forms a non-uniform grid, that also changes in time. Therefore +we performs a 2-step linear interpolation to determine horizontal wind velocity at a desired 3D coordinate +and particular timestamp.

+

To start, the two nearest .25 degree lat/lon areas to the desired coordinate are looked up along with the +2 closest timestamps t0 and t1. This produces 6 arrays: u-wind, v-wind, and geopotential heights at the lower +and upper closest timestamps (t0 and t1).

+

Next, the geopotential height is converted to altitude (m) for each timestamp. For the first interpolation, +the u-v wind components at the desired altitude are determined (1a and 1b) using np.interp.

+

Then, once the wind speeds at matching altitudes for t0 and t1 are detemined, a second linear interpolation +is performed with respect to time (t0 and t1).

+../_images/netcdf-2step-interpolation.png +
+
Parameters:
+

coord (dict) – Coordinate of balloon

+
+
Returns:
+

[u_wind_vel, v_wind_vel]

+
+
Return type:
+

array

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/API/era5.html b/docs/html/API/era5.html new file mode 100644 index 0000000..3530be5 --- /dev/null +++ b/docs/html/API/era5.html @@ -0,0 +1,315 @@ + + + + + + + ERA5 — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

ERA5

+

This version was edited to integrate with EarthSHAB.

+

Contributing authors: Craig Motell and Michael Rodriguez of NIWC Pacific +Edited and integrated: Tristan Schuler

+
+
+class ERA5.ERA5(start_coord)[source]
+
+
+__init__(start_coord)[source]
+

Create a class object containing information about an ERA5. Along the way, +it checks whether it can take a subset of your model data. For example, if you have +data before or after your simulation times, you can ignore these data through saving +indexes.

+
+
Parameters:
+

start_coord – starting coordinate of balloon for simulation

+
+
+
+

Note

+

Similar to class GFS which stores NOAA GFS data from NOMAD server

+
+
+

See also

+

GFS

+
+
+ +
+
+closestIdx(arr, k)[source]
+

Given an ordered array and a value, determines the index of the closest item contained in the array.

+
+ +
+
+determineRanges(netcdf_ranges)[source]
+

Determine the dimensions of actual data. If you have columns or rows with missing data +as indicated by NaN, then this function will return your actual shape size so you can +resize your data being used.

+
+ +
+
+fill_missing_data(data)[source]
+

Helper function to fill in linearly interpolate and fill in missing data

+
+ +
+
+get2NearestAltIdxs(h, alt_m)[source]
+

Determines 2 nearest indexes for altitude for interpolating angles. +It does index wrap from 0 to -1, which is taken care of in ERA5.interpolateBearing()

+
+ +
+
+getNearestAltbyIndex(int_hr_idx, lat_i, lon_i, alt_m)[source]
+

Determines the nearest altitude based off of geo potential height of a .25 degree lat/lon area. +at a given latitude, longitude index

+
+ +
+
+getNearestLatIdx(lat, min, max)[source]
+

Determines the nearest latitude index (to .25 degrees), which will be integer index starting at 0 where you data is starting

+
+ +
+
+getNearestLonIdx(lon, min, max)[source]
+

Determines the nearest longitude (to .25 degrees)

+
+ +
+
+getNewCoord(coord, dt)[source]
+

Determines the new coordinates of the balloon based on the effects of U and V wind components.

+
+
Parameters:
+
    +
  • coord (dict) – Contains current position, altitude and time of balloon object.

  • +
  • dt (float) – Integration time

  • +
  • Returns – lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, closest_lat, closest_lon, closest alt

  • +
+
+
+
+ +
+
+init_with_time()[source]
+

adds to class object containing information about an ERA5 but without any time +variables.

+
+
Returns:
+

ERA5 – Initialize class object with our NetCDF data.

+
+
Return type:
+

ERA5 Class Object

+
+
+

Notes

+

Similar to class GFS which stores NOAA GFS data from NOMAD server

+
+ +
+
+interpolateBearing(h, u, v, alt_m)[source]
+

Given altitude, u_velocity and v_velocity arrays as well as a desired altitude, perform a linear interpolation +between the 2 altitudes (h0 and h1) while accounting for possible 0/360degree axis crossover.

+
+ +
+
+interpolateBearingTime(bearing0, speed0, bearing1, speed1, hour_index)[source]
+

Similar to ERA5.interpolateBearing() however bearings and speeds are already known +and linearly then interpolated with respect to time (t0 and t1)

+
+ +
+
+windVectorToBearing(u, v)[source]
+

Helper function to conver u-v wind components to bearing and speed.

+
+ +
+
+wind_alt_Interpolate(alt_m, diff_time, lat_idx, lon_idx)[source]
+
+

Warning

+

This function is no longer used. Use wind_alt_Interpolate2 which does 2 different types of interpolation to choose from.

+
+

Performs a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest +.25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time.

+
+

Note

+

I performed a lot of clean up of this code from what Craig originally sent me. I’m not exactly sure what +about all the difference from GFS to ERA5 for this function. I will do more cleaning and variable renaming in a later version. +The results are the same right now thoug.

+
+
+
Parameters:
+
    +
  • alt_m (float) – Contains current altitude of balloon object.

  • +
  • diff_time – This parameter is calculated in two different places, need to clean up this parameter

  • +
  • lon_idx (integer) – Closest index into longitude array

  • +
  • lat_idx (integer) – Closest index into latitude array

  • +
  • Returns

    +
    ufloat

    u component wind vector

    +
    +
    vfloat

    v component wind vector

    +
    +
    +

  • +
+
+
+
+ +
+
+wind_alt_Interpolate2(alt_m, diff_time, lat_idx, lon_idx)[source]
+

Performs two different types of a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest +.25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time.

+

The old method performs the linear interpolation using u-v wind Components +the new method performs the linear interpolation using wind bearing and speed.

+

Both are calculated in this function. The examples use the new method (bearing and wind), which should be slightly more accurate.

+
+
Parameters:
+
    +
  • alt_m (float) – Contains current altitude of balloon object.

  • +
  • diff_time – This parameter is calculated in two different places, need to clean up this parameter

  • +
  • lon_idx (integer) – Closest index into longitude array

  • +
  • lat_idx (integer) – Closest index into latitude array

  • +
  • note: (..) – TODO:

  • +
  • Returns

    +
    u_newfloat

    u component wind vector (bearing/speed interpolation)

    +
    +
    v_newfloat

    v component wind vector (bearing/speed interpolation)

    +
    +
    u_oldfloat

    u component wind vector (u-v component interpolation)

    +
    +
    v_oldfloat

    v component wind vector (u-v component interpolation)

    +
    +
    +

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/API/index.html b/docs/html/API/index.html new file mode 100644 index 0000000..eef681b --- /dev/null +++ b/docs/html/API/index.html @@ -0,0 +1,134 @@ + + + + + + + EarthSHAB API — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

EarthSHAB API

+ + +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/API/radiation.html b/docs/html/API/radiation.html new file mode 100644 index 0000000..0e730c4 --- /dev/null +++ b/docs/html/API/radiation.html @@ -0,0 +1,333 @@ + + + + + + + radiation — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

radiation

+

radiation solves for radiation due to the enviorment for a particular datetime and altitude.

+
+
+class radiation.Radiation[source]
+
+
+getTempForecast(coord)[source]
+

Looks up the forecast temperature at the current coordinate and altitude

+
+

Important

+

TODO. This function is not operational yet.

+
+
+
Parameters:
+

coord (dict) – current coordinate

+
+
Returns:
+

atmospheric temperature (k)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_SI0()[source]
+

Incident solar radiation above Earth’s atmosphere (W/m^2)

+
+\[I_{sun,0}= I_0 \cdot [1+0.5(\frac{1+e}{1-e})^2-1) \cdot cos(f)]\]
+
+
Returns:
+

The incident solar radiation above Earths atm (W/m^2)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_air_mass(zen, el)[source]
+

Air Mass at elevation

+
+\[AM = 1229+(614cos(\zeta)^2)^{\frac{1}{2}}-614cos(\zeta)\]
+
+
Parameters:
+
    +
  • zen (float) – Solar Angle (rad)

  • +
  • el (float) – Elevation (m)

  • +
+
+
Returns:
+

The approximate air mass (unitless)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_diffuse_SI(zen, el)[source]
+

Calculates Diffuse Solar Radiation from sky

+
+
Parameters:
+
    +
  • zen (float) – Solar Angle (rad)

  • +
  • el (float) – Elevation (m)

  • +
+
+
Returns:
+

The intensity of the diffuse solar radiation from the sky (W/m^2)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_direct_SI(zen, el)[source]
+

Calculates Direct Solar Radiation

+
+
Parameters:
+
    +
  • zen (float) – Solar Angle (rad)

  • +
  • el (float) – Elevation (m)

  • +
+
+
Returns:
+

Tntensity of the direct solar radiation (W/m^2)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_earth_IR(el)[source]
+

Calculates Infared Radiation emitted from Earth’s surface

+
+
Parameters:
+

el (float) – Elevation (m)

+
+
Returns:
+

Intensity of IR radiation emitted from earth (W/m^2)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_rad_total(datetime, coord)[source]
+

Calculates total radiation sources as a function of altitude, time, and balloon surface area.

+

The figure below shows how different altitudes effects the radiation sources on +a particular date and coordinate for Tucson Arizona (at sruface level and 25 km altitudes)

+../_images/Tucson_Radiation_Comparison.png +
+ +
+
+get_reflected_SI(zen, el)[source]
+

Calculates Reflected Solar Radiation from from the Earth’s Surface

+
+
Parameters:
+
    +
  • zen (float) – Solar Angle (rad)

  • +
  • el (float) – Elevation (m)

  • +
+
+
Returns:
+

The intensity solar radiation reflected by the Earth (W/m^2)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_sky_IR(el)[source]
+

Calculates Infared Radiation emitted the from Sky

+
+
Parameters:
+

el (float) – Elevation (m)

+
+
Returns:
+

Intensity of IR radiation emitted from sky (W/m^2)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_trans_atm(zen, el)[source]
+

The amount of solar radiation that permeates through the atmosphere at a +certain altitude, I_{sun} is driven by the atmospheric transmittance.

+
+\[\tau_{atm}= \frac{1}{2}(e^{-0.65AM}+e^{-0.095AM})\]
+
+
Parameters:
+
    +
  • zen (float) – Solar Angle (rad)

  • +
  • el (float) – Elevation (m)

  • +
+
+
Returns:
+

The atmospheric trasmittance (unitless)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_zenith(t, coord)[source]
+

Calculates adjusted solar zenith angle at elevation

+
+
Parameters:
+
    +
  • t (Datetime) – Lattitude (rad)

  • +
  • coord (dict) – Solar Hour Angle (rad)

  • +
+
+
Returns:
+

The approximate solar zenith angle (rad)

+
+
Return type:
+

float

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/API/solve_states.html b/docs/html/API/solve_states.html new file mode 100644 index 0000000..6541561 --- /dev/null +++ b/docs/html/API/solve_states.html @@ -0,0 +1,219 @@ + + + + + + + solve_states — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

solve_states

+

solve_states uses numerical integration to solve for the dynamic response of the balloon.

+
+
+class solve_states.SolveStates[source]
+
+
+__init__()[source]
+

Initializes all of the solar balloon paramaters from the configuration file

+
+ +
+
+get_acceleration(v, el, T_s, T_i)[source]
+

Solves for the acceleration of the solar balloon after one timestep (dt).

+
+\[\frac{d^2z}{dt^2} = \frac{dU}{dt} = \frac{F_b-F_g-F_d}{m_{virtual}}\]
+

The Buyoancy Force, F_{b}:

+
+\[F_b = (\rho_{atm}-\rho_{int}) \cdot V_{bal} \cdot g\]
+

The drag force, F_{d}:

+
+\[F_d = \frac{1}{2} \cdot C_d \cdot rho_{atm} \cdot U^2 \cdot A_{proj} \cdot \beta\]
+

and where the virtual mass is the total mass of the balloon system:

+
+\[m_{virt} = m_{payload}+m_{envelope}+C_{virt} \cdot \rho_{atm} \cdot V_{bal}\]
+
+
Parameters:
+
    +
  • T_s (float) – Surface Temperature (K)

  • +
  • T_i (float) – Internal Temperature (K)

  • +
  • el (float) – Elevation (m)

  • +
  • v (float) – Velocity (m)

  • +
+
+
Returns:
+

acceleration of balloon (m/s^2)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_convection_vent(T_i, el)[source]
+

Calculates the heat lost to the atmosphere due to venting

+
+\[Q_{vent} = \dot{m} \cdot c_v \cdot (T_i-T_{atm})\]
+
+
Parameters:
+
    +
  • T_i (float) – Internal Temperature (K)

  • +
  • el (float) – Elevation (m)

  • +
+
+
Returns:
+

Convection due to Venting (unit?)

+
+
Return type:
+

float

+
+
+
+ +
+
+solveVerticalTrajectory(t, T_s, T_i, el, v, coord, alt_sp, v_sp)[source]
+

This function numerically integrates and solves for the change in Surface Temperature, Internal Temperature, and accelleration +after a timestep, dt.

+
+\[\frac{dT_s}{dt} = \frac{\dot{Q}_{rad}+\dot{Q}_{conv,ext}-\dot{Q}_{conv,int}}{c_{v,env} \cdot m_{envelope}}\]
+
+\[\frac{dT_i}{dt} = \frac{\dot{Q}_{conv,int}-\dot{Q}_{vent}}{c_{v,CO_2} \cdot m_{CO_2}}\]
+
+
Parameters:
+
    +
  • t (datetime) – Datetime

  • +
  • T_s (float) – Surface Temperature (K)

  • +
  • T_i (float) – Internal Temperature (K)

  • +
  • el (float) – Elevation (m)

  • +
  • v (float) – Velocity (m)

  • +
  • alt_sp (float) – Altitude Setpoint (m)

  • +
  • v_sp (float) – Velocity Setpoint (m/s)

  • +
+
+
Returns:
+

Updated parameters after dt (seconds)

+
+
Return type:
+

float [T_s,T_i,el,v]

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/API/sphere_balloon.html b/docs/html/API/sphere_balloon.html new file mode 100644 index 0000000..b65c6d6 --- /dev/null +++ b/docs/html/API/sphere_balloon.html @@ -0,0 +1,340 @@ + + + + + + + sphere_balloon — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

sphere_balloon

+

sphere_balloon solves for the total heat transfer on the solar balloon.

+
+
+class sphere_balloon.Sphere_Balloon[source]
+

Initializes atmospheric properties from the earth configuration file

+
+
+__init__()[source]
+

Initializes all of the solar balloon paramaters from the configuration file

+
+ +
+
+get_Nu_ext(Ra, Re, Pr)[source]
+

Calculates External Nusselt Number.

+

Determine the external convection due to natural buoyancy

+
+\[\begin{split}Nu_{ext,n}=\begin{cases} +2+0.6Ra^{0.25}, & \text{$Ra<1.5\cdot10^8$}\\ +0.1Ra^{0.34}, & \text{$Ra\geq1.5\cdot10^8$} +\end{cases}\end{split}\]
+

Determine the external forced convection due to the balloon ascending

+
+\[\begin{split}Nu_{ext,f}=\begin{cases} +2+0.47Re^{\frac{1}{2}}Pr^{\frac{1}{3}}, & \text{$Re<5\cdot10^4$}\\ +(0.0262Re^{0.34}-615)Pr^{\frac{1}{3}}, & \text{$Re\geq1.5\cdot10^8$} +\end{cases}\end{split}\]
+

To transition between the two correlations:

+
+\[Nu_{ext} = max(Nu_{ext,n},Nu_{ext,f})\]
+
+
Parameters:
+
    +
  • Ra (float) – Raleigh’s number

  • +
  • Re (float) – Reynold’s number

  • +
  • Pr (float) – Prandtl Number

  • +
+
+
Returns:
+

External Nusselt Number

+
+
Return type:
+

float

+
+
+
+ +
+
+get_Nu_int(Ra)[source]
+

Calculates Internal Nusselt Number for internal convection between the balloon +envelope and internal gas

+
+\[\begin{split}Nu_{int}=\begin{cases} +2.5(2+0.6Ra^{\frac{1}{4}}), & \text{$Ra<1.35\cdot10^8$}\\ +0.325Ra^{\frac{1}{3}}, & \text{$Ra\geq1.35\cdot10^8$} +\end{cases}\end{split}\]
+
+
Parameters:
+

Ra (float) – Raleigh’s number

+
+
Returns:
+

Internal Nusselt Number

+
+
Return type:
+

float

+
+
+
+ +
+
+get_Pr(T)[source]
+

Calculates Prantl Number

+
+\[Pr = \mu_{air} \frac{C_{p,air}}{k}\]
+
+
Parameters:
+

T – Temperature (K)

+
+
Returns:
+

Prantl Number

+
+
Return type:
+

float

+
+
+
+ +
+
+get_conduction(T)[source]
+

Calculates Thermal Diffusivity of Air at Temperature, T using Sutherland’s Law of Thermal Diffusivity

+
+\[k_{air} = 0.0241(\frac{T_{atm}}{271.15})^{0.9}\]
+
+
Parameters:
+

T – Temperature (K)

+
+
Returns:
+

Thermal Diffusivity of Air (W/(m*K)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_q_ext(T_s, el, v)[source]
+

Calculate External Heat Transfer to balloon envelope

+
+
Parameters:
+
    +
  • zen (float) – Surface Temperature of Envelope (K)

  • +
  • el (float) – Elevation (m)print fluids.atmosphere.solar_position(datetime.datetime(2018, 4, 15, 6, 43, 5), 51.0486, -114.07)[0]

  • +
  • el – velocity (m/s)

  • +
+
+
Returns:
+

Power transferred from sphere to surrounding atmosphere due to convection(W)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_q_int(T_s, T_i, el)[source]
+

Calculates Internal Heat Transfer

+
+
Parameters:
+
    +
  • T_s (float) – Surface Temperature of Envelope (K)

  • +
  • el (float) – Elevation (m)

  • +
  • v (float) – velocity (m/s)

  • +
+
+
Returns:
+

Internal Heat Transfer (W)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_sum_q_int(T_s, T_i, el)[source]
+

Calculates sum of Internal Heat Transfer.

+
+

Note

+

Currently there are no initial heat sources. So this function returns the negative of get_q_int()

+
+
+
Parameters:
+
    +
  • T_s (float) – Surface Temperature of Envelope (K)

  • +
  • el (float) – Elevation (m)

  • +
  • v (float) – velocity (m/s)

  • +
+
+
Returns:
+

SUm of Internal Heat Transfer (W)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_sum_q_surf(q_rad, T_s, el, v)[source]
+

External Heat Transfer

+
+
Parameters:
+
    +
  • q_rad (float) – Power input from external radiation (W)

  • +
  • T_s (float) – Surface Temperature of Envelope (K)

  • +
  • el (float) – Elevation (m)

  • +
  • v (float) – velocity (m/s)

  • +
+
+
Returns:
+

The sum of power input to the balloon surface (W)

+
+
Return type:
+

float

+
+
+
+ +
+
+get_viscocity(T)[source]
+

Calculates Kinematic Viscocity of Air at Temperature, T

+
+\[\mu_{air} = 1.458\cdot10^{-6}\frac{T_{atm}^{1.5}}{T_{atm}+110.4}\]
+
+
Parameters:
+

T – Temperature (K)

+
+
Returns:
+

mu, Kinematic Viscocity of Air

+
+
Return type:
+

float

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/API/windmap.html b/docs/html/API/windmap.html new file mode 100644 index 0000000..9e4cdc2 --- /dev/null +++ b/docs/html/API/windmap.html @@ -0,0 +1,236 @@ + + + + + + + windmap — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

windmap

+

This is file generates a 3d windrose plot for a particular coordinate and timestamp. +The polar plot displays information on wind speed and direction at +various altitudes in a visual format

+
+
+class windmap.Windmap[source]
+
+
+__init__()[source]
+
+ +
+
+getWind(hour_index, lat_i, lon_i, interpolation_frequency=1)[source]
+

Calculates a wind vector estimate at a particular 3D coordinate and timestamp +using a 2-step linear interpolation approach.

+

Currently using scipy.interpolat.CubicSpline instead of np.interp like in GFS and ERA5.

+

See also GFS.GFS.wind_alt_Interpolate()

+
+
Parameters:
+
    +
  • hour_index (int) – Time index from forecast file

  • +
  • lat_i (int) – Array index for corresponding netcdf lattitude array

  • +
  • lon_i (int) – Array index for corresponding netcdf laongitude array

  • +
+
+
Returns:
+

[U, V]

+
+
Return type:
+

float64 2d array

+
+
+
+ +
+
+plotWind2(hour_index, lat, lon, num_interpolations=100)[source]
+

Calculates a wind vector estimate at a particular 3D coordinate and timestamp +using a 2-step linear interpolation approach.

+

I believe this is more accurate than linear interpolating the U-V wind components. Using arctan2 +creates a non-linear distribution of points, however they should still be accurate. arctan2 causes issues +when there are 180 degree opposing winds because it is undefined, and the speed goes to 0 and back up to the new speed.

+

Therefore instead we interpolate the wind speed and direction, and use an angle wrapping check to see if the shortest +distance around the circle crosses the 0/360 degree axis. This prevents speed down to 0, as well as undefined regions.

+
    +
  1. Get closest timesteps (t0 and t1) and lat/lon indexes for desired time

  2. +
  3. Convert the entire altitude range at t0 and t1 U-V wind vector components to wind speed and direction (rad and m/s)

  4. +
  5. Perform a linear interpolation of wind speed and direction. Fill in num_iterations

  6. +
+
+
Parameters:
+
    +
  • hour_index (int) – Time index from forecast file

  • +
  • lat – Latitude coordinate [deg]

  • +
  • lon_i (cloast) – Longitude coordinate [deg]

  • +
+
+
Returns:
+

3D windrose plot

+
+
Return type:
+

matplotlib.plot

+
+
+
+ +
+
+plotWindVelocity(hour_index, lat, lon, interpolation_frequency=1)[source]
+

Plots a 3D Windrose for a particular coordinate and timestamp from a downloaded forecast.

+
+
Parameters:
+
    +
  • hour_index (int) – Time index from forecast file

  • +
  • lat (float) – Latitude

  • +
  • lon (float) – Longitude

  • +
+
+
Returns:
+

+
+
+
+ +
+
+time_in_range(start, end, x)[source]
+

Return true if x is in the range [start, end]

+
+ +
+
+windVectorToBearing(u, v, h)[source]
+

Converts U-V wind data at specific heights to angular and radial +components for polar plotting.

+
+
Parameters:
+
    +
  • u (float64 array) – U-Vector Wind Component from Forecast

  • +
  • v (float64 array) – V-Vector Wind Component from Forecast

  • +
  • h (float64 array) – Corresponding Converted Altitudes (m) from Forecast

  • +
+
+
Returns:
+

Array of bearings, radius, colors, and color map for plotting

+
+
Return type:
+

array

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_images/SHAB12-V.png b/docs/html/_images/SHAB12-V.png new file mode 100644 index 0000000..9d5a9ac Binary files /dev/null and b/docs/html/_images/SHAB12-V.png differ diff --git a/docs/html/_images/Tucson_Radiation_Comparison.png b/docs/html/_images/Tucson_Radiation_Comparison.png new file mode 100644 index 0000000..df4f0d7 Binary files /dev/null and b/docs/html/_images/Tucson_Radiation_Comparison.png differ diff --git a/docs/html/_images/era5_data_selection.png b/docs/html/_images/era5_data_selection.png new file mode 100644 index 0000000..67612c6 Binary files /dev/null and b/docs/html/_images/era5_data_selection.png differ diff --git a/docs/html/_images/era5_data_selection2.png b/docs/html/_images/era5_data_selection2.png new file mode 100644 index 0000000..09fc351 Binary files /dev/null and b/docs/html/_images/era5_data_selection2.png differ diff --git a/docs/html/_images/era5_download.png b/docs/html/_images/era5_download.png new file mode 100644 index 0000000..dda8b97 Binary files /dev/null and b/docs/html/_images/era5_download.png differ diff --git a/docs/html/_images/gfs_2022-02-17.png b/docs/html/_images/gfs_2022-02-17.png new file mode 100644 index 0000000..d96d425 Binary files /dev/null and b/docs/html/_images/gfs_2022-02-17.png differ diff --git a/docs/html/_images/netcdf-2step-interpolation.png b/docs/html/_images/netcdf-2step-interpolation.png new file mode 100644 index 0000000..0d64773 Binary files /dev/null and b/docs/html/_images/netcdf-2step-interpolation.png differ diff --git a/docs/html/_images/nomad_server.png b/docs/html/_images/nomad_server.png new file mode 100644 index 0000000..bdcca9d Binary files /dev/null and b/docs/html/_images/nomad_server.png differ diff --git a/docs/html/_images/rainbow_trajectories_altitude.png b/docs/html/_images/rainbow_trajectories_altitude.png new file mode 100644 index 0000000..d5fba64 Binary files /dev/null and b/docs/html/_images/rainbow_trajectories_altitude.png differ diff --git a/docs/html/_images/rainbow_trajectories_map.PNG b/docs/html/_images/rainbow_trajectories_map.PNG new file mode 100644 index 0000000..19c6597 Binary files /dev/null and b/docs/html/_images/rainbow_trajectories_map.PNG differ diff --git a/docs/html/_modules/ERA5.html b/docs/html/_modules/ERA5.html new file mode 100644 index 0000000..a66f681 --- /dev/null +++ b/docs/html/_modules/ERA5.html @@ -0,0 +1,666 @@ + + + + + + ERA5 — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for ERA5

+"""
+This version was edited to integrate with EarthSHAB.
+
+Contributing authors: Craig Motell and Michael Rodriguez of NIWC Pacific
+Edited and integrated: Tristan Schuler
+"""
+import logging
+import numpy as np
+import netCDF4
+from termcolor import colored
+import math
+from geographiclib.geodesic import Geodesic
+import sys
+import os
+from scipy import interpolate
+from pytz import timezone
+from datetime import datetime, timedelta
+
+import config_earth #integrate with EARTHSHAB
+
+
+[docs] +class ERA5: + #def __init__(self, start_coord, end_coord, input_file, dt_sec, sim_time_hours, use_time): +
+[docs] + def __init__(self, start_coord): #CHANGED INPUT VARIABLES + """Create a class object containing information about an ERA5. Along the way, + it checks whether it can take a subset of your model data. For example, if you have + data before or after your simulation times, you can ignore these data through saving + indexes. + + :param start_coord: starting coordinate of balloon for simulation + :type coord: dict + + .. note:: Similar to class GFS which stores NOAA GFS data from NOMAD server + + .. seealso:: GFS + + """ + + self.dt = config_earth.simulation['dt'] + self.sim_time = config_earth.simulation['sim_time'] + + try: + self.file = netCDF4.Dataset("forecasts/" + config_earth.netcdf_era5["filename"]) # Only accepting manual uploads for now + + except: + print(colored((f'Unable to locate netcdf file'),"red")) + sys.exit(1) + + self.geod = Geodesic.WGS84 + self.resolution_hr = config_earth.netcdf_era5['resolution_hr'] + self.start_coord = config_earth.simulation["start_coord"] + + self.init_with_time()
+ + + #def init_without_time(self, start_coord, end_coord, dt_sec, sim_time_hours): # modded the number of varibales for troubleshootin +
+[docs] + def init_with_time(self): + + ''' adds to class object containing information about an ERA5 but without any time + variables. + + Returns + ------- + ERA5 : ERA5 Class Object + Initialize class object with our NetCDF data. + + Notes + ----- + Similar to class GFS which stores NOAA GFS data from NOMAD server + + See Also + -------- + + ''' + + self.start_time = config_earth.simulation['start_time'] + self.min_alt_m = self.start_coord['alt'] + + time_arr = self.file.variables['time'] + #Convert from epoch to human readable time. Different than GFS for now. + self.time_convert = netCDF4.num2date(time_arr[:], time_arr.units, time_arr.calendar) + self.model_start_datetime = self.time_convert[0] #reanalysis should be same time as gfs predictions for now + self.model_end_datetime = self.time_convert[-1] + + # Determine Index values from netcdf4 subset + netcdf_ranges = self.file.variables['u'][0, 0, :, :] + self.determineRanges(netcdf_ranges) + + # smaller array of downloaded forecast subset + self.lat = self.file.variables['latitude'][self.lat_max_idx:self.lat_min_idx] + self.lon = self.file.variables['longitude'][self.lon_min_idx:self.lon_max_idx] + + # min/max lat/lon degree values from netcdf4 subset + self.LAT_LOW = self.file.variables['latitude'][self.lat_min_idx-1] + self.LON_LOW = self.file.variables['longitude'][self.lon_min_idx] + self.LAT_HIGH = self.file.variables['latitude'][self.lat_max_idx] + self.LON_HIGH = self.file.variables['longitude'][self.lon_max_idx-1] + + print("LAT RANGE: min:" + str(self.file.variables['latitude'][self.lat_min_idx-1]), " max: " + str(self.file.variables['latitude'][self.lat_max_idx]) + " size: " + str(self.lat_min_idx-self.lat_max_idx)) + print("LON RANGE: min:" + str(self.file.variables['longitude'][self.lon_min_idx]), " max: " + str(self.file.variables['longitude'][self.lon_max_idx-1]) + " size: " + str(self.lon_max_idx-self.lon_min_idx)) + + # Import the netcdf4 subset to speed up table lookup in this script + g = 9.80665 # gravitation constant used to convert geopotential height to height + + self.levels = self.file.variables['level'][:] + #these are typos, fix later. Should be ugrdprs0 + self.ugdrps0 = self.file.variables['u'][self.start_time_idx:self.end_time_idx+1, :, self.lat_max_idx:self.lat_min_idx, self.lon_min_idx:self.lon_max_idx] + self.vgdrps0 = self.file.variables['v'][self.start_time_idx:self.end_time_idx+1, :, self.lat_max_idx:self.lat_min_idx, self.lon_min_idx:self.lon_max_idx] + self.hgtprs = self.file.variables['z'][self.start_time_idx:self.end_time_idx+1, :, self.lat_max_idx:self.lat_min_idx, self.lon_min_idx:self.lon_max_idx] / g #what is this divide by g??? + + print() + + #Check if number of hours will fit in simulation time + desired_simulation_end_time = self.start_time + timedelta(hours=self.sim_time) + diff_time = (self.time_convert[self.end_time_idx] - self.start_time).total_seconds() #total number of seconds between 2 timestamps + + print("Sim start time: ", self.start_time) + print("NetCDF end time:", self.time_convert[self.end_time_idx]) + print("Max sim runtime:", diff_time//3600, "hours") + print("Des sim runtime:", self.sim_time, "hours") + print() + + if not desired_simulation_end_time <= self.time_convert[self.end_time_idx]: + print(colored("Desired simulation run time of " + str(self.sim_time) + + " hours is out of bounds of downloaded forecast. " + + "Check simulation start time and/or download a new forecast.", "red")) + sys.exit()
+ + +
+[docs] + def determineRanges(self, netcdf_ranges): + """ + Determine the dimensions of actual data. If you have columns or rows with missing data + as indicated by NaN, then this function will return your actual shape size so you can + resize your data being used. + + """ + + results = np.all(~netcdf_ranges.mask) + print(results) + if results == False: + timerange, latrange, lonrange = np.nonzero(~netcdf_ranges.mask) + + self.start_time_idx = timerange.min() + self.end_time_idx = timerange.max() + self.lat_min_idx = latrange.min() #Min/Max are switched compared to with ERA5 + self.lat_max_idx = latrange.max() + self.lon_min_idx = lonrange.min() + self.lon_max_idx = lonrange.max() + else: #This might be broken for time + self.start_time_idx = 0 + self.end_time_idx = len(self.time_convert)-1 + lati, loni = netcdf_ranges.shape + #THese are backwards??? + self.lat_min_idx = lati + self.lat_max_idx = 0 + self.lon_max_idx = loni + self.lon_min_idx = 0
+ + +
+[docs] + def closestIdx(self, arr, k): + """ Given an ordered array and a value, determines the index of the closest item contained in the array. + + """ + return min(range(len(arr)), key=lambda i: abs(arr[i] - k))
+ + +
+[docs] + def getNearestLatIdx(self, lat, min, max): + """ Determines the nearest latitude index (to .25 degrees), which will be integer index starting at 0 where you data is starting + + """ + # arr = np.arange(start=min, stop=max, step=self.res) + # i = self.closest(arr, lat) + i = self.closestIdx(self.lat, lat) + return i
+ + +
+[docs] + def getNearestLonIdx(self, lon, min, max): + """ Determines the nearest longitude (to .25 degrees) + + """ + + # lon = lon % 360 #convert from -180-180 to 0-360 + # arr = np.arange(start=min, stop=max, step=self.res) + i = self.closestIdx(self.lon, lon) + return i
+ + +
+[docs] + def get2NearestAltIdxs(self, h, alt_m): + """ Determines 2 nearest indexes for altitude for interpolating angles. + It does index wrap from 0 to -1, which is taken care of in `ERA5.interpolateBearing()` + + """ + h_nearest = self.closestIdx(h, alt_m) + + if alt_m > h[h_nearest]: + h_idx0 = h_nearest + h_idx1 = h_nearest +1 + else: + h_idx0 = h_nearest - 1 + h_idx1 = h_nearest + + return h_idx0, h_idx1
+ + +
+[docs] + def getNearestAltbyIndex(self, int_hr_idx, lat_i, lon_i, alt_m): + """ Determines the nearest altitude based off of geo potential height of a .25 degree lat/lon area. + at a given latitude, longitude index + + """ + + i = self.closestIdx(self.hgtprs[int_hr_idx, :, lat_i, lon_i], alt_m) + + return i
+ + +
+[docs] + def wind_alt_Interpolate(self, alt_m, diff_time, lat_idx, lon_idx): + """ + .. warning:: This function is no longer used. Use wind_alt_Interpolate2 which does 2 different types of interpolation to choose from. + + Performs a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest + .25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time. + + .. note:: I performed a lot of clean up of this code from what Craig originally sent me. I'm not exactly sure what + about all the difference from GFS to ERA5 for this function. I will do more cleaning and variable renaming in a later version. + The results are the same right now thoug. + + Parameters + ---------- + alt_m : float + Contains current altitude of balloon object. + diff_time: ? + This parameter is calculated in two different places, need to clean up this parameter + lon_idx : integer + Closest index into longitude array + lat_idx : integer + Closest index into latitude array + + Returns: + u : float + u component wind vector + v : float + v component wind vector + + """ + + #This function is deprecated and no longer used! + + #we need to clean this up, ends up we check for the hour_index before we call this function + #diff = coord["timestamp"] - self.model_start_datetime + hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + + hgt_m = alt_m + + # First interpolate wind speeds between 2 closest time steps to match altitude estimates (hgtprs), which can change with time + v_0 = self.vgdrps0[int(hour_index), :, lat_idx, lon_idx] # Round hour index to nearest int + v_0 = self.fill_missing_data(v_0) # Fill the missing wind data if occurs at upper heights + + u_0 = self.ugdrps0[int(hour_index), :, lat_idx, lon_idx] + u_0 = self.fill_missing_data(u_0) + + xp_0 = self.hgtprs[int(hour_index), :, lat_idx, lon_idx] + xp_0 = self.fill_missing_data(xp_0) + + f = interpolate.interp1d(xp_0, u_0, assume_sorted=False, fill_value="extrapolate") + u0_pt = f(hgt_m) + f = interpolate.interp1d(xp_0, v_0, assume_sorted=False, fill_value="extrapolate") + v0_pt = f(hgt_m) + + # Next interpolate the wind velocities with respect to time. + v_1 = self.vgdrps0[int(hour_index) + 1, :, lat_idx, lon_idx] + v_1 = self.fill_missing_data(v_1) + u_1 = self.ugdrps0[int(hour_index) + 1, :, lat_idx, lon_idx] + u_1 = self.fill_missing_data(u_1) + #t_1 = self.temp0[int_hr_idx2, :, lat_idx, lon_idx] + #t_1 = self.fill_missing_data(t_1) + xp_1 = self.hgtprs[int(hour_index) +1 , :, lat_idx, lon_idx] + xp_1 = self.fill_missing_data(xp_1) + + #t1_pt = f(hgt_m) + f = interpolate.interp1d(xp_1, u_1, assume_sorted=False, fill_value="extrapolate") + u1_pt = f(hgt_m) + f = interpolate.interp1d(xp_1, v_1, assume_sorted=False, fill_value="extrapolate") + v1_pt = f(hgt_m) + + fp = [int(hour_index), int(hour_index) + 1] + u = np.interp(hour_index, fp, [u0_pt, u1_pt]) + v = np.interp(hour_index, fp, [v0_pt, v1_pt]) + + return [u, v]
+ + +
+[docs] + def wind_alt_Interpolate2(self, alt_m, diff_time, lat_idx, lon_idx): + """ + Performs two different types of a 2 step linear interpolation to determine horizontal wind velocity. First the altitude is interpolated between the two nearest + .25 degree lat/lon areas. Once altitude is matched, a second linear interpolation is performed with respect to time. + + The old method performs the linear interpolation using u-v wind Components + the new method performs the linear interpolation using wind bearing and speed. + + Both are calculated in this function. The examples use the new method (bearing and wind), which should be slightly more accurate. + + Parameters + ---------- + alt_m : float + Contains current altitude of balloon object. + diff_time: ? + This parameter is calculated in two different places, need to clean up this parameter + lon_idx : integer + Closest index into longitude array + lat_idx : integer + Closest index into latitude array + + .. note:: **TODO**: Make these variable names more descriptive. Maybe make a dictionary return value instead. + + Returns: + u_new : float + u component wind vector (bearing/speed interpolation) + v_new : float + v component wind vector (bearing/speed interpolation) + u_old : float + u component wind vector (u-v component interpolation) + v_old : float + v component wind vector (u-v component interpolation) + + """ + + hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + + # First interpolate wind speeds between 2 closest time steps to match altitude estimates (hgtprs), which can change with time + + #t0 + v_0 = self.vgdrps0[int(hour_index), :, lat_idx, lon_idx] # Round hour index to nearest int + v_0 = self.fill_missing_data(v_0) # Fill the missing wind data if occurs at upper heights + + u_0 = self.ugdrps0[int(hour_index), :, lat_idx, lon_idx] + u_0 = self.fill_missing_data(u_0) + + h0 = self.hgtprs[int(hour_index), :, lat_idx, lon_idx] + h0 = self.fill_missing_data(h0) + + u0_pt = np.interp(alt_m,h0[::-1],u_0[::-1]) #reverse order for ERA5 + v0_pt = np.interp(alt_m,h0[::-1],v_0[::-1]) #reverse order for ERA5 + + bearing_t0, speed_t0 = self.interpolateBearing(h0[::-1], u_0[::-1], v_0[::-1], alt_m) + + #t1 + + v_1 = self.vgdrps0[int(hour_index) + 1, :, lat_idx, lon_idx] + v_1 = self.fill_missing_data(v_1) + + u_1 = self.ugdrps0[int(hour_index) + 1, :, lat_idx, lon_idx] + u_1 = self.fill_missing_data(u_1) + + h1 = self.hgtprs[int(hour_index) +1 , :, lat_idx, lon_idx] + h1 = self.fill_missing_data(h1) + + u1_pt = np.interp(alt_m,h1[::-1],u_1[::-1]) + v1_pt = np.interp(alt_m,h1[::-1],v_1[::-1]) + + bearing_t1, speed_t1 = self.interpolateBearing(h1[::-1], u_1[::-1], v_1[::-1], alt_m) + + #interpolate between 2 timesteps (t0, t1) + #old Method (u-v wind components linear interpolation): + fp = [int(hour_index), int(hour_index) + 1] + u_old = np.interp(hour_index, fp, [u0_pt, u1_pt]) + v_old = np.interp(hour_index, fp, [v0_pt, v1_pt]) + + #New Method (Bearing/speed linear interpolation): + bearing_interpolated, speed_interpolated = self.interpolateBearingTime(bearing_t0, speed_t0, bearing_t1, speed_t1, hour_index ) + + u_new = speed_interpolated * np.cos(np.radians(bearing_interpolated)) + v_new = speed_interpolated * np.sin(np.radians(bearing_interpolated)) + + return [u_new, v_new, u_old, v_old]
+ + +
+[docs] + def fill_missing_data(self, data): + """Helper function to fill in linearly interpolate and fill in missing data + + """ + + data = data.filled(np.nan) + nans, x = np.isnan(data), lambda z: z.nonzero()[0] + data[nans] = np.interp(x(nans), x(~nans), data[~nans]) + return data
+ + +
+[docs] + def windVectorToBearing(self, u, v): + """Helper function to conver u-v wind components to bearing and speed. + + """ + bearing = np.arctan2(v,u) + speed = np.power((np.power(u,2)+np.power(v,2)),.5) + + return [bearing, speed]
+ + +
+[docs] + def interpolateBearing(self, h, u, v, alt_m ): #h, bearing0, speed0, bearing1, speed1): + """Given altitude, u_velocity and v_velocity arrays as well as a desired altitude, perform a linear interpolation + between the 2 altitudes (h0 and h1) while accounting for possible 0/360degree axis crossover. + + """ + + h_idx0, h_idx1 = self.get2NearestAltIdxs(h, alt_m) + + #Check to make sure altitude isn't outside bounds of altitude array for interpolating + if h_idx0 == -1: + h_idx0 = 0 + + if h_idx1 == 0: #this one should most likely never trigger because altitude forecasts go so high. + h_idx1 = -1 + + bearing0, speed0 = self.windVectorToBearing(u[h_idx0], v[h_idx0]) + bearing1, speed1 = self.windVectorToBearing(u[h_idx1], v[h_idx1]) + + interp_dir_deg = 0 + angle1 = np.degrees(bearing0) %360 + angle2 = np.degrees(bearing1) %360 + angular_difference = abs(angle2-angle1) + + if angular_difference > 180: + if (angle2 > angle1): + angle1 += 360 + else: + angle2 += 360 + + interp_speed = np.interp(alt_m, [h[h_idx0], h[h_idx1]], [speed0, speed1]) + interp_dir_deg = np.interp(alt_m, [h[h_idx0], h[h_idx1]], [angle1, angle2]) % 360 #make sure in the range (0, 360) + + return (interp_dir_deg, interp_speed)
+ + +
+[docs] + def interpolateBearingTime(self, bearing0, speed0, bearing1, speed1, hour_index ): #h, bearing0, speed0, bearing1, speed1): + """Similar to `ERA5.interpolateBearing()` however bearings and speeds are already known + and linearly then interpolated with respect to time (t0 and t1) + + """ + + interp_dir_deg = 0 + angle1 = bearing0 %360 + angle2 = bearing1 %360 + angular_difference = abs(angle2-angle1) + + if angular_difference > 180: + if (angle2 > angle1): + angle1 += 360 + else: + angle2 += 360 + + fp = [int(hour_index), int(hour_index) + 1] + interp_speed = np.interp(hour_index, fp, [speed0, speed1]) + interp_dir_deg = np.interp(hour_index, fp, [angle1, angle2]) % 360 #make sure in the range (0, 360) + + return (interp_dir_deg, interp_speed)
+ + +
+[docs] + def getNewCoord(self, coord, dt): + """ + Determines the new coordinates of the balloon based on the effects of U and V wind components. + + Parameters + ---------- + coord : dict + Contains current position, altitude and time of balloon object. + dt : float + Integration time + + Returns: + lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, closest_lat, closest_lon, closest alt + + """ + + diff_time = coord["timestamp"] - self.model_start_datetime + hour_index = (diff_time.days * 24 + diff_time.seconds / 3600.) / self.resolution_hr + int_hr_idx = int(hour_index) + + lat_idx = self.getNearestLatIdx(coord["lat"], self.lat_max_idx, self.lat_min_idx) + lon_idx = self.getNearestLonIdx(coord["lon"], self.lon_min_idx, self.lon_max_idx) + #z = self.getNearestAltbyIndex(lat_idx, lon_idx, coord["alt_m"]) # fix this for lower and Upper + z = self.getNearestAltbyIndex(int_hr_idx, lat_idx, lon_idx, coord["alt"]) # fix this for lower and Upper + + + #for Debugging outside try catch block below. Delete when done. + #x_wind_vel, y_wind_vel, x_wind_vel_old, y_wind_vel_old = self.wind_alt_Interpolate2(coord['alt'], diff_time, lat_idx, lon_idx) + + try: + #x_wind_vel, y_wind_vel = self.wind_alt_Interpolate(coord['alt'], diff_time, lat_idx, lon_idx) # for now hour index is 0 + #x_wind_vel_old, y_wind_vel_old = None, None + x_wind_vel, y_wind_vel, x_wind_vel_old, y_wind_vel_old = self.wind_alt_Interpolate2(coord['alt'], diff_time, lat_idx, lon_idx) + if x_wind_vel == None: + return [None, None, None, None, None, None, None, None] + except: + print(colored( + "Mismatch with simulation and forecast timstamps. Check simulation start time and/or download a new forecast.", + "red")) + sys.exit(1) + + bearing = math.degrees(math.atan2(y_wind_vel, x_wind_vel)) + bearing = 90 - bearing # perform 90 degree rotation for bearing from wind data + d = math.pow((math.pow(y_wind_vel, 2) + math.pow(x_wind_vel, 2)), .5) * dt # dt multiplier + g = self.geod.Direct(coord["lat"], coord["lon"], bearing, d) + + #GFS is %360 here. The files are organized a bit differently + if g['lat2'] < self.LAT_LOW or g['lat2'] > self.LAT_HIGH or (g['lon2']) < self.LON_LOW or (g['lon2']) > self.LON_HIGH: + print(colored("WARNING: Trajectory is out of bounds of downloaded netcdf forecast", "yellow")) + + '''Changed to alt instead of alt_m''' + if coord["alt"] <= self.min_alt_m: + # Balloon should remain stationary if it's reached the minimum altitude + return [coord['lat'], coord['lon'], x_wind_vel, y_wind_vel, x_wind_vel_old, y_wind_vel_old, bearing, self.lat[lat_idx], self.lon[lon_idx], + self.hgtprs[0, z, lat_idx, lon_idx]] # hgtprs doesn't matter here so is set to 0 + else: + return [g['lat2'], g['lon2'], x_wind_vel, y_wind_vel, x_wind_vel_old, y_wind_vel_old, bearing, self.lat[lat_idx], self.lon[lon_idx], + self.hgtprs[0, z, lat_idx, lon_idx]]
+ + + #This function is unused now after code cleanup, but leaving for now because Craig included it with the orginal code + '''CHECK THIS''' + def datetime_epoch(self, timedate_obj): + gmt = timezone('GMT') + try: + dt = timedate_obj.strftime("%Y-%m-%d %H:%M:%S") + naive_ts = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S") + except: + naive_ts = datetime.strptime(timedate_obj, "%Y-%m-%d %H:%M:%S") + + local_ts = gmt.localize(naive_ts) + epoch_ts = local_ts.timestamp() + + return int(epoch_ts)
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_modules/GFS.html b/docs/html/_modules/GFS.html new file mode 100644 index 0000000..f722cc4 --- /dev/null +++ b/docs/html/_modules/GFS.html @@ -0,0 +1,399 @@ + + + + + + GFS — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for GFS

+""" GFS extracts meteorological data from a NOAA netcdf (.nc file) data set.  To speed up predicting trajectories,
+saveNETCDF.py should be run before main.py. This way, the large data set doesn't need to be redownloaded each time the trajectory is run.
+For now, only wind velocity is used for the simulation prediction.  Atmposheric properties such as temperarature and pressure are based off of
+the U.S. Standard Atmosphere tables from 1976, and the fluids library is used for these, which can be seen in radiation3.py
+
+"""
+
+import numpy as np
+import netCDF4
+from termcolor import colored
+import math
+from geographiclib.geodesic import Geodesic
+import datetime
+from datetime import timedelta
+import sys
+from backports.datetime_fromisoformat import MonkeyPatch
+MonkeyPatch.patch_fromisoformat()   #Hacky solution for Python 3.6 to use ISO format Strings
+
+import config_earth
+
+
+[docs] +class GFS: +
+[docs] + def __init__(self, centered_coord): + # import variables from configuration file + self.centered_coord = centered_coord + self.min_alt = config_earth.simulation['min_alt'] + self.start_time = config_earth.simulation['start_time'] + self.sim_time = config_earth.simulation['sim_time'] + #self.hours3 = config_earth.netcdf_gfs['hours3'] + + self.file = netCDF4.Dataset(config_earth.netcdf_gfs["nc_file"]) # Only accepting manual uploads for now + self.gfs_time = config_earth.netcdf_gfs['nc_start'] + self.res = config_earth.netcdf_gfs['res'] + + self.geod = Geodesic.WGS84 + + time_arr = self.file.variables['time'] + + #Manually add time units, not imported with units formatted in saveNETCDF.py + self.time_convert = netCDF4.num2date(time_arr[:], units="days since 0001-01-01", has_year_zero=True) + + + #Determine Index values from netcdf4 subset + netcdf_ranges = self.file.variables['ugrdprs'][:,0,:,:] + self.determineRanges(netcdf_ranges) + + # smaller array of downloaded forecast subset + self.lat = self.file.variables['lat'][self.lat_min_idx:self.lat_max_idx] + self.lon = self.file.variables['lon'][self.lon_min_idx:self.lon_max_idx] + + # min/max lat/lon degree values from netcdf4 subset + self.LAT_LOW = self.file.variables['lat'][self.lat_min_idx] + self.LON_LOW = self.file.variables['lon'][self.lon_min_idx] + self.LAT_HIGH = self.file.variables['lat'][self.lat_max_idx] + self.LON_HIGH = self.file.variables['lon'][self.lon_max_idx] + + print("LAT RANGE: min: " + str(self.LAT_LOW), " (deg) max: " + str(self.LAT_HIGH) + " (deg) array size: " + str(self.lat_max_idx-self.lat_min_idx+1)) + print("LON RANGE: min: " + str(self.LON_LOW), " (deg) max: " + str(self.LON_HIGH) + " (deg) array size: " + str(self.lon_max_idx-self.lon_min_idx+1)) + + # Import the netcdf4 subset to speed up table lookup in this script + self.levels = self.file.variables['lev'][:] + self.ugdrps0 = self.file.variables['ugrdprs'][self.start_time_idx:self.end_time_idx+1,:,self.lat_min_idx:self.lat_max_idx,self.lon_min_idx:self.lon_max_idx] + self.vgdrps0 = self.file.variables['vgrdprs'][self.start_time_idx:self.end_time_idx+1,:,self.lat_min_idx:self.lat_max_idx,self.lon_min_idx:self.lon_max_idx] + self.hgtprs = self.file.variables['hgtprs'][self.start_time_idx:self.end_time_idx+1,:,self.lat_min_idx:self.lat_max_idx,self.lon_min_idx:self.lon_max_idx] + + #print("Data downloaded.\n\n") + print() + + #Check if number of hours will fit in simulation time + desired_simulation_end_time = self.start_time + timedelta(hours=self.sim_time) + diff_time = (self.time_convert[self.end_time_idx] - self.start_time).total_seconds() #total number of seconds between 2 timestamps + + print("Sim start time: ", self.start_time) + print("NetCDF end time:", self.time_convert[self.end_time_idx]) + print("Max sim runtime:", diff_time//3600, "hours") + print("Des sim runtime:", self.sim_time, "hours") + print() + + if not desired_simulation_end_time <= self.time_convert[self.end_time_idx]: + print(colored("Desired simulation run time of " + str(self.sim_time) + + " hours is out of bounds of downloaded forecast. " + + "Check simulation start time and/or download a new forecast.", "red")) + sys.exit()
+ + + +
+[docs] + def determineRanges(self,netcdf_ranges): + """ + Determine the following variable ranges (min/max) within the netcdf file: + + -time + -lat + -lon + + .. note:: the levels variable is uncessary for knowing the ranges for, because they vary from + coordinate to coordinate, and all levels in the array are always be used. + + """ + + + print(colored("Forecast Information (Parsed from netcdf file):", "blue", attrs=['bold'])) + + results = np.all(~netcdf_ranges.mask) + #Results will almost always be false, unless an entire netcdf of the world is downloaded. Or if the netcdf is downloaded via another method with lat/lon bounds + if results == False: + timerange, latrange, lonrange = np.nonzero(~netcdf_ranges.mask) + + self.start_time_idx = timerange.min() + self.end_time_idx = timerange.max() + self.lat_min_idx = latrange.min() #Min/Max are switched compared to with ERA5 + self.lat_max_idx = latrange.max() + self.lon_min_idx = lonrange.min() + self.lon_max_idx = lonrange.max() + else: #This might be broken for time + #Need to double check this for an entire world netcdf download + ''' + self.start_time_idx = 0 + self.end_time_idx = len(self.time_convert)-1 + lati, loni = netcdf_ranges.shape + self.lat_min_idx = lati + self.lat_max_idx = 0 + self.lon_max_idx = loni + self.lon_min_idx = 0 + '''
+ + +
+[docs] + def closest(self, arr, k): + """ Given an ordered array and a value, determines the index of the closest item contained in the array. + + """ + return min(range(len(arr)), key = lambda i: abs(arr[i]-k))
+ + +
+[docs] + def getNearestLat(self,lat,min,max): + """ Determines the nearest lattitude (to .25 degrees) + + """ + arr = np.arange(start=min, stop=max, step=self.res) + i = self.closest(arr, lat) + return i
+ + +
+[docs] + def getNearestLon(self,lon,min,max): + """ Determines the nearest longitude (to .25 degrees) + + """ + + lon = lon % 360 #convert from -180-180 to 0-360 + arr = np.arange(start=min, stop=max, step=self.res) + i = self.closest(arr, lon) + return i
+ + +
+[docs] + def getNearestAlt(self,hour_index,lat,lon,alt): + """ Determines the nearest altitude based off of geo potential height of a .25 degree lat/lon area. + + """ + + lat_i = self.getNearestLat(lat,self.LAT_LOW,self.LAT_HIGH) + lon_i = self.getNearestLon(lon,self.LON_LOW,self.LON_HIGH) + i = self.closest(self.hgtprs[int(hour_index),:,lat_i,lon_i], alt) + return i
+ + +
+[docs] + def wind_alt_Interpolate(self, coord): + """ + This function performs a 2-step linear interpolation to determine horizontal wind velocity at a + 3d desired coordinate and timestamp. + + The figure below shows a visual representation of how wind data is stored in netcdf forecasts based on + lat, lon, and geopotential height. The data forms a non-uniform grid, that also changes in time. Therefore + we performs a 2-step linear interpolation to determine horizontal wind velocity at a desired 3D coordinate + and particular timestamp. + + To start, the two nearest .25 degree lat/lon areas to the desired coordinate are looked up along with the + 2 closest timestamps t0 and t1. This produces 6 arrays: u-wind, v-wind, and geopotential heights at the lower + and upper closest timestamps (t0 and t1). + + Next, the geopotential height is converted to altitude (m) for each timestamp. For the first interpolation, + the u-v wind components at the desired altitude are determined (1a and 1b) using np.interp. + + Then, once the wind speeds at matching altitudes for t0 and t1 are detemined, a second linear interpolation + is performed with respect to time (t0 and t1). + + .. image:: ../../img/netcdf-2step-interpolation.png + + :param coord: Coordinate of balloon + :type coord: dict + :returns: [u_wind_vel, v_wind_vel] + :rtype: array + + """ + + diff = coord["timestamp"] - self.gfs_time + hour_index = (diff.days*24 + diff.seconds / 3600.)/3 + + lat_i = self.getNearestLat(coord["lat"],self.LAT_LOW,self.LAT_HIGH) + lon_i = self.getNearestLon(coord["lon"],self.LON_LOW,self.LON_HIGH) + z_low = self.getNearestAlt(hour_index,coord["lat"],coord["lon"],coord["alt"]) #fix this for lower and Upper + + + # First interpolate wind speeds between 2 closest time steps to match altitude estimates (hgtprs), which can change with time + v_0 = self.vgdrps0[int(hour_index),:,lat_i,lon_i] # Round hour index to nearest int + v_0 = self.fill_missing_data(v_0) # Fill the missing wind data. With netcdf4 there are always 3 missing values at the higher elevations + u_0 = self.ugdrps0[int(hour_index),:,lat_i,lon_i] + u_0 = self.fill_missing_data(u_0) + + u0 = np.interp(coord["alt"],self.hgtprs[int(hour_index),:,lat_i,lon_i],u_0) + v0 = np.interp(coord["alt"],self.hgtprs[int(hour_index),:,lat_i,lon_i],v_0) + + # Next interpolate the wind velocities with respect to time. + v_1 = self.vgdrps0[int(hour_index)+1,:,lat_i,lon_i] + v_1 = self.fill_missing_data(v_1) + + u_1 = self.ugdrps0[int(hour_index)+1,:,lat_i,lon_i] + u_1 = self.fill_missing_data(u_1) + + u1 = np.interp(coord["alt"],self.hgtprs[int(hour_index)+1,:,lat_i,lon_i],u_1) # Round hour index to next timestep + v1 = np.interp(coord["alt"],self.hgtprs[int(hour_index)+1,:,lat_i,lon_i],v_1) + + u = np.interp(hour_index,[int(hour_index),int(hour_index)+1],[u0,u1]) + v = np.interp(hour_index,[int(hour_index),int(hour_index)+1],[v0,v1]) + + return[u,v]
+ + +
+[docs] + def fill_missing_data(self, data): + """Helper function to fill in linearly interpolate and fill in missing data + + """ + + data = data.filled(np.nan) + nans, x = np.isnan(data), lambda z: z.nonzero()[0] + data[nans]= np.interp(x(nans), x(~nans), data[~nans]) + return data
+ + +
+[docs] + def getNewCoord(self, coord, dt): + """ Determines the new coordinates every second due to wind velocity + :param coord: Coordinate of balloon + :type coord: dict + :returns: [lat_new, lon_new, x_wind_vel, y_wind_vel, bearing, closest_lat, closest_lon, closest alt] + :rtype: array + + """ + + diff = coord["timestamp"] - self.gfs_time + hour_index = (diff.days*24 + diff.seconds / 3600.)/3 + + i = self.getNearestLat(coord["lat"],self.LAT_LOW,self.LAT_HIGH) + j = self.getNearestLon(coord["lon"],self.LON_LOW,self.LON_HIGH) + z = self.getNearestAlt(int(hour_index),coord["lat"],coord["lon"],coord["alt"]) + + #Get wind estimate for current coordiante + + #add some error handling here? + x_wind_vel,y_wind_vel = self.wind_alt_Interpolate(coord) + + bearing = math.degrees(math.atan2(y_wind_vel,x_wind_vel)) + bearing = 90 - bearing # perform 90 degree rotation for bearing from wind data + d = math.pow((math.pow(y_wind_vel,2)+math.pow(x_wind_vel,2)),.5) * dt #dt multiplier + g = self.geod.Direct(coord["lat"], coord["lon"], bearing, d) + + if g['lat2'] < self.LAT_LOW or g['lat2'] > self.LAT_HIGH or (g['lon2'] % 360) < self.LON_LOW or (g['lon2'] % 360) > self.LON_HIGH: + print(colored("WARNING: Trajectory is out of bounds of downloaded netcdf forecast", "yellow")) + + if coord["alt"] <= self.min_alt: + # Balloon should remain stationary if it's reached the minimum altitude + return [coord['lat'],coord['lon'],x_wind_vel,y_wind_vel,bearing, self.lat[i], self.lon[j], self.hgtprs[0,z,i,j]] # hgtprs doesn't matter here so is set to 0 + else: + return [g['lat2'],g['lon2'],x_wind_vel,y_wind_vel,bearing, self.lat[i], self.lon[j], self.hgtprs[0,z,i,j]] + + if g['lat2'] < self.LAT_LOW or g['lat2'] > self.LAT_HIGH or g['lon2'] < self.LON_LOW or g['lon2'] > self.LON_HIGH: + print(colored("WARNING: Trajectory is out of bounds of downloaded netcdf forecast", "yellow"))
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_modules/index.html b/docs/html/_modules/index.html new file mode 100644 index 0000000..6db4956 --- /dev/null +++ b/docs/html/_modules/index.html @@ -0,0 +1,109 @@ + + + + + + Overview: module code — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +

All modules for which code is available

+ + +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_modules/radiation.html b/docs/html/_modules/radiation.html new file mode 100644 index 0000000..46ff702 --- /dev/null +++ b/docs/html/_modules/radiation.html @@ -0,0 +1,420 @@ + + + + + + radiation — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for radiation

+"""
+radiation solves for radiation due to the enviorment for a particular datetime and altitude.
+
+"""
+
+import math
+import fluids
+import numpy as np
+
+import config_earth
+
+
+[docs] +class Radiation: + # Constants + I0 = 1358 # Direct Solar Radiation Level + e = 0.016708 # Eccentricity of Earth's Orbit + P0 = 101325 # Standard Atmospheric Pressure at Sea Level + cloudElev = 3000 # (m) + cloudFrac = 0.0 # Percent cloud coverage [0,1] + cloudAlbedo = .65 # [0,1] + albedoGround = .2 # Ground albedo [0,1] + tGround = 293 # (K) Temperature of Ground + emissGround = .95 # [0,1] + SB = 5.670373E-8 # Stefan Boltzman Constant + RE = 6371000 # (m) Radius of Earth + radRef= .1 # [0,1] Balloon Reflectivity + radTrans = .1 # [0,1] Balloon Transmitivity + + start_coord = config_earth.simulation['start_coord'] + t = config_earth.simulation['start_time'] + lat = math.radians(start_coord['lat']) + Ls = t.timetuple().tm_yday + d = config_earth.balloon_properties['d'] + emissEnv = config_earth.balloon_properties['emissEnv'] + absEnv = config_earth.balloon_properties['absEnv'] + + projArea = 0.25*math.pi*d*d + surfArea = math.pi*d*d + + def getTemp(self, el): + atm = fluids.atmosphere.ATMOSPHERE_1976(el) + return atm.T + +
+[docs] + def getTempForecast(self, coord): + r""" Looks up the forecast temperature at the current coordinate and altitude + + .. important:: TODO. This function is not operational yet. + + :param coord: current coordinate + :type coord: dict + :returns: atmospheric temperature (k) + :rtype: float + + """ + return temp
+ + + def getPressure(self, el): + atm = fluids.atmosphere.ATMOSPHERE_1976(el) + return atm.P + + def getDensity(self, el): + atm = fluids.atmosphere.ATMOSPHERE_1976(el) + return atm.rho + + def getGravity(self, el): + atm = fluids.atmosphere.ATMOSPHERE_1976(el) + return atm.g + +
+[docs] + def get_SI0(self): + r""" Incident solar radiation above Earth's atmosphere (W/m^2) + + .. math:: I_{sun,0}= I_0 \cdot [1+0.5(\frac{1+e}{1-e})^2-1) \cdot cos(f)] + + + :returns: The incident solar radiation above Earths atm (W/m^2) + :rtype: float + + """ + + f = 2*math.pi*Radiation.Ls/365 #true anomaly + e2 = pow(((1.+Radiation.e)/(1.-Radiation.e)),2) -1. + return Radiation.I0*(1.+0.5*e2*math.cos(f))
+ + + def get_declination(self): + #This function is unused + + return -.4091*math.cos(2*math.pi*(Radiation.Ls+10)/365) + +
+[docs] + def get_zenith(self, t, coord): + """ Calculates adjusted solar zenith angle at elevation + + :param t: Lattitude (rad) + :type t: Datetime + :param coord: Solar Hour Angle (rad) + :type coord: dict + :returns: The approximate solar zenith angle (rad) + :rtype: float + + """ + + solpos = fluids.solar_position(t, coord["lat"], coord["lon"], Z = coord["alt"]) + zen = math.radians(solpos[0]) #get apparent zenith + + # For determining adjusted zenith at elevation + # https://github.com/KosherJava/zmanim/blob/master/src/main/java/com/kosherjava/zmanim/util/AstronomicalCalculator.java#L176 + refraction = 4.478885263888294 / 60. + solarRadius = 16 / 60. + earthRadius = 6356.9; # in KM + elevationAdjustment = math.acos(earthRadius / (earthRadius + (coord["alt"]/1000.))); + + + adjusted_zen =zen - elevationAdjustment + math.radians(solarRadius + refraction) + return adjusted_zen
+ + +
+[docs] + def get_air_mass(self,zen, el): + r"""Air Mass at elevation + + .. math:: AM = 1229+(614cos(\zeta)^2)^{\frac{1}{2}}-614cos(\zeta) + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: The approximate air mass (unitless) + :rtype: float + + """ + + p = self.getPressure(el) #pressure at current elevation + am = (p/Radiation.P0)*(math.sqrt(1229 + pow((614*math.cos(zen)),2))-614*math.cos(zen)) + return am
+ + +
+[docs] + def get_trans_atm(self,zen,el): + r"""The amount of solar radiation that permeates through the atmosphere at a + certain altitude, I_{sun} is driven by the atmospheric transmittance. + + .. math:: \tau_{atm}= \frac{1}{2}(e^{-0.65AM}+e^{-0.095AM}) + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: The atmospheric trasmittance (unitless) + :rtype: float + + """ + + am = self.get_air_mass(zen, el) + trans = 0.5*(math.exp(-0.65*am) + math.exp(-0.095*am)) + return trans
+ + +
+[docs] + def get_direct_SI(self,zen,el): + """Calculates Direct Solar Radiation + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: Tntensity of the direct solar radiation (W/m^2) + :rtype: float + + """ + + SI0 = self.get_SI0() + trans = self.get_trans_atm(zen, el) + if zen > math.pi/2 : + direct_SI = 0 + else: + direct_SI = trans*SI0 + + return direct_SI
+ + +
+[docs] + def get_diffuse_SI(self,zen,el): + """Calculates Diffuse Solar Radiation from sky + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: The intensity of the diffuse solar radiation from the sky (W/m^2) + :rtype: float + + """ + + if(zen > math.pi/2.): + return 0.0 + SI0 = self.get_SI0() + trans = self.get_trans_atm(zen, el) + if el < Radiation.cloudElev: + return (1-Radiation.cloudFrac)*0.5*SI0*math.sin(math.pi/2.-zen)*(1.-trans)/(1-1.4*math.log(trans)) + else: + return 0.5*SI0*math.sin(math.pi/2.-zen)*(1.-trans)/(1-1.4*math.log(trans))
+ + +
+[docs] + def get_reflected_SI(self,zen,el): + """Calculates Reflected Solar Radiation from from the Earth's Surface + + :param zen: Solar Angle (rad) + :type zen: float + :param el: Elevation (m) + :type el: float + :returns: The intensity solar radiation reflected by the Earth (W/m^2) + :rtype: float + + """ + + incident_SI = self.get_SI0() + tau_atm = self.get_trans_atm(zen,el) + if el < Radiation.cloudElev: + albedo = (1.-Radiation.cloudFrac)*Radiation.albedoGround; + else: + albedo = (1.-Radiation.cloudFrac)*(1-Radiation.cloudFrac)*Radiation.albedoGround + Radiation.cloudAlbedo*Radiation.cloudFrac + + return albedo*tau_atm*incident_SI*math.sin(math.pi/2.-zen)
+ + +
+[docs] + def get_earth_IR(self,el): + """Calculates Infared Radiation emitted from Earth's surface + + :param el: Elevation (m) + :type el: float + :returns: Intensity of IR radiation emitted from earth (W/m^2) + :rtype: float + + """ + p = self.getPressure(el)#pressure at current elevation + IR_trans = 1.716-0.5*(math.exp(-0.65*p/Radiation.P0) + math.exp(-0.095*p/Radiation.P0)) + if el < Radiation.cloudElev: + tEarth = Radiation.tGround + else: + clouds = fluids.atmosphere.ATMOSPHERE_1976(Radiation.cloudElev) + tEarth = Radiation.tGround*(1.-Radiation.cloudFrac) + clouds.T*Radiation.cloudFrac + return IR_trans*Radiation.emissGround*Radiation.SB*pow(tEarth,4)
+ + +
+[docs] + def get_sky_IR(self,el): + """Calculates Infared Radiation emitted the from Sky + + :param el: Elevation (m) + :type el: float + :returns: Intensity of IR radiation emitted from sky (W/m^2) + :rtype: float + + """ + + return np.fmax(-0.03*el+300.,50.0)
+ + +
+[docs] + def get_rad_total(self,datetime,coord): + """Calculates total radiation sources as a function of altitude, time, and balloon surface area. + + The figure below shows how different altitudes effects the radiation sources on + a particular date and coordinate for Tucson Arizona (at sruface level and 25 km altitudes) + + .. image:: ../../img/Tucson_Radiation_Comparison.png + + """ + + zen = self.get_zenith(datetime, coord) + el = coord["alt"] + + #radRef = Radiation.radRef + Radiation.radRef*Radiation.radRef + Radiation.radRef*Radiation.radRef*Radiation.radRef + totAbs = Radiation.absEnv # + Radiation.absEnv*Radiation.radTrans + Radiation.absEnv*Radiation.radTrans*radRef + + hca = math.asin(Radiation.RE/(Radiation.RE+el)) #half cone angle + vf = 0.5*(1. - math.cos(hca)) #viewfactor + + direct_I = self.get_direct_SI(zen, el) + power_direct = direct_I*totAbs*Radiation.projArea + + diffuse_I = self.get_diffuse_SI(zen, el) + power_diffuse = diffuse_I*totAbs*(1.-vf)*Radiation.surfArea + + reflected_I = self.get_reflected_SI(zen, el) + power_reflected = reflected_I*totAbs*vf*Radiation.surfArea + + earth_IR = self.get_earth_IR(el) + power_earth_IR = earth_IR*Radiation.emissEnv*vf*Radiation.surfArea + + sky_IR = self.get_sky_IR(el) + power_sky_IR = sky_IR*Radiation.emissEnv*(1.-vf)*Radiation.surfArea + + rad_tot_bal = power_direct + power_diffuse + power_reflected + power_earth_IR + power_sky_IR + + return rad_tot_bal
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_modules/solve_states.html b/docs/html/_modules/solve_states.html new file mode 100644 index 0000000..58cb61a --- /dev/null +++ b/docs/html/_modules/solve_states.html @@ -0,0 +1,312 @@ + + + + + + solve_states — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for solve_states

+""" solve_states uses numerical integration to solve for the dynamic response of the balloon.
+
+"""
+
+import math
+import radiation
+import sphere_balloon
+import config_earth  #Import parameters from configuration file.
+
+
+
+[docs] +class SolveStates: +
+[docs] + def __init__(self): + """Initializes all of the solar balloon paramaters from the configuration file + + """ + + self.Cp_air0 = config_earth.earth_properties['Cp_air0'] + self.Rsp_air = config_earth.earth_properties['Rsp_air'] + + self.d = config_earth.balloon_properties['d'] + self.vol = math.pi*4/3*pow((self.d/2),3) #volume m^3 + self.surfArea = math.pi*self.d*self.d #m^2 + self.cs_area = math.pi*self.d*self.d/4.0 #m^2 + + #self.emissEnv = config_earth.balloon_properties['emissEnv'] + self.areaDensityEnv = config_earth.balloon_properties['areaDensityEnv'] + self.mp = config_earth.balloon_properties['mp'] + self.mdot = 0 + self.massEnv = config_earth.balloon_properties['mEnv'] + self.Upsilon = config_earth.balloon_properties['Upsilon'] + + self.vent = config_earth.simulation['vent'] + self.coord = config_earth.simulation['start_coord'] + self.t = config_earth.simulation['start_time'] + self.lat = math.radians(self.coord['lat']) + self.Ls = self.t.timetuple().tm_yday + self.min_alt = config_earth.simulation['min_alt'] + + self.vm_coeff = .1 #virtual mass coefficient + self.k = self.massEnv*config_earth.balloon_properties['cp'] #thermal mass coefficient + + self.dt = config_earth.simulation['dt']
+ + +
+[docs] + def get_acceleration(self,v,el,T_s,T_i): + r"""Solves for the acceleration of the solar balloon after one timestep (dt). + + .. math:: \frac{d^2z}{dt^2} = \frac{dU}{dt} = \frac{F_b-F_g-F_d}{m_{virtual}} + + The Buyoancy Force, F_{b}: + + .. math:: F_b = (\rho_{atm}-\rho_{int}) \cdot V_{bal} \cdot g + + The drag force, F_{d}: + + .. math:: F_d = \frac{1}{2} \cdot C_d \cdot rho_{atm} \cdot U^2 \cdot A_{proj} \cdot \beta + + and where the virtual mass is the total mass of the balloon system: + + .. math:: m_{virt} = m_{payload}+m_{envelope}+C_{virt} \cdot \rho_{atm} \cdot V_{bal} + + + :param T_s: Surface Temperature (K) + :type T_s: float + :param T_i: Internal Temperature (K) + :type T_i: float + :param el: Elevation (m) + :type el: float + :param v: Velocity (m) + :type v: float + + :returns: acceleration of balloon (m/s^2) + :rtype: float + + """ + + rad = radiation.Radiation() + T_atm = rad.getTemp(el) + p_atm = rad.getPressure(el) + rho_atm = rad.getDensity(el) + g = rad.getGravity(el) + + + rho_int = p_atm/(self.Rsp_air*T_i) # Internal air density + + Cd = .5 # Drag Coefficient + F_b = (rho_atm - rho_int)*self.vol*g # Force due to buyoancy + F_d = Cd*(0.5*rho_atm*math.fabs(v)*v)*self.cs_area# Force due to Drag + + if F_d > 0: + F_d = F_d * self.Upsilon + vm = (self.massEnv + self.mp) + rho_atm*self.vol + self.vm_coeff*rho_atm*self.vol #Virtual Mass + accel = ((F_b - F_d - (self.massEnv + self.mp)*g)/vm) + + return accel
+ + +
+[docs] + def get_convection_vent(self,T_i,el): + r"""Calculates the heat lost to the atmosphere due to venting + + .. math:: Q_{vent} = \dot{m} \cdot c_v \cdot (T_i-T_{atm}) + + :param T_i: Internal Temperature (K) + :type T_i: float + :param el: Elevation (m) + :type el: float + + :returns: Convection due to Venting (unit?) + :rtype: float + + """ + + rad = radiation.Radiation() + T_atm = rad.getTemp(el) + + Q_vent = self.mdot*self.Cp_air0*(T_i-T_atm) # Convection due to released air + return Q_vent
+ + + +
+[docs] + def solveVerticalTrajectory(self,t,T_s,T_i,el,v,coord,alt_sp,v_sp): + r"""This function numerically integrates and solves for the change in Surface Temperature, Internal Temperature, and accelleration + after a timestep, dt. + + .. math:: \frac{dT_s}{dt} = \frac{\dot{Q}_{rad}+\dot{Q}_{conv,ext}-\dot{Q}_{conv,int}}{c_{v,env} \cdot m_{envelope}} + + .. math:: \frac{dT_i}{dt} = \frac{\dot{Q}_{conv,int}-\dot{Q}_{vent}}{c_{v,CO_2} \cdot m_{CO_2}} + + + :param t: Datetime + :type t: datetime + :param T_s: Surface Temperature (K) + :type T_s: float + :param T_i: Internal Temperature (K) + :type T_i: float + :param el: Elevation (m) + :type el: float + :param v: Velocity (m) + :type v: float + :param alt_sp: Altitude Setpoint (m) + :type alt_sp: float + :param v_sp: Velocity Setpoint (m/s) + :type v_sp: float + + :returns: Updated parameters after dt (seconds) + :rtype: float [T_s,T_i,el,v] + + """ + + bal = sphere_balloon.Sphere_Balloon() + rad = radiation.Radiation() + + T_atm = rad.getTemp(el) + p_atm = rad.getPressure(el) + rho_atm = rad.getDensity(el) + + rho_int = p_atm/(self.Rsp_air*T_i) + tm_air = rho_int*self.vol*self.Cp_air0 + + #Numerically integrate change in Surface Temperature + coord["alt"] = el #Change this when using GFS + #print(el, coord["alt"]) + q_rad = rad.get_rad_total(t,coord) + q_surf = bal.get_sum_q_surf(q_rad, T_s, el, v) + q_int = bal.get_sum_q_int(T_s, T_i, el) + dT_sdt = (q_surf-q_int)/self.k + + #Numerically integrate change in Surface Temperature + tm_air = rho_atm*self.vol*self.Cp_air0 + dT_idt = (q_int-self.get_convection_vent(T_i,el))/tm_air + + #Add the new surface and internal Temperatures + T_s_new = T_s+dT_sdt*self.dt + T_i_new = T_i+dT_idt*self.dt + + #solve for accellration, position, and velocity + dzdotdt = self.get_acceleration(v,el,T_s,T_i) + zdot = v + dzdotdt*self.dt + z = el+zdot*self.dt + + #Add the new velocity and position + if z < self.min_alt: + v_new = 0 + el_new = self.min_alt + else: + v_new = zdot + el_new = z + + # Venting commands for an altitude setpoint. Vent is either on or off. + if el_new > alt_sp: + self.mdot = self.vent + + if el_new < alt_sp: + self.mdot = 0 + + return [T_s_new,T_i_new,T_atm,el_new,v_new, q_rad, q_surf, q_int]
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_modules/sphere_balloon.html b/docs/html/_modules/sphere_balloon.html new file mode 100644 index 0000000..4d8686e --- /dev/null +++ b/docs/html/_modules/sphere_balloon.html @@ -0,0 +1,414 @@ + + + + + + sphere_balloon — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for sphere_balloon

+"""
+sphere_balloon solves for the total heat transfer on the solar balloon.
+
+"""
+
+import math
+import numpy as np
+import radiation
+
+import config_earth
+
+
+
+[docs] +class Sphere_Balloon: + """Initializes atmospheric properties from the earth configuration file + + """ + Cp_air0 = config_earth.earth_properties['Cp_air0'] + Rsp_air = config_earth.earth_properties['Rsp_air'] + cv_air0 = config_earth.earth_properties['Cv_air0'] + cf = config_earth.balloon_properties['cp'] + + RE = 6371000.0 # (m) Radius of Earth + SB = 5.670373E-8 # Stefan Boltzman Constant + +
+[docs] + def __init__(self): + """Initializes all of the solar balloon paramaters from the configuration file + + """ + self.d = config_earth.balloon_properties['d'] + self.emissEnv = config_earth.balloon_properties['emissEnv'] + + self.surfArea = math.pi*self.d*self.d + self.vol = math.pi*4/3*pow((self.d/2),3)
+ + + + def setEmiss(self,e): + self.emissEnv = e + +
+[docs] + def get_viscocity(self,T): + r"""Calculates Kinematic Viscocity of Air at Temperature, T + + .. math:: \mu_{air} = 1.458\cdot10^{-6}\frac{T_{atm}^{1.5}}{T_{atm}+110.4} + + + :param T: Temperature (K) + :type Ra: float + :returns: mu, Kinematic Viscocity of Air + :rtype: float + + """ + #print("viscocity",T) + return 1.458E-6*(np.sign(T) * (np.abs(T)) ** (1.5))/(T+110.4) #numpy power does not allow fractional powers of negative numbers. This is the workaround
+ + +
+[docs] + def get_conduction(self,T): + r"""Calculates Thermal Diffusivity of Air at Temperature, T using Sutherland's Law of Thermal Diffusivity + + + .. math:: k_{air} = 0.0241(\frac{T_{atm}}{271.15})^{0.9} + + :param T: Temperature (K) + :type Ra: float + :returns: Thermal Diffusivity of Air (W/(m*K) + :rtype: float + + """ + + return 0.0241*(np.sign(T) * (np.abs(T/273.15)) ** (0.9))
+ + +
+[docs] + def get_Pr(self,T): + r"""Calculates Prantl Number + + .. math:: Pr = \mu_{air} \frac{C_{p,air}}{k} + + :param T: Temperature (K) + :type Ra: float + :returns: Prantl Number + :rtype: float + + """ + k = self.get_conduction(T) #Thermal diffusivity + Pr = self.get_viscocity(T)*Sphere_Balloon.Cp_air0/k + return Pr
+ + + #-------------------------------------------SOLVE FOR T_S------------------------------------------------------------------''' + +
+[docs] + def get_Nu_ext(self,Ra, Re, Pr): + r"""Calculates External Nusselt Number. + + Determine the external convection due to natural buoyancy + + .. math:: Nu_{ext,n}=\begin{cases} + 2+0.6Ra^{0.25}, & \text{$Ra<1.5\cdot10^8$}\\ + 0.1Ra^{0.34}, & \text{$Ra\geq1.5\cdot10^8$} + \end{cases} + + Determine the external forced convection due to the balloon ascending + + .. math:: Nu_{ext,f}=\begin{cases} + 2+0.47Re^{\frac{1}{2}}Pr^{\frac{1}{3}}, & \text{$Re<5\cdot10^4$}\\ + (0.0262Re^{0.34}-615)Pr^{\frac{1}{3}}, & \text{$Re\geq1.5\cdot10^8$} + \end{cases} + + To transition between the two correlations: + + .. math:: Nu_{ext} = max(Nu_{ext,n},Nu_{ext,f}) + + + :param Ra: Raleigh's number + :type Ra: float + :param Re: Reynold's number + :type Re: float + :param Pr: Prandtl Number + :type Pr: float + :returns: External Nusselt Number + :rtype: float + + """ + + Nu_n = 0.0 + if Ra < 1.5E8: + Nu_n = 2.0 + 0.6*pow(Ra,0.25) + else: + Nu_n = 0.1*pow(Ra, 0.34) + Nu_f = 0.0 + if Re < 5E4: + try: + Nu_f = 2 + 0.47*math.sqrt(Re)*pow(Pr, (1./3.)) + except: + Nu_f = 2 + else: + Nu_f = (0.0262*pow(Re, 0.8) - 615.)*pow(Pr, (1./3.)); + return np.fmax(Nu_f, Nu_n);
+ + +
+[docs] + def get_q_ext(self, T_s, el, v): + """Calculate External Heat Transfer to balloon envelope + + :param zen: Surface Temperature of Envelope (K) + :type zen: float + :param el: Elevation (m)print fluids.atmosphere.solar_position(datetime.datetime(2018, 4, 15, 6, 43, 5), 51.0486, -114.07)[0] + :type el: float + :param el: velocity (m/s) + :type el: float + :returns: Power transferred from sphere to surrounding atmosphere due to convection(W) + :rtype: float + + """ + + rad = radiation.Radiation() + T_atm = rad.getTemp(el) + p_atm = rad.getPressure(el) + rho_atm = rad.getDensity(el) + g = rad.getGravity(el) + + Pr_atm = self.get_Pr(T_atm) + + T_avg = 0.5*(T_atm + T_s) + rho_avg = p_atm/(Sphere_Balloon.Rsp_air*T_avg) + Pr_avg = self.get_Pr(T_avg) + + exp_coeff = 1./T_avg; + kin_visc = self.get_viscocity(T_avg)/rho_avg + + #Not sure if Raleighs number is the right equation here: + Ra = Pr_avg*g*math.fabs(T_s-T_atm)*np.power(self.d,3)*exp_coeff/(kin_visc*kin_visc) + Re = rho_atm*v*self.d/self.get_viscocity(T_atm) + Nu = self.get_Nu_ext(Ra, Re, Pr_atm) + k = self.get_conduction(T_avg) + h = Nu*k/self.d + return h*self.surfArea*(T_s-T_atm)
+ + +
+[docs] + def get_sum_q_surf(self,q_rad, T_s, el, v): + """External Heat Transfer + + :param q_rad: Power input from external radiation (W) + :type q_rad: float + :param T_s: Surface Temperature of Envelope (K) + :type T_s: float + :param el: Elevation (m) + :type el: float + :param v: velocity (m/s) + :type v: float + :returns: The sum of power input to the balloon surface (W) + :rtype: float + + """ + + q_conv_loss = -self.get_q_ext(T_s, el, v) + q_rad_lost = -self.emissEnv*Sphere_Balloon.SB*np.power(T_s,4)*self.surfArea + return q_rad + q_conv_loss + q_rad_lost
+ + + #--------------------------------------------SOLVE FOR T INT------------------------------------------------------------- + +
+[docs] + def get_Nu_int(sef,Ra): + r"""Calculates Internal Nusselt Number for internal convection between the balloon + envelope and internal gas + + .. math:: Nu_{int}=\begin{cases} + 2.5(2+0.6Ra^{\frac{1}{4}}), & \text{$Ra<1.35\cdot10^8$}\\ + 0.325Ra^{\frac{1}{3}}, & \text{$Ra\geq1.35\cdot10^8$} + \end{cases} + + :param Ra: Raleigh's number + :type Ra: float + :returns: Internal Nusselt Number + :rtype: float + + """ + + if Ra < 1.35E8: + return 2.5*(2+0.6*pow(Ra,0.25)) + else: + return 0.325*pow(Ra, 0.333)
+ + +
+[docs] + def get_q_int(self,T_s, T_i, el): + """Calculates Internal Heat Transfer + + :param T_s: Surface Temperature of Envelope (K) + :type T_s: float + :param el: Elevation (m) + :type el: float + :param v: velocity (m/s) + :type v: float + :returns: Internal Heat Transfer (W) + :rtype: float + + """ + + rad = radiation.Radiation() + T_atm = rad.getTemp(el) + p_atm = rad.getPressure(el) + rho_atm = rad.getDensity(el) + g = rad.getGravity(el) + + ''' + T_avg = 0.5*(T_s+T_i) + rho_avg = p_atm/(Sphere_Balloon.Rsp_air*T_avg) + Pr = self.get_Pr(T_avg) + exp_coeff = 1./T_avg + kin_visc = self.get_viscocity(T_avg)/rho_avg + Ra = self.get_Pr(T_atm)*g*math.fabs(T_i-T_s)*pow(self.d,3)*exp_coeff/(kin_visc*kin_visc) + Nu = self.get_Nu_int(Ra) + k = self.get_conduction(T_avg) + h = (Nu*k)/self.d + q_int = h*self.surfArea*(T_s-T_i) + ''' + + T_avg = 0.5*(T_s+T_i) + Pr = self.get_Pr(T_avg) + rho_avg = p_atm/(Sphere_Balloon.Rsp_air*T_avg) + mu = self.get_viscocity(T_avg)/rho_avg + k = self.get_conduction(T_avg) + + inside = (np.power(rho_atm,2)*g*math.fabs(T_s-T_i)*Pr)/(T_i*np.power(mu,2)) + h = 0.13*k * np.sign(inside) * np.abs(inside) ** (1/3.) + q_int = h*self.surfArea*(T_s-T_i) + + return q_int
+ + +
+[docs] + def get_sum_q_int(self, T_s, T_i, el): + """Calculates sum of Internal Heat Transfer. + + .. note:: + + Currently there are no initial heat sources. So this function returns the negative of *get_q_int()* + + :param T_s: Surface Temperature of Envelope (K) + :type T_s: float + :param el: Elevation (m) + :type el: float + :param v: velocity (m/s) + :type v: float + :returns: SUm of Internal Heat Transfer (W) + :rtype: float + + """ + q_conv_int = self.get_q_int(T_s, T_i, el) + return q_conv_int
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_modules/windmap.html b/docs/html/_modules/windmap.html new file mode 100644 index 0000000..2ced153 --- /dev/null +++ b/docs/html/_modules/windmap.html @@ -0,0 +1,597 @@ + + + + + + windmap — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for windmap

+"""
+This is file generates a 3d windrose plot for a particular coordinate and timestamp.
+The polar plot displays information on wind speed and direction  at
+various altitudes in a visual format
+
+"""
+
+
+import numpy as np
+import matplotlib.pyplot as plt
+import matplotlib as mpl
+from matplotlib import ticker
+#import netCDF4
+from termcolor import colored
+from scipy.interpolate import CubicSpline
+import fluids
+import config_earth
+from datetime import datetime, timedelta
+import sys
+
+import GFS
+import ERA5
+
+
+[docs] +class Windmap: +
+[docs] + def __init__(self): + + if config_earth.forecast['forecast_type'] == "GFS": + self.gfs = GFS.GFS(config_earth.simulation['start_coord']) + self.file = self.gfs.file + else: + self.era5 = ERA5.ERA5(config_earth.simulation['start_coord']) + self.file = self.era5.file + + + #FIX THE DEFINING OF THESE Variables + #******************* + #self.res = config_earth.netcdf_gfs['res'] #fix this + self.nc_start = config_earth.netcdf_gfs["nc_start"] #fix this + + self.start_time = config_earth.simulation["start_time"] + self.coord = config_earth.simulation['start_coord'] + self.LAT = self.coord["lat"] + self.LON = self.coord["lon"] + + # VERIFY TIMESTAMP INFO MAKES SENSE + hours = None + self.new_timestamp = None + + #EDIT TO REMOVE THESE + #Should I move these to ERA5 and GFS for organization? + if config_earth.forecast['forecast_type'] == "GFS": + self.lat = self.file.variables['lat'][:] + self.lon = self.file.variables['lon'][:] + self.levels = self.file.variables['lev'][:] + + self.vgrdprs = self.file.variables['vgrdprs'] + self.ugrdprs = self.file.variables['ugrdprs'] + self.hgtprs = self.file.variables['hgtprs'] + try: + self.tmpprs = self.file.variables['tmpprs'] + except: + print(colored("Temperature not downloaded in this GFS forecast", "yellow")) + self.tmpprs = None + self.hour_index, self.new_timestamp = self.getHourIndex(self.start_time) + + if config_earth.forecast['forecast_type'] == "ERA5": + + self.lat = self.file.variables['latitude'][:] + self.lon = self.file.variables['longitude'][:] + self.levels = self.file.variables['level'][:] + + self.vgrdprs = self.file.variables['v'] + self.ugrdprs = self.file.variables['u'] + self.hgtprs = self.file.variables['z'] + self.tmpprs = self.file.variables['time'] #are t and time the same? #THIS IS WRONG SHOULD BE TEMPERATURE + + self.hour_index, self.new_timestamp = self.getHourIndex(self.start_time)
+ + + def closest(self,arr, k): + return min(range(len(arr)), key = lambda i: abs(arr[i]-k)) + +
+[docs] + def time_in_range(self,start, end, x): + """Return true if x is in the range [start, end]""" + if start <= end: + return start <= x <= end + else: + return start <= x or x <= end
+ + + #THIS IS ASSUMING THE CORRECT ERA5 TIME PERIOD HAS BEEN DOWNLOADED + def getHourIndex(self,start_time): + if config_earth.forecast['forecast_type'] == "GFS": + times = self.gfs.time_convert + else: + times = self.era5.time_convert + #Check is simulation start time is within netcdf file + if not self.time_in_range(times[0], times[-1], self.start_time): + print(colored("Simulation start time " + str(self.start_time) + " is not within netcdf timerange of " + str(times[0]) + " - " + str(times[-1]) , "red")) + sys.exit() + else: + print(colored("Simulation start time " + str(self.start_time) + " is within netcdf timerange of " + str(times[0]) + " - " + str(times[-1]) , "green")) + + #Find closest time using lambda function: + closest_time = min(times, key=lambda sub: abs(sub - start_time)) + + #Need to write some exception handling code + #Find the corresponding index to a matching key (closest time) in the array (full list of timestamps in netcdf) + hour_index = [i for i ,e in enumerate(times) if e == closest_time][0] + + return hour_index, closest_time + + +
+[docs] + def windVectorToBearing(self, u, v, h): + """ Converts U-V wind data at specific heights to angular and radial + components for polar plotting. + + :param u: U-Vector Wind Component from Forecast + :type u: float64 array + :param v: V-Vector Wind Component from Forecast + :type v: float64 array + :param h: Corresponding Converted Altitudes (m) from Forecast + :type h: float64 array + :returns: Array of bearings, radius, colors, and color map for plotting + :rtype: array + + """ + + # Calculate altitude + bearing = np.arctan2(v,u) + bearing = np.unwrap(bearing) + r = np.power((np.power(u,2)+np.power(v,2)),.5) + + # Set up Color Bar + colors = h + cmap=mpl.colors.ListedColormap(colors) + + return [bearing, r , colors, cmap]
+ + + +
+[docs] + def getWind(self,hour_index,lat_i,lon_i, interpolation_frequency = 1): + """ Calculates a wind vector estimate at a particular 3D coordinate and timestamp + using a 2-step linear interpolation approach. + + Currently using scipy.interpolat.CubicSpline instead of np.interp like in GFS and ERA5. + + See also :meth:`GFS.GFS.wind_alt_Interpolate` + + :param hour_index: Time index from forecast file + :type hour_index: int + :param lat_i: Array index for corresponding netcdf lattitude array + :type lat_i: int + :param lon_i: Array index for corresponding netcdf laongitude array + :type lon_i: int + :returns: [U, V] + :rtype: float64 2d array + + """ + + g = 9.80665 # gravitation constant used to convert geopotential height to height + + u = self.ugrdprs[hour_index,:,lat_i,lon_i] + v = self.vgrdprs[hour_index,:,lat_i,lon_i] + h = self.hgtprs[hour_index,:,lat_i,lon_i] + + # Remove missing data + u = u.filled(np.nan) + v = v.filled(np.nan) + nans = ~np.isnan(u) + u= u[nans] + v= v[nans] + h = h[nans] + + #for ERA5, need to reverse all array so h is increasing. + if config_earth.forecast['forecast_type'] == "ERA5": + u = np.flip(u) + v = np.flip(v) + h = np.flip(h) + h = h / g #have to do this for ERA5 + + #Fix this interpolation method later, espcially for ERA5 + cs_u = CubicSpline(h, u) + cs_v = CubicSpline(h, v) + if config_earth.forecast['forecast_type'] == "GFS": + h_new = np.arange(0, h[-1], interpolation_frequency) # New altitude range + elif config_earth.forecast['forecast_type'] == "ERA5": + h_new = np.arange(0, h[-1], interpolation_frequency) # New altitude range + u = cs_u(h_new) + v = cs_v(h_new) + + return self.windVectorToBearing(u, v, h_new)
+ + + +
+[docs] + def plotWind2(self,hour_index,lat,lon, num_interpolations = 100): + """ Calculates a wind vector estimate at a particular 3D coordinate and timestamp + using a 2-step linear interpolation approach. + + I believe this is more accurate than linear interpolating the U-V wind components. Using arctan2 + creates a non-linear distribution of points, however they should still be accurate. arctan2 causes issues + when there are 180 degree opposing winds because it is undefined, and the speed goes to 0 and back up to the new speed. + + Therefore instead we interpolate the wind speed and direction, and use an angle wrapping check to see if the shortest + distance around the circle crosses the 0/360 degree axis. This prevents speed down to 0, as well as undefined regions. + + 1. Get closest timesteps (t0 and t1) and lat/lon indexes for desired time + 2. Convert the entire altitude range at t0 and t1 U-V wind vector components to wind speed and direction (rad and m/s) + 3. Perform a linear interpolation of wind speed and direction. Fill in num_iterations + + :param hour_index: Time index from forecast file + :type hour_index: int + :param lat: Latitude coordinate [deg] + :type lat_i: float + :param lon_i: Longitude coordinate [deg] + :type lon_i: cloast + :returns: 3D windrose plot + :rtype: matplotlib.plot + + """ + + if config_earth.forecast['forecast_type'] == "GFS": + lat_i = self.gfs.getNearestLat(lat, -90, 90.01 ) #I think instead of min max this is because download netcdf downloads the whole world, but many of the spots are empty. + lon_i = self.gfs.getNearestLon(lon, 0, 360 ) + + elif config_earth.forecast['forecast_type'] == "ERA5": + lat_i = self.era5.getNearestLatIdx(lat, self.era5.lat_min_idx, self.era5.lat_max_idx) + lon_i = self.era5.getNearestLonIdx(lon, self.era5.lon_min_idx, self.era5.lon_max_idx) + + + g = 9.80665 # gravitation constant used to convert geopotential height to height + + u = self.ugrdprs[hour_index,:,lat_i,lon_i] + v = self.vgrdprs[hour_index,:,lat_i,lon_i] + h = self.hgtprs[hour_index,:,lat_i,lon_i] + + # Remove missing data + u = u.filled(np.nan) + v = v.filled(np.nan) + nans = ~np.isnan(u) + u= u[nans] + v= v[nans] + h = h[nans] + + #for ERA5, need to reverse all array so h is increasing. + if config_earth.forecast['forecast_type'] == "ERA5": + u = np.flip(u) + v = np.flip(v) + h = np.flip(h) + h = h / g #have to do this for ERA5 + + bearing, r , colors, cmap = self.windVectorToBearing(u, v, h) + + # Create interpolated altitudes and corresponding wind data + interpolated_altitudes = [] + interpolated_speeds = [] + interpolated_directions_deg = [] + + + for i in range(len(h) - 1): + + #Do some angle wrapping checks + interp_dir_deg = 0 + angle1 = np.degrees(bearing[i]) %360 + angle2 = np.degrees(bearing[i + 1]) %360 + angular_difference = abs(angle2-angle1) + + if angular_difference > 180: + if (angle2 > angle1): + angle1 += 360 + else: + angle2 += 360 + + + for j in range(num_interpolations + 1): + alpha = j / num_interpolations + interp_alt = h[i] + alpha * (h[i + 1] - h[i]) + interp_speed = np.interp(interp_alt, [h[i], h[i + 1]], [r[i], r[i + 1]]) + + interp_dir_deg = np.interp(interp_alt, [h[i], h[i + 1]], [angle1, angle2]) % 360 #make sure in the range (0, 360) + + interpolated_altitudes.append(interp_alt) + interpolated_speeds.append(interp_speed) + interpolated_directions_deg.append(interp_dir_deg) + + fig = plt.figure(figsize=(10, 8)) + ax1 = fig.add_subplot(111, projection='polar') + + if config_earth.forecast['forecast_type'] == "GFS": + sc = ax1.scatter(np.radians(interpolated_directions_deg), interpolated_altitudes, c=interpolated_speeds, cmap='winter', s=2) + ax1.title.set_text("GFS 3D Windrose for (" + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + elif config_earth.forecast['forecast_type'] == "ERA5": + sc = ax1.scatter(np.radians(interpolated_directions_deg), interpolated_altitudes, c=interpolated_speeds, cmap='winter', s=2) + ax1.title.set_text("ERA5 3D Windrose for (" + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + cbar = plt.colorbar(sc, label='Wind Speed (m/s)') + #plt.scatter(np.radians(interpolated_directions_deg), interpolated_altitudes) + + # Set title + fig.suptitle("Wind Interpolation using Wind Speed and Directio Linear Interpolation")
+ + #plt.title('Windmap with Wind Angles Interpolated') + + ''' + def plotWindOLD(self,hour_index,lat,lon, num_interpolations = 100): + + if config_earth.forecast['forecast_type'] == "GFS": + lat_i = self.gfs.getNearestLat(lat, -90, 90.01 ) #I think instead of min max this is because download netcdf downloads the whole world, but many of the spots are empty. + lon_i = self.gfs.getNearestLon(lon, 0, 360 ) + + elif config_earth.forecast['forecast_type'] == "ERA5": + lat_i = self.era5.getNearestLatIdx(lat, self.era5.lat_min_idx, self.era5.lat_max_idx) + lon_i = self.era5.getNearestLonIdx(lon, self.era5.lon_min_idx, self.era5.lon_max_idx) + + + g = 9.80665 # gravitation constant used to convert geopotential height to height + + u = self.ugrdprs[hour_index,:,lat_i,lon_i] + v = self.vgrdprs[hour_index,:,lat_i,lon_i] + h = self.hgtprs[hour_index,:,lat_i,lon_i] + + # Remove missing data + u = u.filled(np.nan) + v = v.filled(np.nan) + nans = ~np.isnan(u) + u= u[nans] + v= v[nans] + h = h[nans] + + #for ERA5, need to reverse all array so h is increasing. + if config_earth.forecast['forecast_type'] == "ERA5": + u = np.flip(u) + v = np.flip(v) + h = np.flip(h) + h = h / g #have to do this for ERA5 + + + # Create interpolated altitudes and corresponding wind data + interpolated_altitudes = [] + interpolated_u = [] + interpolated_v = [] + + for i in range(len(h) - 1): + for j in range(num_interpolations + 1): + alpha = j / num_interpolations + interp_alt = h[i] + alpha * (h[i + 1] - h[i]) + interp_u = np.interp(interp_alt, [h[i], h[i + 1]], [u[i], u[i + 1]]) + interp_v = np.interp(interp_alt, [h[i], h[i + 1]], [v[i], v[i + 1]]) + + interpolated_altitudes.append(interp_alt) + interpolated_u.append(interp_u) + interpolated_v.append(interp_v) + + bearing, r , colors, cmap = self.windVectorToBearing(interpolated_u, interpolated_v, interpolated_altitudes) + #bearing, r , colors, cmap = self.windVectorToBearing(np.full(len(interpolated_altitudes), 3), np.full(len(interpolated_altitudes), 2), interpolated_altitudes) + + + fig = plt.figure(figsize=(8, 8)) + ax = fig.add_subplot(111, projection='polar') + + # Create a scatter plot where radius is altitude, angle is wind direction (in radians), and color represents wind speed + sc = ax.scatter(bearing, colors, c=r, cmap='winter', s=2) + cbar = plt.colorbar(sc, label='Wind Speed (m/s)') + + #plt.scatter(np.radians(interpolated_directions_deg), interpolated_altitudes) + + # Set title + fig.suptitle("Wind Interpolation using OLDDDDDDDD") + #plt.title('Windmap with Wind Angles Interpolated') + ''' + +
+[docs] + def plotWindVelocity(self,hour_index,lat,lon, interpolation_frequency = 1): + """ Plots a 3D Windrose for a particular coordinate and timestamp from a downloaded forecast. + + :param hour_index: Time index from forecast file + :type hour_index: int + :param lat: Latitude + :type lat: float + :param lon: Longitude + :type lon: float + :returns: + + """ + + #Should I remove arguments for the function and just use the initialized functions from config? + + + # Find location in data + if config_earth.forecast['forecast_type'] == "GFS": + lat_i = self.gfs.getNearestLat(lat, -90, 90.01 ) #I think instead of min max this is because download netcdf downloads the whole world, but many of the spots are empty. + lon_i = self.gfs.getNearestLon(lon, 0, 360 ) + bearing1, r1 , colors1, cmap1 = self.getWind(hour_index,lat_i,lon_i, interpolation_frequency) + + elif config_earth.forecast['forecast_type'] == "ERA5": + lat_i = self.era5.getNearestLatIdx(lat, self.era5.lat_min_idx, self.era5.lat_max_idx) + lon_i = self.era5.getNearestLonIdx(lon, self.era5.lon_min_idx, self.era5.lon_max_idx) + bearing1, r1 , colors1, cmap1 = self.getWind(hour_index,lat_i,lon_i, interpolation_frequency) + + # Plot figure and legend + fig = plt.figure(figsize=(10, 8)) + fig.suptitle("Wind Interpolation using Spline and U-V wind components") + ax1 = fig.add_subplot(111, projection='polar') + if config_earth.forecast['forecast_type'] == "GFS": + sc2 = ax1.scatter(bearing1, colors1, c=r1, cmap='winter', alpha=0.75, s = 2) + ax1.title.set_text("GFS 3D Windrose for (" + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + elif config_earth.forecast['forecast_type'] == "ERA5": + sc2 = ax1.scatter(bearing1, colors1, c=r1, cmap='winter', alpha=0.75, s = 2) + ax1.title.set_text("ERA5 3D Windrose for (" + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + #ax1.set_xticks([0,9,90,180, 180,270,270,360]) #Fixes the FixedLocator Warning for the line below + ax1.set_xticks(ax1.get_xticks()) + ax1.set_xticklabels(['E', '', 'N', '', 'W', '', 'S', '']) + + plt.colorbar(sc2, ax=ax1, label=" Wind Velocity (m/s)") + + + plt.figure() + plt.plot(self.ugrdprs[hour_index,:,lat_i,lon_i], self.hgtprs[hour_index,:,lat_i,lon_i]) + plt.plot(self.vgrdprs[hour_index,:,lat_i,lon_i], self.hgtprs[hour_index,:,lat_i,lon_i]) + plt.title("U V Wind Plot")
+ + + """ + #Update this + def plotTempAlt(self,hour_index,lat,lon): + if config_earth.forecast['forecast_type'] == "ERA5": + hour_index = 0 #not right, hard_coded for now + + # Find nearest lat/lon in ncdf4 resolution + plt.figure(figsize=(10, 8)) + lat_i = self.getNearestLat(lat) + lon_i = self.getNearestLon(lon) + + # Extract relevant u/v wind velocity, and altitude + T = self.tmpprs[hour_index,:,lat_i,lon_i] + h = self.hgtprs[hour_index,:,lat_i,lon_i] + + ''' + # Forecast data is sparse, so use a cubic spline to add more points + cs_T = CubicSpline(h, T) + h_new = np.arange(0, 50000, 10) # New altitude range + T = cs_T(h_new) + ''' + + # ISA Temperature Model + el = np.arange(0, 50000, 10) + T_atm = [] + + for e in el: + atm = fluids.atmosphere.ATMOSPHERE_1976(e) + T_atm.append(atm.T) + + + # Formatting + plt.xlabel("Temperature (K)") + plt.ylabel("Altitude (m)") + plt.title('Atmospheric Temperature Profile for (' + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + + + plt.plot(T,h, label = "GFS Forecast") + plt.plot(T_atm,el, label = "ISA Model") + plt.legend(loc='upper right') + """ + + def makePlots(self): + print(self.hour_index) + self.plotWindVelocity(self.hour_index,self.LAT,self.LON, interpolation_frequency = 100) + self.plotWind2(self.hour_index,self.LAT,self.LON, num_interpolations = 10) + #self.plotWindOLD(self.hour_index,self.LAT,self.LON, num_interpolations = 100) + wind.file.close() + plt.show()
+ + + +#wind = Windmap() +#wind.makePlots() +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_sources/API/GFS.rst.txt b/docs/html/_sources/API/GFS.rst.txt new file mode 100644 index 0000000..ca40661 --- /dev/null +++ b/docs/html/_sources/API/GFS.rst.txt @@ -0,0 +1,10 @@ +===================== +:mod:`GFS` +===================== + +.. automodule:: GFS +.. autoclass:: GFS + :members: + :special-members: __init__ + + diff --git a/docs/html/_sources/API/era5.rst.txt b/docs/html/_sources/API/era5.rst.txt new file mode 100644 index 0000000..9e80a7c --- /dev/null +++ b/docs/html/_sources/API/era5.rst.txt @@ -0,0 +1,10 @@ +===================== +:mod:`ERA5` +===================== + +.. automodule:: ERA5 +.. autoclass:: ERA5 + :members: + :special-members: __init__ + + diff --git a/docs/html/_sources/API/index.rst.txt b/docs/html/_sources/API/index.rst.txt new file mode 100644 index 0000000..5c70478 --- /dev/null +++ b/docs/html/_sources/API/index.rst.txt @@ -0,0 +1,20 @@ +.. _api-index: + +############## +EarthSHAB API +############## + +.. toctree:: + :maxdepth: 1 + + GFS + era5 + radiation + solve_states + sphere_balloon + windmap + +* :ref:`genindex` +* :ref:`modindex` + + diff --git a/docs/html/_sources/API/radiation.rst.txt b/docs/html/_sources/API/radiation.rst.txt new file mode 100644 index 0000000..91b7761 --- /dev/null +++ b/docs/html/_sources/API/radiation.rst.txt @@ -0,0 +1,10 @@ +===================== +:mod:`radiation` +===================== + +.. automodule:: radiation +.. autoclass:: Radiation + :members: + :special-members: __init__ + + diff --git a/docs/html/_sources/API/solve_states.rst.txt b/docs/html/_sources/API/solve_states.rst.txt new file mode 100644 index 0000000..60d789d --- /dev/null +++ b/docs/html/_sources/API/solve_states.rst.txt @@ -0,0 +1,10 @@ +===================== +:mod:`solve_states` +===================== + +.. automodule:: solve_states +.. autoclass:: SolveStates + :members: + :special-members: __init__ + + diff --git a/docs/html/_sources/API/sphere_balloon.rst.txt b/docs/html/_sources/API/sphere_balloon.rst.txt new file mode 100644 index 0000000..e23989c --- /dev/null +++ b/docs/html/_sources/API/sphere_balloon.rst.txt @@ -0,0 +1,10 @@ +===================== +:mod:`sphere_balloon` +===================== + +.. automodule:: sphere_balloon +.. autoclass:: Sphere_Balloon + :members: + :special-members: __init__ + + diff --git a/docs/html/_sources/API/windmap.rst.txt b/docs/html/_sources/API/windmap.rst.txt new file mode 100644 index 0000000..1e344df --- /dev/null +++ b/docs/html/_sources/API/windmap.rst.txt @@ -0,0 +1,10 @@ +===================== +:mod:`windmap` +===================== + +.. automodule:: windmap +.. autoclass:: Windmap + :members: + :special-members: __init__ + + diff --git a/docs/html/_sources/citing.rst.txt b/docs/html/_sources/citing.rst.txt new file mode 100644 index 0000000..516b737 --- /dev/null +++ b/docs/html/_sources/citing.rst.txt @@ -0,0 +1,11 @@ +.. _Citing_EarthSHAB: + +Citing EarthSHAB +================ + +If EarthSHAB played an important role in your research, then please cite the following publication +where EarthSHAB was first introduced: + +`Solar Balloons - An Aerial Platform for Planetary Exploration `_ + + diff --git a/docs/html/_sources/examples/downloadERA5.rst.txt b/docs/html/_sources/examples/downloadERA5.rst.txt new file mode 100644 index 0000000..0fd7cee --- /dev/null +++ b/docs/html/_sources/examples/downloadERA5.rst.txt @@ -0,0 +1,42 @@ +========================== +Downloading ERA5 Forecasts +========================== + +ECMWF weather forecasts reanalysis data are downloaded from the `Copernicus Climate Data Server `_. This website requires signing up for an account before being able to download data. + +.. seealso:: + + "**ERA5** is the fifth generation ECMWF reanalysis for the global climate and weather for the past 8 decades. + + Reanalysis combines model data with observations from across the world into a globally complete and consistent dataset using the laws of physics. This principle, called data assimilation, is based on the method used by numerical weather prediction centres, where every so many hours (12 hours at ECMWF) a previous forecast is combined with newly available observations in an optimal way to produce a new best estimate of the state of the atmosphere, called analysis, from which an updated, improved forecast is issued. Reanalysis works in the same way, but at reduced resolution to allow for the provision of a dataset spanning back several decades. Reanalysis does not have the constraint of issuing timely forecasts, so there is more time to collect observations, and when going further back in time, to allow for the ingestion of improved versions of the original observations, which all benefit the quality of the reanalysis product. + " + +Download the reanalysis data from `ERA5 hourly data on pressure levels from 1979 to present `_ and navigating to the **Download data** tab. + +The variables (**requires all pressure levels**) needed to forecast the balloon trajectories include: + +- Geopotential +- U-component of wind +- V-component of wind +- Temperature + + +Let say you want data over the Hawaiian Islands for January 1-2, 2021, then a typical selection would look like: + +.. image:: ../../img/era5_data_selection.png + +.. image:: ../../img/era5_data_selection2.png + +Be sure to select **NetCDF (experimental)** for the download format to use with EarthSHAB. + +The data download request is then added to a queue and can be downloaded a later time (typically only takes a few minutes). Save the netcdf reanalysis file to the *forecast directory* and feel free to rename the file to something more useful. + +.. note:: ECMWF reanalysis data is available every hour unlike GFS which is avilable in 3 hour increments. + +The download option will look like the following: + +.. image:: ../../img/era5_download.png + + +.. important:: Thank you to Craig Motell and Michael Rodriquez from NIWC Pacific for contributing to the ERA5 feature. + diff --git a/docs/html/_sources/examples/downloadGFS.rst.txt b/docs/html/_sources/examples/downloadGFS.rst.txt new file mode 100644 index 0000000..9f1b4e6 --- /dev/null +++ b/docs/html/_sources/examples/downloadGFS.rst.txt @@ -0,0 +1,37 @@ +========================== +Downloading GFS Forecasts +========================== + +NOAA weather forecasts are downloaded from the `NOMADS dataserver `_ at a 0.25 degree resolution and saved locally in a netcdf file format (see `Unidata netcdf API `_ for netcdf file format information) +to save computation time and have the ability to run trajectories offline. + +Forecasts are available in 6 hour increments (starting with 00 UTC) and typically have a 4 hour upload delay. From the current date, forecasts can be downloaded up to 10 days in the past, and each forecast predicts up to 384 hours (16 days) in the future. + +As an example, when visiting the server on February 17, 2022, the following options were available: + +.. image:: ../../img/nomad_server.png + +The after selecting option 10, *gfs20220217*, which is the most recent forecast the following options were avilable: + +.. image:: ../../img/gfs_2022-02-17.png + +Clicking on *info* for a particular forecast (ex. *gfs_0p25_00z*) will show the available variables for download + +.. note:: Besides forecasts, analysis model runs are also available (files ending in "_anl"), although it is recommended to use forecasts for EarthSHAB. To learn more about the differences between forecast and analysis runs see https://rda.ucar.edu/datasets/ds083.2/docs/Analysis.pdf. + +Saving GFS Forecasts +========================== + +``saveNETCDF.py`` downloads the data from the server and saves them to a *.nc* file to use in EarthSHAB. By saving the file for offline use, running batch simulations is exponentially faster than having to re-download the same forecast from the server for every simulation run. + +The following parameters need to be adjusted in the configuration file before saving a netcdf forecast. + +- ``gfs``: the start time of the gfs forecast downloaded from the server (These are in the form of *gfs20231008/gfs_0p25_00z*). Start times ares in 6 hour intervals and typically are tpically delayed about 8-12 hours before being uploaded to the server. The server only stores the past 10 days of forecasts. +- ``start_time``: the start time of the simulation +- ``lat_range``: How many 0.25 degree indicies to download cenetered aroudn the ``start_coord`` +- ``lon_range``: How many 0.25 degree indicies to download cenetered aroudn the ``start_coord`` +- ``download_days``: How many days of data to download from the server, can be a maximum of 10 (limited by the server). Data from GFS is downloaded in 3 hour increments unlike ERA5 reanlayis forecasts which are in hourly increments. +- ``start_coord`` + + + diff --git a/docs/html/_sources/examples/index.rst.txt b/docs/html/_sources/examples/index.rst.txt new file mode 100644 index 0000000..e953470 --- /dev/null +++ b/docs/html/_sources/examples/index.rst.txt @@ -0,0 +1,61 @@ +.. _examples-index: + +################### +EarthSHAB Usage +################### + +.. toctree:: + :maxdepth: 1 + :caption: Downloading and Saving Forecasts: + + downloadGFS + downloadERA5 + +These files give examples on how to use EarthSHAB. + +Configuration File +=================== + + +``config.py`` is the heart of any EarthSHAB simulation and the only file that needs to be updated to use EarthSHAB at the current release. Many parameters can be adjusted for running EarthSHAB simulations and the parameters are grouped together into convienent categories: + +- **balloon_properties:** includes parameters for adjusting the balloon size and material propeties. Currently only the 'sphere' shape is supported. If using a standard 6m charcoal-coated SHAB balloon, the payload and envelope masses are the only parameters that need to be updated. +- **netcdf_gfs:** includes parameters for reading and saving GFS netcdf forecasts from `NOAA's NOMADS server `_. Currently only supporting forecasts with a resolution of 0.25 degrees for better trajectroy prediction accuracy. +- **netcdf_era5:** +- **simulation:** +- **forecast_type:** Either GFS or ERA5. For either to work, a corresponding netcdf file must be download and in the forecasts directory. +- **GFS.GFSRate:** adjusts how often wind speeds are looked up (default is once per 60 seconds). The fastest look up rate is up to 1.0 s, which provides the highest fidelity predictions, but also takes significantly longer to run a simulation. +- **dt:** is default to 1.0s integrating intervals. +- **earth_properties:** include mostly constant proeprties for earth. These values typically don't need to be changed, however the ground emissivity and albedo might be changed if predicting balloon launches over oceans or snow covered locations. + + +.. tip:: If when increasing ``dt``, nans are introduced, this is a numerical integration issue that can be solved by decreasing dt. Most values over 2.5s cause this issue when running a simulation. + + + +Examples +=================== + +``main.py`` performs a full-physics based simulation taking into account: balloon geometry and properties, radiation sources for the coordinate and altitude, dynamic force analysis, and weather forecasts. The simulation outputs an altitude plot, balloon temperature, a 3d wind rose and atmospheric temperature profile for the starting location, and an interactive google maps trajectory. + +**New** in v1.1, ``main.py`` supports comparing simulations (using either a GFS forecast or ERA5 renalysis) to a historical balloon flight. At this time, only balloon trajectories in the *aprs.fi* format are supported. Flights using APRS devices for real time tracking can be downloaded after landing from `APRS.fi `_. To use this functionality, change ``balloon_trajectory`` in the configuration file from None to a filename. + +|pic0| + +.. |pic0| image:: ../../../img/SHAB12-V.png + :width: 100% + + +``predict.py`` uses EarthSHAB to generate a family of altitude and trajectory predictions at different float altitudes. Estimating float altitudes for a standard charcoal SHAB balloon are challenging and can range from SHAB to SHAB even if all the **balloon_properties** are the same and the balloons are launches on the same day. This example produces a rainbow altitude plot and interactive google maps trajectory prediction. The float altitudes are adjusted by changing the payload mass in .25 increments to simulate varrying float altitudes. + +|pic1| |pic2| + +.. |pic1| image:: ../../../img/rainbow_trajectories_altitude.png + :width: 48% + +.. |pic2| image:: ../../../img/rainbow_trajectories_map.PNG + :width: 48% + +``trajectory.py`` provides a rough example of how to use EarthSHAB with a manual altitude profile to estimate wind-based trajectory predictions. Alternatively, you can generate a csv file in the *aprs.fi* format and inclue it in ``config.py``. + + diff --git a/docs/html/_sources/index.rst.txt b/docs/html/_sources/index.rst.txt new file mode 100644 index 0000000..c06308f --- /dev/null +++ b/docs/html/_sources/index.rst.txt @@ -0,0 +1,29 @@ +.. EarthSHAB documentation master file, created by + sphinx-quickstart on Thu Oct 12 10:15:53 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + :hidden: + + installation + examples/index + API/index + citing + + +EarthSHAB +========= + +EarthSHAB is an open source software platform for predicting the flight paths of solar balloon on Earth, adapted from `MarsSHAB `_, developed at the University of Arizona. Altitude profiles for a SHAB flight are generated using heat transfer modeling and dynamic analysis. By incorporating weather forecasts from NOAA, complete 3D SHAB trajectories can also be predicted. + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/html/_sources/installation.rst.txt b/docs/html/_sources/installation.rst.txt new file mode 100644 index 0000000..68b2858 --- /dev/null +++ b/docs/html/_sources/installation.rst.txt @@ -0,0 +1,22 @@ +========================== +Installation Requirements +========================== + +EarthSHAB relies on the following libraries: + - fluids + - geographiclib + - gmplot + - netCDF4 + - numpy + - pandas + - termcolor + - backports.datetime_fromisoformat + - seaborn + - scipy + - pytz + - xarray + + + + + diff --git a/docs/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/html/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000..8141580 --- /dev/null +++ b/docs/html/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/html/_static/basic.css b/docs/html/_static/basic.css new file mode 100644 index 0000000..30fee9d --- /dev/null +++ b/docs/html/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/html/_static/css/badge_only.css b/docs/html/_static/css/badge_only.css new file mode 100644 index 0000000..c718cee --- /dev/null +++ b/docs/html/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000..6cb6000 Binary files /dev/null and b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000..7059e23 Binary files /dev/null and b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000..f815f63 Binary files /dev/null and b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000..f2c76e5 Binary files /dev/null and b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.eot b/docs/html/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/docs/html/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.svg b/docs/html/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/docs/html/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.ttf b/docs/html/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/docs/html/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.woff b/docs/html/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/docs/html/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.woff2 b/docs/html/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/docs/html/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/html/_static/css/fonts/lato-bold-italic.woff b/docs/html/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000..88ad05b Binary files /dev/null and b/docs/html/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/html/_static/css/fonts/lato-bold-italic.woff2 b/docs/html/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000..c4e3d80 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/html/_static/css/fonts/lato-bold.woff b/docs/html/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000..c6dff51 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-bold.woff differ diff --git a/docs/html/_static/css/fonts/lato-bold.woff2 b/docs/html/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000..bb19504 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/html/_static/css/fonts/lato-normal-italic.woff b/docs/html/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000..76114bc Binary files /dev/null and b/docs/html/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/html/_static/css/fonts/lato-normal-italic.woff2 b/docs/html/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000..3404f37 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/html/_static/css/fonts/lato-normal.woff b/docs/html/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000..ae1307f Binary files /dev/null and b/docs/html/_static/css/fonts/lato-normal.woff differ diff --git a/docs/html/_static/css/fonts/lato-normal.woff2 b/docs/html/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000..3bf9843 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/html/_static/css/theme.css b/docs/html/_static/css/theme.css new file mode 100644 index 0000000..19a446a --- /dev/null +++ b/docs/html/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/html/_static/doctools.js b/docs/html/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/docs/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/html/_static/documentation_options.js b/docs/html/_static/documentation_options.js new file mode 100644 index 0000000..c891ba6 --- /dev/null +++ b/docs/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.1.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/html/_static/file.png b/docs/html/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/docs/html/_static/file.png differ diff --git a/docs/html/_static/jquery.js b/docs/html/_static/jquery.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/docs/html/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/html/_static/js/html5shiv.min.js b/docs/html/_static/js/html5shiv.min.js new file mode 100644 index 0000000..cd1c674 --- /dev/null +++ b/docs/html/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/html/_static/js/theme.js b/docs/html/_static/js/theme.js new file mode 100644 index 0000000..1fddb6e --- /dev/null +++ b/docs/html/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/html/_static/minus.png b/docs/html/_static/minus.png new file mode 100644 index 0000000..d96755f Binary files /dev/null and b/docs/html/_static/minus.png differ diff --git a/docs/html/_static/plus.png b/docs/html/_static/plus.png new file mode 100644 index 0000000..7107cec Binary files /dev/null and b/docs/html/_static/plus.png differ diff --git a/docs/html/_static/pygments.css b/docs/html/_static/pygments.css new file mode 100644 index 0000000..84ab303 --- /dev/null +++ b/docs/html/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/html/_static/searchtools.js b/docs/html/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/docs/html/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/html/_static/sphinx_highlight.js b/docs/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/docs/html/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/html/citing.html b/docs/html/citing.html new file mode 100644 index 0000000..3b512d6 --- /dev/null +++ b/docs/html/citing.html @@ -0,0 +1,113 @@ + + + + + + + Citing EarthSHAB — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Citing EarthSHAB

+

If EarthSHAB played an important role in your research, then please cite the following publication +where EarthSHAB was first introduced:

+

Solar Balloons - An Aerial Platform for Planetary Exploration

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/examples/downloadERA5.html b/docs/html/examples/downloadERA5.html new file mode 100644 index 0000000..5dd3e03 --- /dev/null +++ b/docs/html/examples/downloadERA5.html @@ -0,0 +1,149 @@ + + + + + + + Downloading ERA5 Forecasts — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Downloading ERA5 Forecasts

+

ECMWF weather forecasts reanalysis data are downloaded from the Copernicus Climate Data Server. This website requires signing up for an account before being able to download data.

+
+

See also

+

ERA5 is the fifth generation ECMWF reanalysis for the global climate and weather for the past 8 decades.

+

Reanalysis combines model data with observations from across the world into a globally complete and consistent dataset using the laws of physics. This principle, called data assimilation, is based on the method used by numerical weather prediction centres, where every so many hours (12 hours at ECMWF) a previous forecast is combined with newly available observations in an optimal way to produce a new best estimate of the state of the atmosphere, called analysis, from which an updated, improved forecast is issued. Reanalysis works in the same way, but at reduced resolution to allow for the provision of a dataset spanning back several decades. Reanalysis does not have the constraint of issuing timely forecasts, so there is more time to collect observations, and when going further back in time, to allow for the ingestion of improved versions of the original observations, which all benefit the quality of the reanalysis product. +“

+
+

Download the reanalysis data from ERA5 hourly data on pressure levels from 1979 to present and navigating to the Download data tab.

+

The variables (requires all pressure levels) needed to forecast the balloon trajectories include:

+
    +
  • Geopotential

  • +
  • U-component of wind

  • +
  • V-component of wind

  • +
  • Temperature

  • +
+

Let say you want data over the Hawaiian Islands for January 1-2, 2021, then a typical selection would look like:

+../_images/era5_data_selection.png +../_images/era5_data_selection2.png +

Be sure to select NetCDF (experimental) for the download format to use with EarthSHAB.

+

The data download request is then added to a queue and can be downloaded a later time (typically only takes a few minutes). Save the netcdf reanalysis file to the forecast directory and feel free to rename the file to something more useful.

+
+

Note

+

ECMWF reanalysis data is available every hour unlike GFS which is avilable in 3 hour increments.

+
+

The download option will look like the following:

+../_images/era5_download.png +
+

Important

+

Thank you to Craig Motell and Michael Rodriquez from NIWC Pacific for contributing to the ERA5 feature.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/examples/downloadGFS.html b/docs/html/examples/downloadGFS.html new file mode 100644 index 0000000..919d613 --- /dev/null +++ b/docs/html/examples/downloadGFS.html @@ -0,0 +1,147 @@ + + + + + + + Downloading GFS Forecasts — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Downloading GFS Forecasts

+

NOAA weather forecasts are downloaded from the NOMADS dataserver at a 0.25 degree resolution and saved locally in a netcdf file format (see Unidata netcdf API for netcdf file format information) +to save computation time and have the ability to run trajectories offline.

+

Forecasts are available in 6 hour increments (starting with 00 UTC) and typically have a 4 hour upload delay. From the current date, forecasts can be downloaded up to 10 days in the past, and each forecast predicts up to 384 hours (16 days) in the future.

+

As an example, when visiting the server on February 17, 2022, the following options were available:

+../_images/nomad_server.png +

The after selecting option 10, gfs20220217, which is the most recent forecast the following options were avilable:

+../_images/gfs_2022-02-17.png +

Clicking on info for a particular forecast (ex. gfs_0p25_00z) will show the available variables for download

+
+

Note

+

Besides forecasts, analysis model runs are also available (files ending in “_anl”), although it is recommended to use forecasts for EarthSHAB. To learn more about the differences between forecast and analysis runs see https://rda.ucar.edu/datasets/ds083.2/docs/Analysis.pdf.

+
+
+

Saving GFS Forecasts

+

saveNETCDF.py downloads the data from the server and saves them to a .nc file to use in EarthSHAB. By saving the file for offline use, running batch simulations is exponentially faster than having to re-download the same forecast from the server for every simulation run.

+

The following parameters need to be adjusted in the configuration file before saving a netcdf forecast.

+
    +
  • gfs: the start time of the gfs forecast downloaded from the server (These are in the form of gfs20231008/gfs_0p25_00z). Start times ares in 6 hour intervals and typically are tpically delayed about 8-12 hours before being uploaded to the server. The server only stores the past 10 days of forecasts.

  • +
  • start_time: the start time of the simulation

  • +
  • lat_range: How many 0.25 degree indicies to download cenetered aroudn the start_coord

  • +
  • lon_range: How many 0.25 degree indicies to download cenetered aroudn the start_coord

  • +
  • download_days: How many days of data to download from the server, can be a maximum of 10 (limited by the server). Data from GFS is downloaded in 3 hour increments unlike ERA5 reanlayis forecasts which are in hourly increments.

  • +
  • start_coord

  • +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/examples/index.html b/docs/html/examples/index.html new file mode 100644 index 0000000..4d4d8e9 --- /dev/null +++ b/docs/html/examples/index.html @@ -0,0 +1,153 @@ + + + + + + + EarthSHAB Usage — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

EarthSHAB Usage

+
+

Downloading and Saving Forecasts:

+ +
+

These files give examples on how to use EarthSHAB.

+
+

Configuration File

+

config.py is the heart of any EarthSHAB simulation and the only file that needs to be updated to use EarthSHAB at the current release. Many parameters can be adjusted for running EarthSHAB simulations and the parameters are grouped together into convienent categories:

+
    +
  • balloon_properties: includes parameters for adjusting the balloon size and material propeties. Currently only the ‘sphere’ shape is supported. If using a standard 6m charcoal-coated SHAB balloon, the payload and envelope masses are the only parameters that need to be updated.

  • +
  • netcdf_gfs: includes parameters for reading and saving GFS netcdf forecasts from NOAA’s NOMADS server. Currently only supporting forecasts with a resolution of 0.25 degrees for better trajectroy prediction accuracy.

  • +
  • netcdf_era5:

  • +
  • simulation:

  • +
  • forecast_type: Either GFS or ERA5. For either to work, a corresponding netcdf file must be download and in the forecasts directory.

  • +
  • GFS.GFSRate: adjusts how often wind speeds are looked up (default is once per 60 seconds). The fastest look up rate is up to 1.0 s, which provides the highest fidelity predictions, but also takes significantly longer to run a simulation.

  • +
  • dt: is default to 1.0s integrating intervals.

  • +
  • earth_properties: include mostly constant proeprties for earth. These values typically don’t need to be changed, however the ground emissivity and albedo might be changed if predicting balloon launches over oceans or snow covered locations.

  • +
+
+

Tip

+

If when increasing dt, nans are introduced, this is a numerical integration issue that can be solved by decreasing dt. Most values over 2.5s cause this issue when running a simulation.

+
+
+
+

Examples

+

main.py performs a full-physics based simulation taking into account: balloon geometry and properties, radiation sources for the coordinate and altitude, dynamic force analysis, and weather forecasts. The simulation outputs an altitude plot, balloon temperature, a 3d wind rose and atmospheric temperature profile for the starting location, and an interactive google maps trajectory.

+

New in v1.1, main.py supports comparing simulations (using either a GFS forecast or ERA5 renalysis) to a historical balloon flight. At this time, only balloon trajectories in the aprs.fi format are supported. Flights using APRS devices for real time tracking can be downloaded after landing from APRS.fi. To use this functionality, change balloon_trajectory in the configuration file from None to a filename.

+

pic0

+

predict.py uses EarthSHAB to generate a family of altitude and trajectory predictions at different float altitudes. Estimating float altitudes for a standard charcoal SHAB balloon are challenging and can range from SHAB to SHAB even if all the balloon_properties are the same and the balloons are launches on the same day. This example produces a rainbow altitude plot and interactive google maps trajectory prediction. The float altitudes are adjusted by changing the payload mass in .25 increments to simulate varrying float altitudes.

+

pic1 pic2

+

trajectory.py provides a rough example of how to use EarthSHAB with a manual altitude profile to estimate wind-based trajectory predictions. Alternatively, you can generate a csv file in the aprs.fi format and inclue it in config.py.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/genindex.html b/docs/html/genindex.html new file mode 100644 index 0000000..22bab9b --- /dev/null +++ b/docs/html/genindex.html @@ -0,0 +1,408 @@ + + + + + + Index — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ _ + | C + | D + | E + | F + | G + | I + | M + | P + | R + | S + | T + | W + +
+

_

+ + +
+ +

C

+ + + +
+ +

D

+ + +
+ +

E

+ + + +
+ +

F

+ + +
+ +

G

+ + + +
+ +

I

+ + + +
+ +

M

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
    +
  • + radiation + +
  • +
+ +

S

+ + + +
+ +

T

+ + +
+ +

W

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 0000000..fc9bb21 --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,121 @@ + + + + + + + EarthSHAB — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+
+
+

EarthSHAB

+

EarthSHAB is an open source software platform for predicting the flight paths of solar balloon on Earth, adapted from MarsSHAB, developed at the University of Arizona. Altitude profiles for a SHAB flight are generated using heat transfer modeling and dynamic analysis. By incorporating weather forecasts from NOAA, complete 3D SHAB trajectories can also be predicted.

+
+
+

Indices and tables

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/installation.html b/docs/html/installation.html new file mode 100644 index 0000000..bd8cfb2 --- /dev/null +++ b/docs/html/installation.html @@ -0,0 +1,129 @@ + + + + + + + Installation Requirements — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation Requirements

+
+
EarthSHAB relies on the following libraries:
    +
  • fluids

  • +
  • geographiclib

  • +
  • gmplot

  • +
  • netCDF4

  • +
  • numpy

  • +
  • pandas

  • +
  • termcolor

  • +
  • backports.datetime_fromisoformat

  • +
  • seaborn

  • +
  • scipy

  • +
  • pytz

  • +
  • xarray

  • +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/objects.inv b/docs/html/objects.inv new file mode 100644 index 0000000..3cf613c Binary files /dev/null and b/docs/html/objects.inv differ diff --git a/docs/html/py-modindex.html b/docs/html/py-modindex.html new file mode 100644 index 0000000..cd52935 --- /dev/null +++ b/docs/html/py-modindex.html @@ -0,0 +1,167 @@ + + + + + + Python Module Index — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ e | + g | + r | + s | + w +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ e
+ ERA5 +
 
+ g
+ GFS +
 
+ r
+ radiation +
 
+ s
+ solve_states +
+ sphere_balloon +
 
+ w
+ windmap +
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/search.html b/docs/html/search.html new file mode 100644 index 0000000..7eef9d0 --- /dev/null +++ b/docs/html/search.html @@ -0,0 +1,123 @@ + + + + + + Search — EarthSHAB 1.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Tristan Schuler.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js new file mode 100644 index 0000000..bacfc44 --- /dev/null +++ b/docs/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["API/GFS", "API/era5", "API/index", "API/radiation", "API/solve_states", "API/sphere_balloon", "API/windmap", "citing", "examples/downloadERA5", "examples/downloadGFS", "examples/index", "index", "installation"], "filenames": ["API/GFS.rst", "API/era5.rst", "API/index.rst", "API/radiation.rst", "API/solve_states.rst", "API/sphere_balloon.rst", "API/windmap.rst", "citing.rst", "examples/downloadERA5.rst", "examples/downloadGFS.rst", "examples/index.rst", "index.rst", "installation.rst"], "titles": ["GFS", "ERA5", "EarthSHAB API", "radiation", "solve_states", "sphere_balloon", "windmap", "Citing EarthSHAB", "Downloading ERA5 Forecasts", "Downloading GFS Forecasts", "EarthSHAB Usage", "EarthSHAB", "Installation Requirements"], "terms": {"extract": 0, "meteorolog": 0, "data": [0, 1, 6, 8, 9], "from": [0, 1, 3, 4, 5, 6, 8, 9, 10, 11], "noaa": [0, 1, 9, 10, 11], "netcdf": [0, 1, 6, 8, 9, 10], "nc": [0, 9], "file": [0, 4, 5, 6, 8, 9], "set": 0, "To": [0, 5, 9, 10], "speed": [0, 1, 6, 10], "up": [0, 1, 3, 6, 8, 9, 10], "predict": [0, 8, 9, 10, 11], "trajectori": [0, 8, 9, 10, 11], "savenetcdf": [0, 9], "py": [0, 9, 10], "should": [0, 1, 6], "run": [0, 9, 10], "befor": [0, 1, 8, 9], "main": [0, 10], "thi": [0, 1, 3, 4, 5, 6, 8, 10], "wai": [0, 1, 8], "larg": 0, "doesn": 0, "t": [0, 3, 4, 5, 10], "need": [0, 1, 8, 9, 10], "redownload": 0, "each": [0, 9], "time": [0, 1, 3, 6, 8, 9, 10], "i": [0, 1, 3, 4, 6, 8, 9, 10, 11], "For": [0, 1, 10], "now": [0, 1], "onli": [0, 8, 9, 10], "wind": [0, 1, 6, 8, 10], "veloc": [0, 1, 4, 5], "us": [0, 1, 4, 5, 6, 8, 9, 10, 11], "simul": [0, 1, 9, 10], "atmposher": 0, "properti": [0, 5, 10], "temperaratur": 0, "pressur": [0, 8], "ar": [0, 1, 5, 6, 8, 9, 10, 11], "base": [0, 1, 8, 10], "off": [0, 1], "u": [0, 1, 4, 6, 8], "": [0, 3, 4, 5, 6, 10], "standard": [0, 10], "atmospher": [0, 3, 4, 5, 8, 10], "tabl": 0, "1976": 0, "fluid": [0, 5, 12], "librari": [0, 12], "which": [0, 1, 8, 9, 10], "can": [0, 1, 8, 9, 10, 11], "seen": 0, "radiation3": 0, "class": [0, 1, 3, 4, 5, 6], "centered_coord": 0, "sourc": [0, 1, 3, 4, 5, 6, 10, 11], "__init__": [0, 1, 4, 5, 6], "closest": [0, 1, 6], "arr": [0, 1], "k": [0, 1, 3, 4, 5], "given": [0, 1], "an": [0, 1, 6, 7, 8, 9, 10, 11], "order": [0, 1], "arrai": [0, 1, 6], "valu": [0, 1, 10], "determin": [0, 1, 5], "index": [0, 1, 2, 6, 11], "item": [0, 1], "contain": [0, 1], "determinerang": [0, 1], "netcdf_rang": [0, 1], "follow": [0, 7, 8, 9, 12], "variabl": [0, 1, 8, 9], "rang": [0, 6, 10], "min": [0, 1], "max": [0, 1, 5], "within": 0, "lat": [0, 1, 6], "lon": [0, 1, 6], "note": 1, "level": [0, 3, 8], "uncessari": 0, "know": 0, "becaus": [0, 6], "thei": [0, 6], "vari": 0, "coordin": [0, 1, 3, 6, 10], "all": [0, 1, 4, 5, 8, 10], "alwai": 0, "fill_missing_data": [0, 1], "helper": [0, 1], "function": [0, 1, 3, 4, 5, 10], "fill": [0, 1, 6], "linearli": [0, 1], "interpol": [0, 1, 6], "miss": [0, 1], "getnearestalt": 0, "hour_index": [0, 1, 6], "alt": [0, 1], "nearest": [0, 1], "altitud": [0, 1, 3, 4, 6, 10, 11], "geo": [0, 1], "potenti": [0, 1], "height": [0, 1, 6], "25": [0, 1, 3, 5, 9, 10], "degre": [0, 1, 6, 9, 10], "area": [0, 1, 3], "getnearestlat": 0, "lattitud": [0, 3, 6], "getnearestlon": 0, "longitud": [0, 1, 6], "getnewcoord": [0, 1], "coord": [0, 1, 3, 4], "dt": [0, 1, 4, 10], "new": [0, 1, 6, 8, 10], "everi": [0, 8, 9], "second": [0, 1, 4, 10], "due": [0, 3, 4, 5], "param": 0, "balloon": [0, 1, 3, 4, 5, 7, 8, 10, 11], "type": [0, 1, 3, 4, 5, 6], "dict": [0, 1, 3], "return": [0, 1, 3, 4, 5, 6], "lat_new": [0, 1], "lon_new": [0, 1], "x_wind_vel": [0, 1], "y_wind_vel": [0, 1], "bear": [0, 1, 6], "closest_lat": [0, 1], "closest_lon": [0, 1], "rtype": 0, "wind_alt_interpol": [0, 1, 6], "perform": [0, 1, 6, 10], "2": [0, 1, 3, 4, 5, 6, 8, 9, 10], "step": [0, 1, 6], "linear": [0, 1, 6], "horizont": [0, 1], "3d": [0, 6, 10, 11], "desir": [0, 1, 6], "timestamp": [0, 6], "The": [0, 1, 3, 4, 5, 6, 8, 9, 10], "figur": [0, 3], "below": [0, 3], "show": [0, 3, 9], "visual": [0, 6], "represent": 0, "how": [0, 3, 9, 10], "store": [0, 1, 9], "forecast": [0, 3, 6, 11], "geopotenti": [0, 8], "form": [0, 9], "non": [0, 6], "uniform": 0, "grid": 0, "also": [0, 6, 9, 10, 11], "chang": [0, 4, 10], "therefor": [0, 6], "we": [0, 6], "particular": [0, 3, 6, 9], "start": [0, 1, 6, 9, 10], "two": [0, 1, 5], "look": [0, 3, 8, 10], "along": [0, 1], "t0": [0, 1, 6], "t1": [0, 1, 6], "produc": [0, 8, 10], "6": [0, 5, 9], "v": [0, 1, 4, 5, 6, 8], "lower": 0, "upper": 0, "next": 0, "convert": [0, 6], "m": [0, 1, 3, 4, 5, 6], "first": [0, 1, 7], "compon": [0, 1, 6, 8], "1a": 0, "1b": 0, "np": [0, 6], "interp": [0, 6], "Then": 0, "onc": [0, 1, 10], "match": [0, 1], "detemin": 0, "respect": [0, 1], "paramet": [0, 1, 3, 4, 5, 6, 9, 10], "u_wind_vel": 0, "v_wind_vel": 0, "version": [1, 8], "wa": [1, 7], "edit": 1, "integr": [1, 4, 10], "earthshab": [1, 8, 9, 12], "contribut": [1, 8], "author": 1, "craig": [1, 8], "motel": [1, 8], "michael": [1, 8], "rodriguez": 1, "niwc": [1, 8], "pacif": [1, 8], "tristan": 1, "schuler": 1, "start_coord": [1, 9], "creat": [1, 6], "object": 1, "inform": [1, 6, 9], "about": [1, 9], "check": [1, 6], "whether": 1, "take": [1, 8, 10], "subset": 1, "your": [1, 7], "model": [1, 8, 9, 11], "exampl": [1, 9], "you": [1, 8, 10], "have": [1, 8, 9], "after": [1, 4, 9, 10], "ignor": 1, "through": [1, 3], "save": [1, 8], "similar": 1, "gf": [1, 2, 6, 8, 10], "nomad": [1, 9, 10], "server": [1, 8, 9, 10], "closestidx": 1, "dimens": 1, "actual": 1, "If": [1, 7, 10], "column": 1, "row": 1, "indic": 1, "nan": [1, 10], "shape": [1, 10], "size": [1, 10], "so": [1, 5, 8], "resiz": 1, "being": [1, 8, 9], "getnearestaltbyindex": 1, "int_hr_idx": 1, "lat_i": [1, 6], "lon_i": [1, 6], "alt_m": 1, "latitud": [1, 6], "getnearestlatidx": 1, "integ": 1, "0": [1, 3, 5, 6, 9, 10], "where": [1, 4, 7, 8], "getnearestlonidx": 1, "effect": [1, 3], "current": [1, 3, 5, 6, 9, 10], "posit": 1, "float": [1, 3, 4, 5, 6, 10], "init_with_tim": 1, "add": 1, "without": 1, "ani": [1, 10], "initi": [1, 4, 5], "our": 1, "diff_tim": 1, "lat_idx": 1, "lon_idx": 1, "between": [1, 5, 9], "lot": 1, "clean": 1, "code": 1, "what": 1, "origin": [1, 8], "sent": 1, "me": 1, "exactli": 1, "sure": [1, 8], "differ": [1, 3, 9, 10], "do": 1, "more": [1, 6, 8, 9], "renam": [1, 8], "later": [1, 8], "result": 1, "same": [1, 8, 9, 10], "right": 1, "thoug": 1, "calcul": [1, 3, 4, 5, 6], "place": 1, "vector": [1, 6], "era5": [2, 6, 9, 10], "radiat": [2, 5, 10], "solve_st": 2, "sphere_balloon": 2, "windmap": 2, "modul": [2, 11], "solv": [3, 4, 5, 10], "envior": 3, "datetim": [3, 4, 5], "gettempforecast": 3, "temperatur": [3, 4, 5, 8, 10], "todo": [1, 3], "oper": 3, "yet": 3, "get_si0": 3, "incid": 3, "solar": [3, 4, 5, 7, 11], "abov": 3, "earth": [3, 5, 10, 11], "w": [3, 5], "i_": 3, "sun": 3, "i_0": 3, "cdot": [3, 4], "1": [1, 3, 4, 5, 6, 8, 10], "5": [3, 5, 10], "frac": [3, 4, 5], "e": 3, "co": 3, "f": [3, 5], "atm": [3, 4, 5], "get_air_mass": 3, "zen": [3, 5], "el": [3, 4, 5], "air": [3, 5], "mass": [3, 4, 10], "elev": [3, 4, 5], "am": 3, "1229": 3, "614co": 3, "zeta": 3, "angl": [1, 3, 6], "rad": [3, 4, 6], "approxim": 3, "unitless": 3, "get_diffuse_si": 3, "diffus": [3, 5], "sky": 3, "intens": 3, "get_direct_si": 3, "direct": [3, 6], "tntensiti": 3, "get_earth_ir": 3, "infar": 3, "emit": 3, "surfac": [3, 4, 5], "ir": 3, "get_rad_tot": 3, "total": [3, 4, 5], "date": [3, 9], "tucson": 3, "arizona": [3, 11], "srufac": 3, "km": 3, "get_reflected_si": 3, "reflect": 3, "get_sky_ir": 3, "get_trans_atm": 3, "amount": 3, "permeat": 3, "certain": 3, "driven": 3, "transmitt": 3, "tau_": 3, "65am": 3, "095am": 3, "trasmitt": 3, "get_zenith": 3, "adjust": [3, 9, 10], "zenith": 3, "hour": [3, 8, 9], "numer": [4, 8, 10], "dynam": [4, 10, 11], "respons": 4, "solvest": 4, "paramat": [4, 5], "configur": [4, 5, 9], "get_acceler": 4, "t_": [4, 5], "t_i": [4, 5], "acceler": 4, "one": 4, "timestep": [4, 6], "d": 4, "2z": 4, "du": 4, "f_b": 4, "f_g": 4, "f_d": 4, "m_": 4, "virtual": 4, "buyoanc": 4, "forc": [4, 5, 10], "f_": 4, "b": 4, "rho_": 4, "int": [4, 5, 6], "v_": 4, "bal": 4, "g": 4, "drag": 4, "c_d": 4, "a_": 4, "proj": 4, "beta": 4, "system": 4, "virt": 4, "payload": [4, 10], "envelop": [4, 5, 10], "c_": [4, 5], "intern": [4, 5], "get_convection_v": 4, "heat": [4, 5, 11], "lost": 4, "vent": 4, "q_": 4, "dot": 4, "c_v": 4, "convect": [4, 5], "unit": 4, "solveverticaltrajectori": 4, "alt_sp": 4, "v_sp": 4, "acceller": 4, "dt_": 4, "q": 4, "_": 4, "conv": 4, "ext": [4, 5], "env": 4, "dt_i": 4, "co_2": 4, "setpoint": 4, "updat": [4, 8, 10], "transfer": [5, 11], "get_nu_ext": 5, "ra": 5, "re": [5, 9], "pr": 5, "extern": 5, "nusselt": 5, "number": 5, "natur": 5, "buoyanc": 5, "nu_": 5, "n": 5, "begin": 5, "case": 5, "6ra": 5, "text": 5, "cdot10": 5, "8": [5, 8, 9], "1ra": 5, "34": 5, "geq1": 5, "end": [5, 6, 9], "ascend": 5, "47re": 5, "3": [5, 8, 9], "4": [5, 9], "0262re": 5, "615": 5, "transit": 5, "correl": 5, "raleigh": 5, "reynold": 5, "prandtl": 5, "get_nu_int": 5, "ga": 5, "35": 5, "325ra": 5, "get_pr": 5, "prantl": 5, "mu_": 5, "p": 5, "get_conduct": 5, "thermal": 5, "sutherland": 5, "law": [5, 8], "k_": 5, "0241": 5, "271": 5, "15": 5, "9": 5, "get_q_ext": 5, "print": 5, "solar_posit": 5, "2018": 5, "43": 5, "51": 5, "0486": 5, "114": 5, "07": 5, "power": 5, "sphere": [5, 10], "surround": 5, "get_q_int": 5, "get_sum_q_int": 5, "sum": 5, "neg": 5, "get_sum_q_surf": 5, "q_rad": 5, "input": 5, "get_viscoc": 5, "kinemat": 5, "viscoc": 5, "458": 5, "110": 5, "mu": 5, "gener": [6, 8, 10, 11], "windros": 6, "plot": [6, 10], "polar": 6, "displai": 6, "variou": 6, "format": [6, 8, 9, 10], "getwind": 6, "estim": [6, 8, 10], "approach": 6, "scipi": [6, 12], "interpolat": 6, "cubicsplin": 6, "instead": 6, "like": [6, 8], "see": [6, 9], "correspond": [6, 10], "laongitud": 6, "float64": 6, "2d": 6, "plotwindveloc": 6, "download": 6, "time_in_rang": 6, "x": 6, "true": 6, "windvectortobear": [1, 6], "h": [1, 6], "specif": 6, "angular": 6, "radial": 6, "radiu": 6, "color": 6, "map": [6, 10], "plai": 7, "import": 7, "role": 7, "research": 7, "pleas": 7, "public": 7, "introduc": [7, 10], "aerial": 7, "platform": [7, 11], "planetari": 7, "explor": 7, "ecmwf": 8, "weather": [8, 9, 10, 11], "reanalysi": 8, "copernicu": 8, "climat": 8, "websit": 8, "requir": 8, "sign": 8, "account": [1, 8, 10], "abl": 8, "fifth": 8, "global": 8, "past": [8, 9], "decad": 8, "combin": 8, "observ": 8, "across": 8, "world": 8, "complet": [8, 11], "consist": 8, "dataset": [8, 9], "physic": [8, 10], "principl": 8, "call": 8, "assimil": 8, "method": [1, 8], "centr": 8, "mani": [8, 9, 10], "12": [8, 9], "previou": 8, "newli": 8, "avail": [8, 9], "optim": 8, "best": 8, "state": 8, "analysi": [8, 9, 10, 11], "improv": 8, "issu": [6, 8, 10], "work": [8, 10], "reduc": 8, "resolut": [8, 9, 10], "allow": 8, "provis": 8, "span": 8, "back": [6, 8], "sever": 8, "doe": [1, 8], "constraint": 8, "collect": 8, "when": [6, 8, 9, 10], "go": 8, "further": 8, "ingest": 8, "benefit": 8, "qualiti": 8, "product": 8, "hourli": [8, 9], "1979": 8, "present": 8, "navig": 8, "tab": 8, "includ": [8, 10], "let": 8, "sai": 8, "want": 8, "over": [8, 10], "hawaiian": 8, "island": 8, "januari": 8, "2021": 8, "typic": [8, 9, 10], "select": [8, 9], "would": 8, "Be": 8, "experiment": 8, "request": 8, "ad": 8, "queue": 8, "few": 8, "minut": 8, "directori": [8, 10], "feel": 8, "free": 8, "someth": 8, "unlik": [8, 9], "avil": [8, 9], "increment": [8, 9, 10], "option": [8, 9], "thank": 8, "rodriquez": 8, "featur": 8, "dataserv": 9, "local": 9, "unidata": 9, "api": 9, "comput": 9, "abil": 9, "offlin": 9, "00": 9, "utc": 9, "upload": 9, "delai": 9, "10": 9, "dai": [9, 10], "384": 9, "16": 9, "futur": 9, "As": 9, "visit": 9, "februari": 9, "17": 9, "2022": 9, "were": 9, "gfs20220217": 9, "most": [9, 10], "recent": 9, "click": 9, "info": 9, "ex": 9, "gfs_0p25_00z": 9, "besid": 9, "_anl": 9, "although": 9, "recommend": 9, "learn": 9, "http": 9, "rda": 9, "ucar": 9, "edu": 9, "ds083": 9, "doc": 9, "pdf": 9, "them": 9, "By": [9, 11], "batch": 9, "exponenti": 9, "faster": 9, "than": [6, 9], "These": [9, 10], "gfs20231008": 9, "interv": [9, 10], "tpical": 9, "start_tim": 9, "lat_rang": 9, "indici": 9, "cenet": 9, "aroudn": 9, "lon_rang": 9, "download_dai": 9, "maximum": 9, "limit": 9, "reanlayi": 9, "give": 10, "config": 10, "heart": 10, "releas": 10, "group": 10, "togeth": 10, "convien": 10, "categori": 10, "balloon_properti": 10, "materi": 10, "propeti": 10, "support": 10, "6m": 10, "charcoal": 10, "coat": 10, "shab": [10, 11], "netcdf_gf": 10, "read": 10, "better": 10, "trajectroi": 10, "accuraci": 10, "netcdf_era5": 10, "forecast_typ": 10, "either": 10, "must": 10, "gfsrate": 10, "often": 10, "default": 10, "per": 10, "60": 10, "fastest": 10, "rate": 10, "provid": 10, "highest": 10, "fidel": 10, "significantli": 10, "longer": [1, 10], "earth_properti": 10, "mostli": 10, "constant": 10, "proeprti": 10, "don": 10, "howev": [1, 6, 10], "ground": 10, "emiss": 10, "albedo": 10, "might": 10, "launch": 10, "ocean": 10, "snow": 10, "cover": 10, "locat": 10, "increas": 10, "decreas": 10, "caus": [6, 10], "full": 10, "geometri": 10, "output": 10, "rose": 10, "profil": [10, 11], "interact": 10, "googl": 10, "v1": 10, "compar": 10, "renalysi": 10, "histor": 10, "flight": [10, 11], "At": 10, "apr": 10, "fi": 10, "devic": 10, "real": 10, "track": 10, "land": 10, "balloon_trajectori": 10, "none": 10, "filenam": 10, "famili": 10, "challeng": 10, "even": 10, "rainbow": 10, "varri": 10, "rough": 10, "manual": 10, "altern": 10, "csv": 10, "inclu": 10, "open": 11, "softwar": 11, "path": 11, "adapt": 11, "marsshab": 11, "develop": 11, "univers": 11, "incorpor": 11, "search": 11, "page": 11, "reli": 12, "geographiclib": 12, "gmplot": 12, "netcdf4": 12, "numpi": 12, "panda": 12, "termcolor": 12, "backport": 12, "datetime_fromisoformat": 12, "seaborn": 12, "pytz": 12, "xarrai": 12, "get2nearestaltidx": 1, "It": 1, "wrap": [1, 6], "taken": 1, "care": 1, "interpolatebear": 1, "u_veloc": 1, "v_veloc": 1, "well": [1, 6], "h0": 1, "h1": 1, "while": 1, "possibl": 1, "360degre": 1, "axi": [1, 6], "crossov": 1, "interpolatebearingtim": 1, "bearing0": 1, "speed0": 1, "bearing1": 1, "speed1": 1, "alreadi": 1, "known": 1, "conver": 1, "wind_alt_interpolate2": 1, "choos": 1, "interpolation_frequ": 6, "plotwind2": 6, "num_interpol": 6, "100": 6, "believ": 6, "accur": [1, 6], "arctan2": 6, "distribut": 6, "point": 6, "still": 6, "180": 6, "oppos": 6, "undefin": 6, "goe": 6, "shortest": 6, "distanc": 6, "around": 6, "circl": 6, "cross": 6, "360": 6, "prevent": 6, "down": 6, "region": 6, "get": 6, "entir": 6, "num_iter": 6, "deg": 6, "cloast": 6, "matplotlib": 6, "old": 1, "both": 1, "slightli": 1, "u_new": 1, "v_new": 1, "u_old": 1, "v_old": 1}, "objects": {"": [[1, 0, 0, "-", "ERA5"], [0, 0, 0, "-", "GFS"], [3, 0, 0, "-", "radiation"], [4, 0, 0, "-", "solve_states"], [5, 0, 0, "-", "sphere_balloon"], [6, 0, 0, "-", "windmap"]], "ERA5": [[1, 1, 1, "", "ERA5"]], "ERA5.ERA5": [[1, 2, 1, "", "__init__"], [1, 2, 1, "", "closestIdx"], [1, 2, 1, "", "determineRanges"], [1, 2, 1, "", "fill_missing_data"], [1, 2, 1, "", "get2NearestAltIdxs"], [1, 2, 1, "", "getNearestAltbyIndex"], [1, 2, 1, "", "getNearestLatIdx"], [1, 2, 1, "", "getNearestLonIdx"], [1, 2, 1, "", "getNewCoord"], [1, 2, 1, "", "init_with_time"], [1, 2, 1, "", "interpolateBearing"], [1, 2, 1, "", "interpolateBearingTime"], [1, 2, 1, "", "windVectorToBearing"], [1, 2, 1, "", "wind_alt_Interpolate"], [1, 2, 1, "", "wind_alt_Interpolate2"]], "GFS": [[0, 1, 1, "", "GFS"]], "GFS.GFS": [[0, 2, 1, "", "__init__"], [0, 2, 1, "", "closest"], [0, 2, 1, "", "determineRanges"], [0, 2, 1, "", "fill_missing_data"], [0, 2, 1, "", "getNearestAlt"], [0, 2, 1, "", "getNearestLat"], [0, 2, 1, "", "getNearestLon"], [0, 2, 1, "", "getNewCoord"], [0, 2, 1, "", "wind_alt_Interpolate"]], "radiation": [[3, 1, 1, "", "Radiation"]], "radiation.Radiation": [[3, 2, 1, "", "getTempForecast"], [3, 2, 1, "", "get_SI0"], [3, 2, 1, "", "get_air_mass"], [3, 2, 1, "", "get_diffuse_SI"], [3, 2, 1, "", "get_direct_SI"], [3, 2, 1, "", "get_earth_IR"], [3, 2, 1, "", "get_rad_total"], [3, 2, 1, "", "get_reflected_SI"], [3, 2, 1, "", "get_sky_IR"], [3, 2, 1, "", "get_trans_atm"], [3, 2, 1, "", "get_zenith"]], "solve_states": [[4, 1, 1, "", "SolveStates"]], "solve_states.SolveStates": [[4, 2, 1, "", "__init__"], [4, 2, 1, "", "get_acceleration"], [4, 2, 1, "", "get_convection_vent"], [4, 2, 1, "", "solveVerticalTrajectory"]], "sphere_balloon": [[5, 1, 1, "", "Sphere_Balloon"]], "sphere_balloon.Sphere_Balloon": [[5, 2, 1, "", "__init__"], [5, 2, 1, "", "get_Nu_ext"], [5, 2, 1, "", "get_Nu_int"], [5, 2, 1, "", "get_Pr"], [5, 2, 1, "", "get_conduction"], [5, 2, 1, "", "get_q_ext"], [5, 2, 1, "", "get_q_int"], [5, 2, 1, "", "get_sum_q_int"], [5, 2, 1, "", "get_sum_q_surf"], [5, 2, 1, "", "get_viscocity"]], "windmap": [[6, 1, 1, "", "Windmap"]], "windmap.Windmap": [[6, 2, 1, "", "__init__"], [6, 2, 1, "", "getWind"], [6, 2, 1, "", "plotWind2"], [6, 2, 1, "", "plotWindVelocity"], [6, 2, 1, "", "time_in_range"], [6, 2, 1, "", "windVectorToBearing"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"]}, "titleterms": {"gf": [0, 9], "era5": [1, 8], "earthshab": [2, 7, 10, 11], "api": 2, "radiat": 3, "solve_st": 4, "sphere_balloon": 5, "windmap": 6, "cite": 7, "download": [8, 9, 10], "forecast": [8, 9, 10], "save": [9, 10], "usag": 10, "configur": 10, "file": 10, "exampl": 10, "indic": 11, "tabl": 11, "instal": 12, "requir": 12}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"EarthSHAB API": [[2, "earthshab-api"]], "radiation": [[3, "module-radiation"]], "solve_states": [[4, "module-solve_states"]], "sphere_balloon": [[5, "module-sphere_balloon"]], "Citing EarthSHAB": [[7, "citing-earthshab"]], "Downloading ERA5 Forecasts": [[8, "downloading-era5-forecasts"]], "Downloading GFS Forecasts": [[9, "downloading-gfs-forecasts"]], "Saving GFS Forecasts": [[9, "saving-gfs-forecasts"]], "EarthSHAB Usage": [[10, "earthshab-usage"]], "Downloading and Saving Forecasts:": [[10, null]], "Configuration File": [[10, "configuration-file"]], "Examples": [[10, "examples"]], "EarthSHAB": [[11, "earthshab"]], "Indices and tables": [[11, "indices-and-tables"]], "Installation Requirements": [[12, "installation-requirements"]], "windmap": [[6, "module-windmap"]], "GFS": [[0, "module-GFS"]], "ERA5": [[1, "module-ERA5"]]}, "indexentries": {"era5": [[1, "module-ERA5"]], "era5 (class in era5)": [[1, "ERA5.ERA5"]], "__init__() (era5.era5 method)": [[1, "ERA5.ERA5.__init__"]], "closestidx() (era5.era5 method)": [[1, "ERA5.ERA5.closestIdx"]], "determineranges() (era5.era5 method)": [[1, "ERA5.ERA5.determineRanges"]], "fill_missing_data() (era5.era5 method)": [[1, "ERA5.ERA5.fill_missing_data"]], "get2nearestaltidxs() (era5.era5 method)": [[1, "ERA5.ERA5.get2NearestAltIdxs"]], "getnearestaltbyindex() (era5.era5 method)": [[1, "ERA5.ERA5.getNearestAltbyIndex"]], "getnearestlatidx() (era5.era5 method)": [[1, "ERA5.ERA5.getNearestLatIdx"]], "getnearestlonidx() (era5.era5 method)": [[1, "ERA5.ERA5.getNearestLonIdx"]], "getnewcoord() (era5.era5 method)": [[1, "ERA5.ERA5.getNewCoord"]], "init_with_time() (era5.era5 method)": [[1, "ERA5.ERA5.init_with_time"]], "interpolatebearing() (era5.era5 method)": [[1, "ERA5.ERA5.interpolateBearing"]], "interpolatebearingtime() (era5.era5 method)": [[1, "ERA5.ERA5.interpolateBearingTime"]], "module": [[1, "module-ERA5"]], "windvectortobearing() (era5.era5 method)": [[1, "ERA5.ERA5.windVectorToBearing"]], "wind_alt_interpolate() (era5.era5 method)": [[1, "ERA5.ERA5.wind_alt_Interpolate"]], "wind_alt_interpolate2() (era5.era5 method)": [[1, "ERA5.ERA5.wind_alt_Interpolate2"]]}}) \ No newline at end of file diff --git a/docs/img/Tucson_Radiation_Comparison.png b/docs/img/Tucson_Radiation_Comparison.png new file mode 100644 index 0000000..df4f0d7 Binary files /dev/null and b/docs/img/Tucson_Radiation_Comparison.png differ diff --git a/docs/img/era5_data_selection.png b/docs/img/era5_data_selection.png new file mode 100644 index 0000000..67612c6 Binary files /dev/null and b/docs/img/era5_data_selection.png differ diff --git a/docs/img/era5_data_selection2.png b/docs/img/era5_data_selection2.png new file mode 100644 index 0000000..09fc351 Binary files /dev/null and b/docs/img/era5_data_selection2.png differ diff --git a/docs/img/era5_download.png b/docs/img/era5_download.png new file mode 100644 index 0000000..dda8b97 Binary files /dev/null and b/docs/img/era5_download.png differ diff --git a/docs/img/gfs_2022-02-17.png b/docs/img/gfs_2022-02-17.png new file mode 100644 index 0000000..d96d425 Binary files /dev/null and b/docs/img/gfs_2022-02-17.png differ diff --git a/docs/img/netcdf-2step-interpolation.png b/docs/img/netcdf-2step-interpolation.png new file mode 100644 index 0000000..0d64773 Binary files /dev/null and b/docs/img/netcdf-2step-interpolation.png differ diff --git a/docs/img/nomad_server.png b/docs/img/nomad_server.png new file mode 100644 index 0000000..bdcca9d Binary files /dev/null and b/docs/img/nomad_server.png differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..9644bbb --- /dev/null +++ b/docs/index.html @@ -0,0 +1 @@ + diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..98268a3 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=. + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/API/GFS.rst b/docs/source/API/GFS.rst new file mode 100644 index 0000000..ca40661 --- /dev/null +++ b/docs/source/API/GFS.rst @@ -0,0 +1,10 @@ +===================== +:mod:`GFS` +===================== + +.. automodule:: GFS +.. autoclass:: GFS + :members: + :special-members: __init__ + + diff --git a/docs/source/API/era5.rst b/docs/source/API/era5.rst new file mode 100644 index 0000000..9e80a7c --- /dev/null +++ b/docs/source/API/era5.rst @@ -0,0 +1,10 @@ +===================== +:mod:`ERA5` +===================== + +.. automodule:: ERA5 +.. autoclass:: ERA5 + :members: + :special-members: __init__ + + diff --git a/docs/source/API/index.rst b/docs/source/API/index.rst new file mode 100644 index 0000000..5c70478 --- /dev/null +++ b/docs/source/API/index.rst @@ -0,0 +1,20 @@ +.. _api-index: + +############## +EarthSHAB API +############## + +.. toctree:: + :maxdepth: 1 + + GFS + era5 + radiation + solve_states + sphere_balloon + windmap + +* :ref:`genindex` +* :ref:`modindex` + + diff --git a/docs/source/API/radiation.rst b/docs/source/API/radiation.rst new file mode 100644 index 0000000..91b7761 --- /dev/null +++ b/docs/source/API/radiation.rst @@ -0,0 +1,10 @@ +===================== +:mod:`radiation` +===================== + +.. automodule:: radiation +.. autoclass:: Radiation + :members: + :special-members: __init__ + + diff --git a/docs/source/API/solve_states.rst b/docs/source/API/solve_states.rst new file mode 100644 index 0000000..60d789d --- /dev/null +++ b/docs/source/API/solve_states.rst @@ -0,0 +1,10 @@ +===================== +:mod:`solve_states` +===================== + +.. automodule:: solve_states +.. autoclass:: SolveStates + :members: + :special-members: __init__ + + diff --git a/docs/source/API/sphere_balloon.rst b/docs/source/API/sphere_balloon.rst new file mode 100644 index 0000000..e23989c --- /dev/null +++ b/docs/source/API/sphere_balloon.rst @@ -0,0 +1,10 @@ +===================== +:mod:`sphere_balloon` +===================== + +.. automodule:: sphere_balloon +.. autoclass:: Sphere_Balloon + :members: + :special-members: __init__ + + diff --git a/docs/source/API/windmap.rst b/docs/source/API/windmap.rst new file mode 100644 index 0000000..1e344df --- /dev/null +++ b/docs/source/API/windmap.rst @@ -0,0 +1,10 @@ +===================== +:mod:`windmap` +===================== + +.. automodule:: windmap +.. autoclass:: Windmap + :members: + :special-members: __init__ + + diff --git a/docs/source/citing.rst b/docs/source/citing.rst new file mode 100644 index 0000000..516b737 --- /dev/null +++ b/docs/source/citing.rst @@ -0,0 +1,11 @@ +.. _Citing_EarthSHAB: + +Citing EarthSHAB +================ + +If EarthSHAB played an important role in your research, then please cite the following publication +where EarthSHAB was first introduced: + +`Solar Balloons - An Aerial Platform for Planetary Exploration `_ + + diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..29760e4 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,78 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# + +import os +import sys +sys.path.insert(0, os.path.abspath('../..')) + + +# -- Project information ----------------------------------------------------- + +project = 'EarthSHAB' +copyright = '2023, Tristan Schuler' +author = 'Tristan Schuler' + +# The full version, including alpha/beta/rc tags +release = '1.1.0' + +# The suffix of source filenames. +#source_suffix = '.rst' + +# The master toctree document. +#master_doc = 'index' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.napoleon', + 'sphinx.ext.autodoc', + 'sphinx_rtd_theme', + 'sphinx.ext.autosummary', + 'sphinx.ext.autosectionlabel', + 'sphinx.ext.coverage', + 'sphinx.ext.intersphinx', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +toc_object_entries = False + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" #"sphinx_rtd_theme" #'alabaster' + + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y at %H:%M:%S' diff --git a/docs/source/examples/downloadERA5.rst b/docs/source/examples/downloadERA5.rst new file mode 100644 index 0000000..0fd7cee --- /dev/null +++ b/docs/source/examples/downloadERA5.rst @@ -0,0 +1,42 @@ +========================== +Downloading ERA5 Forecasts +========================== + +ECMWF weather forecasts reanalysis data are downloaded from the `Copernicus Climate Data Server `_. This website requires signing up for an account before being able to download data. + +.. seealso:: + + "**ERA5** is the fifth generation ECMWF reanalysis for the global climate and weather for the past 8 decades. + + Reanalysis combines model data with observations from across the world into a globally complete and consistent dataset using the laws of physics. This principle, called data assimilation, is based on the method used by numerical weather prediction centres, where every so many hours (12 hours at ECMWF) a previous forecast is combined with newly available observations in an optimal way to produce a new best estimate of the state of the atmosphere, called analysis, from which an updated, improved forecast is issued. Reanalysis works in the same way, but at reduced resolution to allow for the provision of a dataset spanning back several decades. Reanalysis does not have the constraint of issuing timely forecasts, so there is more time to collect observations, and when going further back in time, to allow for the ingestion of improved versions of the original observations, which all benefit the quality of the reanalysis product. + " + +Download the reanalysis data from `ERA5 hourly data on pressure levels from 1979 to present `_ and navigating to the **Download data** tab. + +The variables (**requires all pressure levels**) needed to forecast the balloon trajectories include: + +- Geopotential +- U-component of wind +- V-component of wind +- Temperature + + +Let say you want data over the Hawaiian Islands for January 1-2, 2021, then a typical selection would look like: + +.. image:: ../../img/era5_data_selection.png + +.. image:: ../../img/era5_data_selection2.png + +Be sure to select **NetCDF (experimental)** for the download format to use with EarthSHAB. + +The data download request is then added to a queue and can be downloaded a later time (typically only takes a few minutes). Save the netcdf reanalysis file to the *forecast directory* and feel free to rename the file to something more useful. + +.. note:: ECMWF reanalysis data is available every hour unlike GFS which is avilable in 3 hour increments. + +The download option will look like the following: + +.. image:: ../../img/era5_download.png + + +.. important:: Thank you to Craig Motell and Michael Rodriquez from NIWC Pacific for contributing to the ERA5 feature. + diff --git a/docs/source/examples/downloadGFS.rst b/docs/source/examples/downloadGFS.rst new file mode 100644 index 0000000..9f1b4e6 --- /dev/null +++ b/docs/source/examples/downloadGFS.rst @@ -0,0 +1,37 @@ +========================== +Downloading GFS Forecasts +========================== + +NOAA weather forecasts are downloaded from the `NOMADS dataserver `_ at a 0.25 degree resolution and saved locally in a netcdf file format (see `Unidata netcdf API `_ for netcdf file format information) +to save computation time and have the ability to run trajectories offline. + +Forecasts are available in 6 hour increments (starting with 00 UTC) and typically have a 4 hour upload delay. From the current date, forecasts can be downloaded up to 10 days in the past, and each forecast predicts up to 384 hours (16 days) in the future. + +As an example, when visiting the server on February 17, 2022, the following options were available: + +.. image:: ../../img/nomad_server.png + +The after selecting option 10, *gfs20220217*, which is the most recent forecast the following options were avilable: + +.. image:: ../../img/gfs_2022-02-17.png + +Clicking on *info* for a particular forecast (ex. *gfs_0p25_00z*) will show the available variables for download + +.. note:: Besides forecasts, analysis model runs are also available (files ending in "_anl"), although it is recommended to use forecasts for EarthSHAB. To learn more about the differences between forecast and analysis runs see https://rda.ucar.edu/datasets/ds083.2/docs/Analysis.pdf. + +Saving GFS Forecasts +========================== + +``saveNETCDF.py`` downloads the data from the server and saves them to a *.nc* file to use in EarthSHAB. By saving the file for offline use, running batch simulations is exponentially faster than having to re-download the same forecast from the server for every simulation run. + +The following parameters need to be adjusted in the configuration file before saving a netcdf forecast. + +- ``gfs``: the start time of the gfs forecast downloaded from the server (These are in the form of *gfs20231008/gfs_0p25_00z*). Start times ares in 6 hour intervals and typically are tpically delayed about 8-12 hours before being uploaded to the server. The server only stores the past 10 days of forecasts. +- ``start_time``: the start time of the simulation +- ``lat_range``: How many 0.25 degree indicies to download cenetered aroudn the ``start_coord`` +- ``lon_range``: How many 0.25 degree indicies to download cenetered aroudn the ``start_coord`` +- ``download_days``: How many days of data to download from the server, can be a maximum of 10 (limited by the server). Data from GFS is downloaded in 3 hour increments unlike ERA5 reanlayis forecasts which are in hourly increments. +- ``start_coord`` + + + diff --git a/docs/source/examples/index.rst b/docs/source/examples/index.rst new file mode 100644 index 0000000..e953470 --- /dev/null +++ b/docs/source/examples/index.rst @@ -0,0 +1,61 @@ +.. _examples-index: + +################### +EarthSHAB Usage +################### + +.. toctree:: + :maxdepth: 1 + :caption: Downloading and Saving Forecasts: + + downloadGFS + downloadERA5 + +These files give examples on how to use EarthSHAB. + +Configuration File +=================== + + +``config.py`` is the heart of any EarthSHAB simulation and the only file that needs to be updated to use EarthSHAB at the current release. Many parameters can be adjusted for running EarthSHAB simulations and the parameters are grouped together into convienent categories: + +- **balloon_properties:** includes parameters for adjusting the balloon size and material propeties. Currently only the 'sphere' shape is supported. If using a standard 6m charcoal-coated SHAB balloon, the payload and envelope masses are the only parameters that need to be updated. +- **netcdf_gfs:** includes parameters for reading and saving GFS netcdf forecasts from `NOAA's NOMADS server `_. Currently only supporting forecasts with a resolution of 0.25 degrees for better trajectroy prediction accuracy. +- **netcdf_era5:** +- **simulation:** +- **forecast_type:** Either GFS or ERA5. For either to work, a corresponding netcdf file must be download and in the forecasts directory. +- **GFS.GFSRate:** adjusts how often wind speeds are looked up (default is once per 60 seconds). The fastest look up rate is up to 1.0 s, which provides the highest fidelity predictions, but also takes significantly longer to run a simulation. +- **dt:** is default to 1.0s integrating intervals. +- **earth_properties:** include mostly constant proeprties for earth. These values typically don't need to be changed, however the ground emissivity and albedo might be changed if predicting balloon launches over oceans or snow covered locations. + + +.. tip:: If when increasing ``dt``, nans are introduced, this is a numerical integration issue that can be solved by decreasing dt. Most values over 2.5s cause this issue when running a simulation. + + + +Examples +=================== + +``main.py`` performs a full-physics based simulation taking into account: balloon geometry and properties, radiation sources for the coordinate and altitude, dynamic force analysis, and weather forecasts. The simulation outputs an altitude plot, balloon temperature, a 3d wind rose and atmospheric temperature profile for the starting location, and an interactive google maps trajectory. + +**New** in v1.1, ``main.py`` supports comparing simulations (using either a GFS forecast or ERA5 renalysis) to a historical balloon flight. At this time, only balloon trajectories in the *aprs.fi* format are supported. Flights using APRS devices for real time tracking can be downloaded after landing from `APRS.fi `_. To use this functionality, change ``balloon_trajectory`` in the configuration file from None to a filename. + +|pic0| + +.. |pic0| image:: ../../../img/SHAB12-V.png + :width: 100% + + +``predict.py`` uses EarthSHAB to generate a family of altitude and trajectory predictions at different float altitudes. Estimating float altitudes for a standard charcoal SHAB balloon are challenging and can range from SHAB to SHAB even if all the **balloon_properties** are the same and the balloons are launches on the same day. This example produces a rainbow altitude plot and interactive google maps trajectory prediction. The float altitudes are adjusted by changing the payload mass in .25 increments to simulate varrying float altitudes. + +|pic1| |pic2| + +.. |pic1| image:: ../../../img/rainbow_trajectories_altitude.png + :width: 48% + +.. |pic2| image:: ../../../img/rainbow_trajectories_map.PNG + :width: 48% + +``trajectory.py`` provides a rough example of how to use EarthSHAB with a manual altitude profile to estimate wind-based trajectory predictions. Alternatively, you can generate a csv file in the *aprs.fi* format and inclue it in ``config.py``. + + diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..c06308f --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,29 @@ +.. EarthSHAB documentation master file, created by + sphinx-quickstart on Thu Oct 12 10:15:53 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + :hidden: + + installation + examples/index + API/index + citing + + +EarthSHAB +========= + +EarthSHAB is an open source software platform for predicting the flight paths of solar balloon on Earth, adapted from `MarsSHAB `_, developed at the University of Arizona. Altitude profiles for a SHAB flight are generated using heat transfer modeling and dynamic analysis. By incorporating weather forecasts from NOAA, complete 3D SHAB trajectories can also be predicted. + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/source/installation.rst b/docs/source/installation.rst new file mode 100644 index 0000000..68b2858 --- /dev/null +++ b/docs/source/installation.rst @@ -0,0 +1,22 @@ +========================== +Installation Requirements +========================== + +EarthSHAB relies on the following libraries: + - fluids + - geographiclib + - gmplot + - netCDF4 + - numpy + - pandas + - termcolor + - backports.datetime_fromisoformat + - seaborn + - scipy + - pytz + - xarray + + + + + diff --git a/forecasts/SHAB14V_ERA5_20220822_20220823.nc b/forecasts/SHAB14V_ERA5_20220822_20220823.nc new file mode 100644 index 0000000..5492d3a Binary files /dev/null and b/forecasts/SHAB14V_ERA5_20220822_20220823.nc differ diff --git a/forecasts/gfs_0p25_20201120_06.nc b/forecasts/gfs_0p25_20201120_06.nc new file mode 100644 index 0000000..f2d9ce0 Binary files /dev/null and b/forecasts/gfs_0p25_20201120_06.nc differ diff --git a/forecasts/gfs_0p25_20220409_12.nc b/forecasts/gfs_0p25_20220409_12.nc new file mode 100644 index 0000000..177d326 Binary files /dev/null and b/forecasts/gfs_0p25_20220409_12.nc differ diff --git a/forecasts/gfs_0p25_20220822_12.nc b/forecasts/gfs_0p25_20220822_12.nc new file mode 100644 index 0000000..16c6dce Binary files /dev/null and b/forecasts/gfs_0p25_20220822_12.nc differ diff --git a/forecasts/shab10_era_2022-04-09to2022-04-10.nc b/forecasts/shab10_era_2022-04-09to2022-04-10.nc new file mode 100644 index 0000000..c261826 Binary files /dev/null and b/forecasts/shab10_era_2022-04-09to2022-04-10.nc differ diff --git a/img/SHAB12-V.png b/img/SHAB12-V.png new file mode 100644 index 0000000..9d5a9ac Binary files /dev/null and b/img/SHAB12-V.png differ diff --git a/main.py b/main.py index 1d87412..fbba0d1 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,22 @@ +<<<<<<< HEAD import math import solve_states import GFS +======= +""" This file shows an example of how to predict solar balloon trajectories and produces several plots +as well as an html trajectory map that uses Google maps and can be opened in an internet browser. + +run saveNETCDF.py before running this file to download a forecast from NOAA. + +Maybe convert to this new library later https://unidata.github.io/python-training/workshop/Bonus/downloading-gfs-with-siphon/ + +""" + +import math +import solve_states +import GFS +import ERA5 +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 from termcolor import colored import matplotlib.pyplot as plt import fluids @@ -8,6 +24,7 @@ import time as tm import pandas as pd import os +<<<<<<< HEAD import windmap import radiation @@ -18,12 +35,26 @@ run saveNETCDF.py before running this file to download a forecast from NOAA. """ +======= +import numpy as np +import re +import copy + +import seaborn as sns +import xarray as xr +from netCDF4 import Dataset + +import radiation +import config_earth +import windmap +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 if not os.path.exists('trajectories'): os.makedirs('trajectories') scriptstartTime = tm.time() +<<<<<<< HEAD GMT = 7 # MST dt = config_earth.dt @@ -31,17 +62,63 @@ t = config_earth.simulation['start_time'] start = t nc_start = config_earth.netcdf["nc_start"] +======= +GMT = 7 #0 # UTC MST +dt = config_earth.simulation['dt'] +coord = config_earth.simulation['start_coord'] +t = config_earth.simulation['start_time'] +start = t +nc_start = config_earth.netcdf_gfs["nc_start"] +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 min_alt = config_earth.simulation['min_alt'] alt_sp = config_earth.simulation['alt_sp'] v_sp = config_earth.simulation['v_sp'] sim_time = config_earth.simulation['sim_time'] * int(3600*(1/dt)) lat = [coord["lat"]] lon = [coord["lon"]] +<<<<<<< HEAD GFSrate = config_earth.GFS['GFSrate'] hourstamp = config_earth.netcdf['hourstamp'] atm = fluids.atmosphere.ATMOSPHERE_1976(min_alt) +======= +GFSrate = config_earth.forecast['GFSrate'] +hourstamp = config_earth.netcdf_gfs['hourstamp'] +balloon_trajectory = config_earth.simulation['balloon_trajectory'] +forecast_type = config_earth.forecast['forecast_type'] +atm = fluids.atmosphere.ATMOSPHERE_1976(min_alt) + +''' +#Some netcdf testing stuff +rootgrp = Dataset(config_earth.netcdf_gfs['nc_file'], "r", format="NETCDF4") +#rootgrp = Dataset("forecasts/" + config_earth.netcdf_era5['filename'], "r", format="NETCDF4") +print(rootgrp.data_model) +print(rootgrp.groups) +print(rootgrp.dimensions) +print(rootgrp.variables) +for name in rootgrp.ncattrs(): + print("Global attr {} = {}".format(name, getattr(rootgrp, name))) + +sdfs + +data = xr.open_dataset(config_earth.netcdf_gfs['nc_file']) +data = xr.open_dataset("forecasts/" + config_earth.netcdf_era5['filename']) +data2 = data.to_array() + +print (data) +print(data.attrs) +''' + +#Get trajectory name from config file for Google Maps: +if balloon_trajectory != None: + trajectory_name = copy.copy(balloon_trajectory) + replacements=[("balloon_data/", ""), (".csv", "")] + for pat,repl in replacements: + trajectory_name = re.sub(pat, repl, trajectory_name) + print (trajectory_name) + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 # Variables for Simulation and Plotting T_s = [atm.T] @@ -51,6 +128,7 @@ v= [0.] coords = [coord] +<<<<<<< HEAD ttt = [t - pd.Timedelta(hours=GMT)] #Just for visualizing plot better] data_loss = False burst = False @@ -58,6 +136,29 @@ e = solve_states.SolveStates() gfs = GFS.GFS(coord) +======= +x_winds_old = [0] +y_winds_old = [0] +x_winds_new = [0] +y_winds_new = [0] + +ttt = [t - pd.Timedelta(hours=GMT)] #Just for visualizing plot better] +data_loss = False +burst = False +gmap1 = gmplot.GoogleMapPlotter(coord["lat"],coord["lon"], 9) #9 is how zoomed in the map starts, the lower the number the more zoomed out + +e = solve_states.SolveStates() + +if forecast_type == "GFS": + gfs = GFS.GFS(coord) +else: + gfs = ERA5.ERA5(coord) + +lat_aprs_gps = [coord["lat"]] +lon_aprs_gps = [coord["lon"]] +ttt_aprs = [t - pd.Timedelta(hours=GMT)] +coords_aprs = [coord] +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 for i in range(0,sim_time): T_s_new,T_i_new,T_atm_new,el_new,v_new, q_rad, q_surf, q_int = e.solveVerticalTrajectory(t,T_s[i],T_i[i],el[i],v[i],coord,alt_sp,v_sp) @@ -72,8 +173,12 @@ if i % GFSrate == 0: +<<<<<<< HEAD lat_new,lon_new,x_wind_vel,y_wind_vel,bearing,nearest_lat, nearest_lon, nearest_alt = gfs.getNewCoord(coords[i],dt*GFSrate) #(coord["lat"],coord["lon"],0,0,0,0,0,0) +======= + lat_new,lon_new,x_wind_vel,y_wind_vel, x_wind_vel_old, y_wind_vel_old, bearing,nearest_lat, nearest_lon, nearest_alt = gfs.getNewCoord(coords[i],dt*GFSrate) #(coord["lat"],coord["lon"],0,0,0,0,0,0) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 coord_new = { "lat": lat_new, # (deg) Latitude "lon": lon_new, # (deg) Longitude @@ -85,6 +190,14 @@ lat.append(lat_new) lon.append(lon_new) +<<<<<<< HEAD +======= + x_winds_old.append(x_wind_vel_old) + y_winds_old.append(y_wind_vel_old) + x_winds_new.append(x_wind_vel) + y_winds_new.append(y_wind_vel) + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 rad = radiation.Radiation() zen = rad.get_zenith(t, coord_new) @@ -103,12 +216,77 @@ print(colored(("Nearest Lat: " + str(nearest_lat) + " Nearest Lon: " + str(nearest_lon) + " Nearest Alt: " + str(nearest_alt)),"cyan")) +<<<<<<< HEAD #Plots plt.style.use('seaborn-pastel') fig, ax = plt.subplots() ax.plot(ttt,el) plt.xlabel('Datetime (MST)') plt.ylabel('Elevation (m)') +======= +df = None +#Plots +''' +Add code to check if the trajectory name exists before running simulations + +Can I just switch order??? +''' + +if balloon_trajectory != None: + df = pd.read_csv(balloon_trajectory) + df["time"] = pd.to_datetime(df['time']) + df["time"] = df['time'] - pd.to_timedelta(7, unit='h') #Convert to MST + df["dt"] = df["time"].diff().apply(lambda x: x/np.timedelta64(1, 's')).fillna(0).astype('int64') + gmap1.plot(df['lat'], df['lng'],'white', edge_width = 2.5) # Actual Trajectory + gmap1.text(coord["lat"]-.1, coord["lon"]-.2, trajectory_name + " True Trajectory", color='white') + +#Reforecasting +if balloon_trajectory != None: + alt_aprs = df["altitude"].to_numpy() + time_aprs = df["time"].to_numpy() + dt_aprs = df["dt"].to_numpy() + t = config_earth.simulation['start_time'] + #t = config_earth.simulation['start_time'] + + for i in range(0,len(alt_aprs)-1): + + lat_new,lon_new,x_wind_vel,y_wind_vel, x_wind_vel_old, y_wind_vel_old, bearing,nearest_lat, nearest_lon, nearest_alt = gfs.getNewCoord(coords_aprs[i],dt_aprs[i]) + + t = t + pd.Timedelta(seconds=dt_aprs[i+1]) + ttt_aprs.append(t - pd.Timedelta(hours=GMT)) + + + coord_new = { + "lat": lat_new, # (deg) Latitude + "lon": lon_new, # (deg) Longitude + "alt": alt_aprs[i], # (m) Elevation + "timestamp": t, # Timestamp + } + + print(ttt_aprs[i], dt_aprs[i]) + + coords_aprs.append(coord_new) + lat_aprs_gps.append(lat_new) + lon_aprs_gps.append(lon_new) + + print(colored(("El: " + str(alt_aprs[i]) + " Lat: " + str(lat_new) + " Lon: " + str(lon_new) + " Bearing: " + str(bearing)),"green")) + + +sns.set_palette("muted") +fig, ax = plt.subplots() +ax.plot(ttt,el, label = "reforecasted simulation") +plt.xlabel('Datetime (MST)') +plt.ylabel('Elevation (m)') +if balloon_trajectory != None: + ax.plot(df["time"],df["altitude"],label = "trajectory") + + if forecast_type == "GFS": + gmap1.plot(lat_aprs_gps, lon_aprs_gps,'cyan', edge_width = 2.5) #Trajectory using Altitude balloon data with forecast data + gmap1.text(coord["lat"]-.3, coord["lon"]-.2, trajectory_name + " Alt + " + forecast_type + " Wind Data" , color='cyan') + elif forecast_type == "ERA5": + gmap1.plot(lat_aprs_gps, lon_aprs_gps,'orange', edge_width = 2.5) #Trajectory using Altitude balloon data with forecast data + gmap1.text(coord["lat"]-.3, coord["lon"]-.2, trajectory_name + " Alt + " + forecast_type + " Wind Data" , color='orange') +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 fig2, ax2 = plt.subplots() ax2.plot(ttt,T_s,label="Surface Temperature") @@ -120,6 +298,7 @@ plt.legend(loc='upper right') plt.title('Solar Balloon Temperature - Earth') +<<<<<<< HEAD # Outline Downloaded NOAA forecast subset: region= zip(*[ @@ -132,18 +311,96 @@ # Google Plotting of Trajectory gmap1.plot(lat, lon,'red', edge_width = 2.5) gmap1.polygon(*region, color='cornflowerblue', edge_width=1, alpha= .2) +======= + +def windVectorToBearing(u, v): + bearing = np.arctan2(v,u) + speed = np.power((np.power(u,2)+np.power(v,2)),.5) + return [bearing, speed] + +''' +plt.figure() +plt.plot(ttt, x_winds_new, label = "X winds New", color = "blue") +plt.plot(ttt, x_winds_old, label = "X winds Old", color = "cyan") + +plt.plot(ttt, y_winds_new, label = "Y winds New", color = "red") +plt.plot(ttt, y_winds_old, label = "Y winds Old", color = "orange") +''' + +plt.legend(loc='upper right') +plt.title('Wind Interpolation Comparison') + +#Winds Figure +plt.figure() +if any(x_winds_old): + plt.plot(ttt, np.degrees(windVectorToBearing(x_winds_old, y_winds_old)[0]), label = "Bearing old", color = "blue") +plt.plot(ttt, np.degrees(windVectorToBearing(x_winds_new, y_winds_new)[0]), label = "Bearing New", color = "red") +plt.legend(loc='upper right') +plt.title('Wind Interpolation Comparison') + + +# Outline Downloaded NOAA forecast subset: + +if forecast_type == "GFS": + region= zip(*[ + (gfs.LAT_LOW, gfs.LON_LOW), + (gfs.LAT_HIGH, gfs.LON_LOW), + (gfs.LAT_HIGH, gfs.LON_HIGH), + (gfs.LAT_LOW, gfs.LON_HIGH) + ]) + gmap1.plot(lat, lon,'blue', edge_width = 2.5) # Simulated Trajectory + gmap1.text(coord["lat"]-.2, coord["lon"]-.2, 'Simulated Trajectory with GFS Forecast', color='blue') + gmap1.polygon(*region, color='cornflowerblue', edge_width=5, alpha= .2) #plot region + +elif forecast_type == "ERA5": + region= zip(*[ + (gfs.LAT_LOW, gfs.LON_LOW), + (gfs.LAT_HIGH, gfs.LON_LOW), + (gfs.LAT_HIGH, gfs.LON_HIGH), + (gfs.LAT_LOW, gfs.LON_HIGH) + ]) + gmap1.plot(lat, lon,'red', edge_width = 2.5) # Simulated Trajectory + gmap1.text(coord["lat"]-.2, coord["lon"]-.2, 'Simulated Trajectory with ERA5 Reanalysis', color='red') + gmap1.polygon(*region, color='orange', edge_width=1, alpha= .15) #plot region + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 year = str(tm.localtime()[0]) month = str(tm.localtime()[1]).zfill(2) day = str(tm.localtime()[2]).zfill(2) +<<<<<<< HEAD gmap1.draw("trajectories/SHAB_" + str(t.year) + "_" + str(t.month) + "_" + str(start.day) + ".html" ) +======= + +if balloon_trajectory != None: + if forecast_type == "GFS": + gmap1.draw("trajectories/" + trajectory_name +"_GFS_" + str(t.year) + "_" + str(t.month) + "_" + str(start.day) + ".html" ) + + elif forecast_type == "ERA5": + gmap1.draw("trajectories/" + trajectory_name +"_ERA5_" + str(t.year) + "_" + str(t.month) + "_" + str(start.day) + ".html" ) +else: + if forecast_type == "GFS": + gmap1.draw("trajectories/PREDICTION_GFS_" + str(t.year) + "_" + str(t.month) + "_" + str(start.day) + ".html" ) + + elif forecast_type == "ERA5": + gmap1.draw("trajectories/PREDICTION_ERA5_" + str(t.year) + "_" + str(t.month) + "_" + str(start.day) + ".html" ) + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 executionTime = (tm.time() - scriptstartTime) print('\nSimulation executed in ' + str(executionTime) + ' seconds.') +<<<<<<< HEAD plt.style.use('default') hour_index, new_timestamp = windmap.getHourIndex(start, nc_start) windmap.plotWindVelocity(hour_index,coord["lat"],coord["lon"]) windmap.plotTempAlt(hour_index,coord["lat"],coord["lon"]) +======= +windmap = windmap.Windmap() +#windmap.plotWindVelocity(windmap.hour_index,windmap.LAT,windmap.LON) +windmap.plotWind2(windmap.hour_index,windmap.LAT,windmap.LON) +#windmap.plotWindOLD(windmap.hour_index,windmap.LAT,windmap.LON) + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 plt.show() diff --git a/predict.py b/predict.py index d2b3bed..f06f964 100644 --- a/predict.py +++ b/predict.py @@ -1,3 +1,11 @@ +<<<<<<< HEAD +======= +""" predict.py creates a family of predictions at different float altitudes. Float altitudes are adjusted by +changing the payload mass in .25 increments. + +""" + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import math from termcolor import colored import matplotlib.pyplot as plt @@ -8,20 +16,32 @@ from matplotlib.pyplot import cm import matplotlib as mpl import os +<<<<<<< HEAD +======= +import sys +import seaborn as sns +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import solve_states import GFS import radiation import windmap +<<<<<<< HEAD """ This files creates a family of predictions at different float altitudes. Float altitudes are adjusted by changing the payload mass in .25 increments. """ +======= +if config_earth.forecast['forecast_type'] == "ERA5": + print(colored("WARNING: Switch forecast type to GFS. This example is for predicting future flights", "yellow")) + sys.exit() +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 if not os.path.exists('trajectories'): os.makedirs('trajectories') coord = config_earth.simulation['start_coord'] +<<<<<<< HEAD nc_start = config_earth.netcdf["nc_start"] gfs = GFS.GFS(coord) gmap1 = gmplot.GoogleMapPlotter(coord["lat"], coord["lon"], 10) @@ -33,13 +53,29 @@ color = cmap = cm.get_cmap('rainbow_r', len(masses)) plt.style.use('seaborn-darkgrid') +======= +nc_start = config_earth.netcdf_gfs["nc_start"] +gfs = GFS.GFS(coord) +gmap1 = gmplot.GoogleMapPlotter(coord["lat"], coord["lon"], 10) +hourstamp = config_earth.netcdf_gfs['hourstamp'] + +masses = [0, .25, .5, .75, 1, 1.25, 1.5, 1.75, 2] + +color = cmap = cm.get_cmap('rainbow_r', len(masses)) + +sns.set_style("darkgrid") +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 plt.rcParams.update({'font.size': 14}) fig, ax = plt.subplots(1, 1, figsize=(12,8)) for j in range(0,len(masses)): +<<<<<<< HEAD print(colored("----------------------------------------------------------","magenta")) +======= + print(colored("---------------------------" + str(masses[j]) + "kg-------------------------------","magenta")) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 #Reset Config Values GMT = 7 # MST @@ -51,10 +87,17 @@ min_alt = config_earth.simulation['min_alt'] alt_sp = config_earth.simulation['alt_sp'] v_sp = config_earth.simulation['v_sp'] +<<<<<<< HEAD dt = config_earth.dt atm = fluids.atmosphere.ATMOSPHERE_1976(min_alt) GFSrate = config_earth.GFS['GFSrate'] +======= + dt = config_earth.simulation['dt'] + atm = fluids.atmosphere.ATMOSPHERE_1976(min_alt) + + GFSrate = config_earth.forecast['GFSrate'] +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 # Variables for Simulation and Plotting T_s = [atm.T] @@ -77,7 +120,11 @@ descent = False for i in range(0,simulation_time): +<<<<<<< HEAD T_s_new,T_i_new,T_atm_new,el_new,v_new, q_rad, q_surf, q_int = e.solveVerticalTrajectory(t,T_s[i],T_i[i],el[i],v[i],coord,alt_sp,v_sp) +======= + T_s_new,T_i_new,T_atm_new,el_new,v_new, q_rad, q_surf, q_int = e.solveVerticalTrajectory(t,T_s[i],T_i[i],el[i],v[i],coords[i],alt_sp,v_sp) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 # Correct for the infrared affects with low masses if v_new < -3.0 and el_new > 15000: @@ -101,7 +148,11 @@ if i % GFSrate == 0: +<<<<<<< HEAD lat_new,lon_new,x_wind_vel,y_wind_vel,bearing,nearest_lat, nearest_lon, nearest_alt = gfs.getNewCoord(coords[i],dt*GFSrate) #(coord["lat"],coord["lon"],0,0,0,0,0,0) +======= + lat_new,lon_new,x_wind_vel,y_wind_vel, x_wind_vel_old, y_wind_vel_old,bearing,nearest_lat, nearest_lon, nearest_alt = gfs.getNewCoord(coords[i],dt*GFSrate) #(coord["lat"],coord["lon"],0,0,0,0,0,0) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 coord_new = { "lat": lat_new, # (deg) Latitude @@ -145,8 +196,13 @@ plt.ylabel('Elevation (m)') ax.get_xaxis().set_minor_locator(mpl.ticker.AutoMinorLocator()) ax.get_yaxis().set_minor_locator(mpl.ticker.AutoMinorLocator()) +<<<<<<< HEAD ax.grid(b=True, which='major', color='w', linewidth=1.0) ax.grid(b=True, which='minor', color='w', linewidth=0.5) +======= +ax.grid(visible=True, which='major', color='w', linewidth=1.0) +ax.grid(visible=True, which='minor', color='w', linewidth=0.5) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 region= zip(*[ (gfs.LAT_LOW, gfs.LON_LOW), @@ -159,7 +215,15 @@ gmap1.draw("trajectories/" + str(t.year) + "_" + str(t.month) + "_" + str(start.day) + "_trajectories.html" ) plt.style.use('default') +<<<<<<< HEAD hour_index, new_timestamp = windmap.getHourIndex(start, nc_start) windmap.plotWindVelocity(hour_index,coord["lat"],coord["lon"]) windmap.plotTempAlt(hour_index,coord["lat"],coord["lon"]) +======= +windmap = windmap.Windmap() +windmap.plotWindVelocity(windmap.hour_index,windmap.LAT,windmap.LON) +#hour_index, new_timestamp = windmap.getHourIndex(start, nc_start) +#windmap.plotWindVelocity(hour_index,coord["lat"],coord["lon"]) +#windmap.plotTempAlt(hour_index,coord["lat"],coord["lon"]) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 plt.show() diff --git a/radiation.py b/radiation.py index bba1759..5743264 100644 --- a/radiation.py +++ b/radiation.py @@ -1,13 +1,24 @@ +<<<<<<< HEAD +======= +""" +radiation solves for radiation due to the enviorment for a particular datetime and altitude. + +""" + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import math import fluids import numpy as np import config_earth +<<<<<<< HEAD """ radiation3.py solves for radiation due to the enviorment for a particular datetime and altitude. """ +======= +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 class Radiation: # Constants I0 = 1358 # Direct Solar Radiation Level @@ -39,6 +50,22 @@ def getTemp(self, el): atm = fluids.atmosphere.ATMOSPHERE_1976(el) return atm.T +<<<<<<< HEAD +======= + def getTempForecast(self, coord): + r""" Looks up the forecast temperature at the current coordinate and altitude + + .. important:: TODO. This function is not operational yet. + + :param coord: current coordinate + :type coord: dict + :returns: atmospheric temperature (k) + :rtype: float + + """ + return temp + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 def getPressure(self, el): atm = fluids.atmosphere.ATMOSPHERE_1976(el) return atm.P @@ -52,10 +79,21 @@ def getGravity(self, el): return atm.g def get_SI0(self): +<<<<<<< HEAD """ Incident solar radiation above Earth's atmosphere (W/m^2) :returns: The incident solar radiation above Earths atm (W/m^2) :rtype: float +======= + r""" Incident solar radiation above Earth's atmosphere (W/m^2) + + .. math:: I_{sun,0}= I_0 \cdot [1+0.5(\frac{1+e}{1-e})^2-1) \cdot cos(f)] + + + :returns: The incident solar radiation above Earths atm (W/m^2) + :rtype: float + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ f = 2*math.pi*Radiation.Ls/365 #true anomaly @@ -63,16 +101,24 @@ def get_SI0(self): return Radiation.I0*(1.+0.5*e2*math.cos(f)) def get_declination(self): +<<<<<<< HEAD """Expression from http://en.wikipedia.org/wiki/Position_of_the_Sun :returns: Approximate solar declination (rad) :rtype: float """ +======= + #This function is unused +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 return -.4091*math.cos(2*math.pi*(Radiation.Ls+10)/365) def get_zenith(self, t, coord): +<<<<<<< HEAD """ Calculates solar zenith angle +======= + """ Calculates adjusted solar zenith angle at elevation +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param t: Lattitude (rad) :type t: Datetime @@ -80,6 +126,10 @@ def get_zenith(self, t, coord): :type coord: dict :returns: The approximate solar zenith angle (rad) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ solpos = fluids.solar_position(t, coord["lat"], coord["lon"], Z = coord["alt"]) @@ -97,7 +147,13 @@ def get_zenith(self, t, coord): return adjusted_zen def get_air_mass(self,zen, el): +<<<<<<< HEAD """Air Mass at elevation +======= + r"""Air Mass at elevation + + .. math:: AM = 1229+(614cos(\zeta)^2)^{\frac{1}{2}}-614cos(\zeta) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param zen: Solar Angle (rad) :type zen: float @@ -105,6 +161,10 @@ def get_air_mass(self,zen, el): :type el: float :returns: The approximate air mass (unitless) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ p = self.getPressure(el) #pressure at current elevation @@ -112,7 +172,14 @@ def get_air_mass(self,zen, el): return am def get_trans_atm(self,zen,el): +<<<<<<< HEAD """get zenith angle +======= + r"""The amount of solar radiation that permeates through the atmosphere at a + certain altitude, I_{sun} is driven by the atmospheric transmittance. + + .. math:: \tau_{atm}= \frac{1}{2}(e^{-0.65AM}+e^{-0.095AM}) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param zen: Solar Angle (rad) :type zen: float @@ -120,6 +187,10 @@ def get_trans_atm(self,zen,el): :type el: float :returns: The atmospheric trasmittance (unitless) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ am = self.get_air_mass(zen, el) @@ -135,6 +206,10 @@ def get_direct_SI(self,zen,el): :type el: float :returns: Tntensity of the direct solar radiation (W/m^2) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ SI0 = self.get_SI0() @@ -155,6 +230,10 @@ def get_diffuse_SI(self,zen,el): :type el: float :returns: The intensity of the diffuse solar radiation from the sky (W/m^2) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ if(zen > math.pi/2.): @@ -175,6 +254,10 @@ def get_reflected_SI(self,zen,el): :type el: float :returns: The intensity solar radiation reflected by the Earth (W/m^2) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ incident_SI = self.get_SI0() @@ -193,6 +276,10 @@ def get_earth_IR(self,el): :type el: float :returns: Intensity of IR radiation emitted from earth (W/m^2) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ p = self.getPressure(el)#pressure at current elevation IR_trans = 1.716-0.5*(math.exp(-0.65*p/Radiation.P0) + math.exp(-0.095*p/Radiation.P0)) @@ -210,12 +297,25 @@ def get_sky_IR(self,el): :type el: float :returns: Intensity of IR radiation emitted from sky (W/m^2) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ return np.fmax(-0.03*el+300.,50.0) def get_rad_total(self,datetime,coord): +<<<<<<< HEAD """Total Radiation as a function of elevation, time of day, and balloon surface area +======= + """Calculates total radiation sources as a function of altitude, time, and balloon surface area. + + The figure below shows how different altitudes effects the radiation sources on + a particular date and coordinate for Tucson Arizona (at sruface level and 25 km altitudes) + + .. image:: ../../img/Tucson_Radiation_Comparison.png +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ diff --git a/saveNETCDF.py b/saveNETCDF.py index 51fe147..43625fd 100644 --- a/saveNETCDF.py +++ b/saveNETCDF.py @@ -1,3 +1,13 @@ +<<<<<<< HEAD +======= +""" +saveNETCDF.py downloads a portion of the netCDF file for the specified day and +area specified in earth_config.py. + +Archive forecast dataset retirval is not currently supported. +""" + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import netCDF4 as nc4 import config_earth from termcolor import colored @@ -7,6 +17,7 @@ import os coord = config_earth.simulation['start_coord'] +<<<<<<< HEAD lat_range = config_earth.netcdf['lat_range'] lon_range = config_earth.netcdf['lon_range'] hours3 = config_earth.netcdf['hours3'] @@ -14,10 +25,20 @@ res = config_earth.netcdf['res'] nc_start = config_earth.netcdf['nc_start'] +======= +lat_range = config_earth.netcdf_gfs['lat_range'] +lon_range = config_earth.netcdf_gfs['lon_range'] +download_days = config_earth.netcdf_gfs['download_days'] +hourstamp = config_earth.netcdf_gfs['hourstamp'] +res = config_earth.netcdf_gfs['res'] + +nc_start = config_earth.netcdf_gfs['nc_start'] +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 if not os.path.exists('forecasts'): os.makedirs('forecasts') +<<<<<<< HEAD """ saveNETCDF.py downloads a portion of the netCDF file for the specified day and area specified in earth_config.py. @@ -25,6 +46,8 @@ Archive forecast dataset retirval is not currently supported. """ +======= +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 def closest(arr, k): """ Given an ordered array and a value, determines the index of the closest item contained in the array. @@ -69,7 +92,11 @@ def getNearestLon(lon,min,max): print(colored("NOAA DODS Server error with timestamp " + str(nc_start) + ". Data not downloaded.", "red")) sys.exit() +<<<<<<< HEAD nc_out = nc4.Dataset(config_earth.netcdf['nc_file'], 'w') +======= +nc_out = nc4.Dataset(config_earth.netcdf_gfs['nc_file'], 'w') +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 for name, dimension in nc_in.dimensions.items(): nc_out.createDimension(name, len(dimension) if not dimension.isunlimited() else None) @@ -86,7 +113,11 @@ def getNearestLon(lon,min,max): x = nc_out.createVariable(name, variable.datatype, variable.dimensions, zlib=True) #Without zlib the file will be MASSIVE #Download only a chunk of the data +<<<<<<< HEAD for i in range(0,hours3): +======= + for i in range(0,download_days*8+1): #In intervals of 3 hours. hour_index of 8 is 8*3=24 hours. Add one more index to get full day range +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 #print(lat_i,lon_i) data = nc_in.variables[name][i,0:34,lat_i-lat_range:lat_i+lat_range,lon_i-lon_range:lon_i+lon_range] #This array can only have a maximum of 536,870,912 elements, Need to dynamically add. nc_out.variables[name][i,0:34,lat_i-lat_range:lat_i+lat_range,lon_i-lon_range:lon_i+lon_range] = data diff --git a/solve_states.py b/solve_states.py index 29277ec..6d14466 100644 --- a/solve_states.py +++ b/solve_states.py @@ -1,14 +1,30 @@ +<<<<<<< HEAD +======= +""" solve_states uses numerical integration to solve for the dynamic response of the balloon. + +""" + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import math import radiation import sphere_balloon import config_earth #Import parameters from configuration file. +<<<<<<< HEAD """ solve_states.py uses numerical integration to solve for the dynamic response of the balloon. """ class SolveStates: def __init__(self): """Initializes all of the solar balloon paramaters from the configuration file""" +======= + +class SolveStates: + def __init__(self): + """Initializes all of the solar balloon paramaters from the configuration file + + """ +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 self.Cp_air0 = config_earth.earth_properties['Cp_air0'] self.Rsp_air = config_earth.earth_properties['Rsp_air'] @@ -35,10 +51,32 @@ def __init__(self): self.vm_coeff = .1 #virtual mass coefficient self.k = self.massEnv*config_earth.balloon_properties['cp'] #thermal mass coefficient +<<<<<<< HEAD self.dt = config_earth.dt def get_acceleration(self,v,el,T_s,T_i): """Solves for the acceleration of the solar balloon after one timestep (dt). +======= + self.dt = config_earth.simulation['dt'] + + def get_acceleration(self,v,el,T_s,T_i): + r"""Solves for the acceleration of the solar balloon after one timestep (dt). + + .. math:: \frac{d^2z}{dt^2} = \frac{dU}{dt} = \frac{F_b-F_g-F_d}{m_{virtual}} + + The Buyoancy Force, F_{b}: + + .. math:: F_b = (\rho_{atm}-\rho_{int}) \cdot V_{bal} \cdot g + + The drag force, F_{d}: + + .. math:: F_d = \frac{1}{2} \cdot C_d \cdot rho_{atm} \cdot U^2 \cdot A_{proj} \cdot \beta + + and where the virtual mass is the total mass of the balloon system: + + .. math:: m_{virt} = m_{payload}+m_{envelope}+C_{virt} \cdot \rho_{atm} \cdot V_{bal} + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param T_s: Surface Temperature (K) :type T_s: float @@ -51,6 +89,10 @@ def get_acceleration(self,v,el,T_s,T_i): :returns: acceleration of balloon (m/s^2) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ rad = radiation.Radiation() @@ -74,7 +116,13 @@ def get_acceleration(self,v,el,T_s,T_i): return accel def get_convection_vent(self,T_i,el): +<<<<<<< HEAD """Calculates the heat lost to the atmosphere due to venting +======= + r"""Calculates the heat lost to the atmosphere due to venting + + .. math:: Q_{vent} = \dot{m} \cdot c_v \cdot (T_i-T_{atm}) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param T_i: Internal Temperature (K) :type T_i: float @@ -83,6 +131,10 @@ def get_convection_vent(self,T_i,el): :returns: Convection due to Venting (unit?) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ rad = radiation.Radiation() @@ -93,9 +145,20 @@ def get_convection_vent(self,T_i,el): def solveVerticalTrajectory(self,t,T_s,T_i,el,v,coord,alt_sp,v_sp): +<<<<<<< HEAD """This function numerically integrates and solves for the change in Surface Temperature, Internal Temperature, and accelleration after a timestep, dt. +======= + r"""This function numerically integrates and solves for the change in Surface Temperature, Internal Temperature, and accelleration + after a timestep, dt. + + .. math:: \frac{dT_s}{dt} = \frac{\dot{Q}_{rad}+\dot{Q}_{conv,ext}-\dot{Q}_{conv,int}}{c_{v,env} \cdot m_{envelope}} + + .. math:: \frac{dT_i}{dt} = \frac{\dot{Q}_{conv,int}-\dot{Q}_{vent}}{c_{v,CO_2} \cdot m_{CO_2}} + + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param t: Datetime :type t: datetime :param T_s: Surface Temperature (K) @@ -113,6 +176,10 @@ def solveVerticalTrajectory(self,t,T_s,T_i,el,v,coord,alt_sp,v_sp): :returns: Updated parameters after dt (seconds) :rtype: float [T_s,T_i,el,v] +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ bal = sphere_balloon.Sphere_Balloon() @@ -126,7 +193,12 @@ def solveVerticalTrajectory(self,t,T_s,T_i,el,v,coord,alt_sp,v_sp): tm_air = rho_int*self.vol*self.Cp_air0 #Numerically integrate change in Surface Temperature +<<<<<<< HEAD coord["alt"] = el +======= + coord["alt"] = el #Change this when using GFS + #print(el, coord["alt"]) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 q_rad = rad.get_rad_total(t,coord) q_surf = bal.get_sum_q_surf(q_rad, T_s, el, v) q_int = bal.get_sum_q_int(T_s, T_i, el) diff --git a/sphere_balloon.py b/sphere_balloon.py index 6a09cf9..4234c99 100644 --- a/sphere_balloon.py +++ b/sphere_balloon.py @@ -1,15 +1,31 @@ +<<<<<<< HEAD +======= +""" +sphere_balloon solves for the total heat transfer on the solar balloon. + +""" + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import math import numpy as np import radiation import config_earth +<<<<<<< HEAD """ sphere_balloon.py solves for the total heat transfer on the solar balloon. """ class Sphere_Balloon: """Initializes atmospheric properties from the earth configuration file""" +======= + +class Sphere_Balloon: + """Initializes atmospheric properties from the earth configuration file + + """ +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 Cp_air0 = config_earth.earth_properties['Cp_air0'] Rsp_air = config_earth.earth_properties['Rsp_air'] cv_air0 = config_earth.earth_properties['Cv_air0'] @@ -19,7 +35,13 @@ class Sphere_Balloon: SB = 5.670373E-8 # Stefan Boltzman Constant def __init__(self): +<<<<<<< HEAD """Initializes all of the solar balloon paramaters from the configuration file""" +======= + """Initializes all of the solar balloon paramaters from the configuration file + + """ +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 self.d = config_earth.balloon_properties['d'] self.emissEnv = config_earth.balloon_properties['emissEnv'] @@ -31,38 +53,71 @@ def setEmiss(self,e): self.emissEnv = e def get_viscocity(self,T): +<<<<<<< HEAD """Calculates Kinematic Viscocity of Air at Temperature,T +======= + r"""Calculates Kinematic Viscocity of Air at Temperature, T + + .. math:: \mu_{air} = 1.458\cdot10^{-6}\frac{T_{atm}^{1.5}}{T_{atm}+110.4} + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param T: Temperature (K) :type Ra: float :returns: mu, Kinematic Viscocity of Air :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ #print("viscocity",T) return 1.458E-6*(np.sign(T) * (np.abs(T)) ** (1.5))/(T+110.4) #numpy power does not allow fractional powers of negative numbers. This is the workaround def get_conduction(self,T): +<<<<<<< HEAD """Calculates Thermal Diffusivity of Air at Temperature, T using Sutherland's Law of Thermal Diffusivity +======= + r"""Calculates Thermal Diffusivity of Air at Temperature, T using Sutherland's Law of Thermal Diffusivity + + + .. math:: k_{air} = 0.0241(\frac{T_{atm}}{271.15})^{0.9} +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param T: Temperature (K) :type Ra: float :returns: Thermal Diffusivity of Air (W/(m*K) :rtype: float +<<<<<<< HEAD """ #print("conduction",T) +======= + + """ +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 return 0.0241*(np.sign(T) * (np.abs(T/273.15)) ** (0.9)) def get_Pr(self,T): +<<<<<<< HEAD """Calculates Prantl Number +======= + r"""Calculates Prantl Number + + .. math:: Pr = \mu_{air} \frac{C_{p,air}}{k} +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param T: Temperature (K) :type Ra: float :returns: Prantl Number :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ k = self.get_conduction(T) #Thermal diffusivity Pr = self.get_viscocity(T)*Sphere_Balloon.Cp_air0/k @@ -71,7 +126,30 @@ def get_Pr(self,T): #-------------------------------------------SOLVE FOR T_S------------------------------------------------------------------''' def get_Nu_ext(self,Ra, Re, Pr): +<<<<<<< HEAD """Calculates External Nusselt Number +======= + r"""Calculates External Nusselt Number. + + Determine the external convection due to natural buoyancy + + .. math:: Nu_{ext,n}=\begin{cases} + 2+0.6Ra^{0.25}, & \text{$Ra<1.5\cdot10^8$}\\ + 0.1Ra^{0.34}, & \text{$Ra\geq1.5\cdot10^8$} + \end{cases} + + Determine the external forced convection due to the balloon ascending + + .. math:: Nu_{ext,f}=\begin{cases} + 2+0.47Re^{\frac{1}{2}}Pr^{\frac{1}{3}}, & \text{$Re<5\cdot10^4$}\\ + (0.0262Re^{0.34}-615)Pr^{\frac{1}{3}}, & \text{$Re\geq1.5\cdot10^8$} + \end{cases} + + To transition between the two correlations: + + .. math:: Nu_{ext} = max(Nu_{ext,n},Nu_{ext,f}) + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param Ra: Raleigh's number :type Ra: float @@ -81,6 +159,10 @@ def get_Nu_ext(self,Ra, Re, Pr): :type Pr: float :returns: External Nusselt Number :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ Nu_n = 0.0 @@ -109,6 +191,10 @@ def get_q_ext(self, T_s, el, v): :type el: float :returns: Power transferred from sphere to surrounding atmosphere due to convection(W) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ rad = radiation.Radiation() @@ -147,6 +233,10 @@ def get_sum_q_surf(self,q_rad, T_s, el, v): :type v: float :returns: The sum of power input to the balloon surface (W) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ q_conv_loss = -self.get_q_ext(T_s, el, v) @@ -156,12 +246,26 @@ def get_sum_q_surf(self,q_rad, T_s, el, v): #--------------------------------------------SOLVE FOR T INT------------------------------------------------------------- def get_Nu_int(sef,Ra): +<<<<<<< HEAD """Calculates Internal Nusselt Number +======= + r"""Calculates Internal Nusselt Number for internal convection between the balloon + envelope and internal gas + + .. math:: Nu_{int}=\begin{cases} + 2.5(2+0.6Ra^{\frac{1}{4}}), & \text{$Ra<1.35\cdot10^8$}\\ + 0.325Ra^{\frac{1}{3}}, & \text{$Ra\geq1.35\cdot10^8$} + \end{cases} +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 :param Ra: Raleigh's number :type Ra: float :returns: Internal Nusselt Number :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ if Ra < 1.35E8: @@ -180,6 +284,10 @@ def get_q_int(self,T_s, T_i, el): :type v: float :returns: Internal Heat Transfer (W) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ rad = radiation.Radiation() @@ -228,6 +336,10 @@ def get_sum_q_int(self, T_s, T_i, el): :type v: float :returns: SUm of Internal Heat Transfer (W) :rtype: float +<<<<<<< HEAD +======= + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 """ q_conv_int = self.get_q_int(T_s, T_i, el) return q_conv_int diff --git a/trajectories/SHAB14V-APRS_ERA5_2022_8_22.html b/trajectories/SHAB14V-APRS_ERA5_2022_8_22.html new file mode 100644 index 0000000..1832928 --- /dev/null +++ b/trajectories/SHAB14V-APRS_ERA5_2022_8_22.html @@ -0,0 +1,55530 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trajectories/SHAB14V-APRS_GFS_2022_8_22.html b/trajectories/SHAB14V-APRS_GFS_2022_8_22.html new file mode 100644 index 0000000..f87110e --- /dev/null +++ b/trajectories/SHAB14V-APRS_GFS_2022_8_22.html @@ -0,0 +1,55530 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trajectories/SHAB_ERA5_2020_11_20.html b/trajectories/SHAB_ERA5_2020_11_20.html new file mode 100644 index 0000000..ff8c645 --- /dev/null +++ b/trajectories/SHAB_ERA5_2020_11_20.html @@ -0,0 +1,37223 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trajectories/SHAB_ERA5_2022_4_9.html b/trajectories/SHAB_ERA5_2022_4_9.html new file mode 100644 index 0000000..3818f14 --- /dev/null +++ b/trajectories/SHAB_ERA5_2022_4_9.html @@ -0,0 +1,43345 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trajectories/SHAB_ERA5_2022_8_22.html b/trajectories/SHAB_ERA5_2022_8_22.html new file mode 100644 index 0000000..b616f07 --- /dev/null +++ b/trajectories/SHAB_ERA5_2022_8_22.html @@ -0,0 +1,37369 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trajectories/SHAB_GFS_2020_11_20.html b/trajectories/SHAB_GFS_2020_11_20.html new file mode 100644 index 0000000..4769601 --- /dev/null +++ b/trajectories/SHAB_GFS_2020_11_20.html @@ -0,0 +1,37223 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trajectories/SHAB_GFS_2022_4_9.html b/trajectories/SHAB_GFS_2022_4_9.html new file mode 100644 index 0000000..f05ef1b --- /dev/null +++ b/trajectories/SHAB_GFS_2022_4_9.html @@ -0,0 +1,43345 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trajectories/SHAB_GFS_2022_8_22.html b/trajectories/SHAB_GFS_2022_8_22.html new file mode 100644 index 0000000..3693fbc --- /dev/null +++ b/trajectories/SHAB_GFS_2022_8_22.html @@ -0,0 +1,44569 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trajectories/SHAB_trapezoid_2022_8_22_23000.html b/trajectories/SHAB_trapezoid_2022_8_22_23000.html new file mode 100644 index 0000000..8a88cf0 --- /dev/null +++ b/trajectories/SHAB_trapezoid_2022_8_22_23000.html @@ -0,0 +1,54049 @@ + + + + +Google Maps - gmplot + + + + +
+ + diff --git a/trapezoid.py b/trapezoid.py index 4ea32bf..3e81ef9 100644 --- a/trapezoid.py +++ b/trapezoid.py @@ -1,3 +1,13 @@ +<<<<<<< HEAD +======= +""" +trapezoid. shows an example of using a manual altitude profile to generate a balloon trajectory. + +This particular altitude profile is trapezoidal in shape with an ascent/descent velocity 2 and 3 m/s respectively and a float altitude +that is specified in config_earth. +""" + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 from termcolor import colored import math import gmplot @@ -6,6 +16,10 @@ import os import GFS +<<<<<<< HEAD +======= +import ERA5 +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 import radiation import config_earth @@ -13,6 +27,7 @@ if not os.path.exists('trajectories'): os.makedirs('trajectories') +<<<<<<< HEAD """ This file shows an example of using a manual altitude profile to generate a balloon trajectory. @@ -20,6 +35,8 @@ that is specified in config_earth. """ +======= +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 GMT = 7 # Import configuration file variables @@ -28,9 +45,17 @@ t = start min_alt = config_earth.simulation['min_alt'] float = config_earth.simulation['float'] +<<<<<<< HEAD dt = config_earth.dt sim = config_earth.simulation["sim_time"] GFSrate = config_earth.GFS["GFSrate"] +======= +dt = config_earth.simulation['dt'] +sim = config_earth.simulation["sim_time"] +GFSrate = config_earth.forecast["GFSrate"] + +forecast_type = config_earth.forecast['forecast_type'] +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 simulation_time = sim*int(3600*(1/dt)) # Simulation time in seconds @@ -42,7 +67,15 @@ lon = [coord["lon"]] +<<<<<<< HEAD gfs = GFS.GFS(coord) +======= +if forecast_type == "GFS": + gfs = GFS.GFS(coord) +else: + gfs = ERA5.ERA5(coord) + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 burst = False gmap1 = gmplot.GoogleMapPlotter(coord["lat"],coord["lon"],8) @@ -54,7 +87,11 @@ t = t + pd.Timedelta(hours=(1/3600*dt)) if i % GFSrate == 0: +<<<<<<< HEAD lat_new,lon_new,x_wind_vel,y_wind_vel,bearing,nearest_lat, nearest_lon, nearest_alt = gfs.getNewCoord(coords[i], dt*GFSrate) +======= + lat_new,lon_new,x_wind_vel,y_wind_vel, x_wind_vel_old, y_wind_vel_old,bearing,nearest_lat, nearest_lon, nearest_alt = gfs.getNewCoord(coords[i], dt*GFSrate) +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 coord_new = { "lat": lat_new, # (deg) Latitude @@ -75,7 +112,11 @@ el_new = float if zen > math.radians(90): +<<<<<<< HEAD el_new -= 3 *dtt +======= + el_new -= 3 *dt #this used to say dtt +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 if el_new < min_alt: diff --git a/windmap.py b/windmap.py index 609e0be..cf046e9 100644 --- a/windmap.py +++ b/windmap.py @@ -1,11 +1,29 @@ +<<<<<<< HEAD import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl import netCDF4 +======= +""" +This is file generates a 3d windrose plot for a particular coordinate and timestamp. +The polar plot displays information on wind speed and direction at +various altitudes in a visual format + +""" + + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib as mpl +from matplotlib import ticker +#import netCDF4 +from termcolor import colored +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 from scipy.interpolate import CubicSpline import fluids import config_earth from datetime import datetime, timedelta +<<<<<<< HEAD file = netCDF4.Dataset(config_earth.netcdf["nc_file"]) nc_start = config_earth.netcdf["nc_start"] @@ -144,6 +162,422 @@ def plotTempAlt(hour_index,lat,lon): # Extract relevant u/v wind velocity, and altitude T = tmpprs[hour_index,:,lat_i,lon_i] h = hgtprs[hour_index,:,lat_i,lon_i] +======= +import sys + +import GFS +import ERA5 + +class Windmap: + def __init__(self): + + if config_earth.forecast['forecast_type'] == "GFS": + self.gfs = GFS.GFS(config_earth.simulation['start_coord']) + self.file = self.gfs.file + else: + self.era5 = ERA5.ERA5(config_earth.simulation['start_coord']) + self.file = self.era5.file + + + #FIX THE DEFINING OF THESE Variables + #******************* + #self.res = config_earth.netcdf_gfs['res'] #fix this + self.nc_start = config_earth.netcdf_gfs["nc_start"] #fix this + + self.start_time = config_earth.simulation["start_time"] + self.coord = config_earth.simulation['start_coord'] + self.LAT = self.coord["lat"] + self.LON = self.coord["lon"] + + # VERIFY TIMESTAMP INFO MAKES SENSE + hours = None + self.new_timestamp = None + + #EDIT TO REMOVE THESE + #Should I move these to ERA5 and GFS for organization? + if config_earth.forecast['forecast_type'] == "GFS": + self.lat = self.file.variables['lat'][:] + self.lon = self.file.variables['lon'][:] + self.levels = self.file.variables['lev'][:] + + self.vgrdprs = self.file.variables['vgrdprs'] + self.ugrdprs = self.file.variables['ugrdprs'] + self.hgtprs = self.file.variables['hgtprs'] + try: + self.tmpprs = self.file.variables['tmpprs'] + except: + print(colored("Temperature not downloaded in this GFS forecast", "yellow")) + self.tmpprs = None + self.hour_index, self.new_timestamp = self.getHourIndex(self.start_time) + + if config_earth.forecast['forecast_type'] == "ERA5": + + self.lat = self.file.variables['latitude'][:] + self.lon = self.file.variables['longitude'][:] + self.levels = self.file.variables['level'][:] + + self.vgrdprs = self.file.variables['v'] + self.ugrdprs = self.file.variables['u'] + self.hgtprs = self.file.variables['z'] + self.tmpprs = self.file.variables['time'] #are t and time the same? #THIS IS WRONG SHOULD BE TEMPERATURE + + self.hour_index, self.new_timestamp = self.getHourIndex(self.start_time) + + def closest(self,arr, k): + return min(range(len(arr)), key = lambda i: abs(arr[i]-k)) + + def time_in_range(self,start, end, x): + """Return true if x is in the range [start, end]""" + if start <= end: + return start <= x <= end + else: + return start <= x or x <= end + + #THIS IS ASSUMING THE CORRECT ERA5 TIME PERIOD HAS BEEN DOWNLOADED + def getHourIndex(self,start_time): + if config_earth.forecast['forecast_type'] == "GFS": + times = self.gfs.time_convert + else: + times = self.era5.time_convert + #Check is simulation start time is within netcdf file + if not self.time_in_range(times[0], times[-1], self.start_time): + print(colored("Simulation start time " + str(self.start_time) + " is not within netcdf timerange of " + str(times[0]) + " - " + str(times[-1]) , "red")) + sys.exit() + else: + print(colored("Simulation start time " + str(self.start_time) + " is within netcdf timerange of " + str(times[0]) + " - " + str(times[-1]) , "green")) + + #Find closest time using lambda function: + closest_time = min(times, key=lambda sub: abs(sub - start_time)) + + #Need to write some exception handling code + #Find the corresponding index to a matching key (closest time) in the array (full list of timestamps in netcdf) + hour_index = [i for i ,e in enumerate(times) if e == closest_time][0] + + return hour_index, closest_time + + + def windVectorToBearing(self, u, v, h): + """ Converts U-V wind data at specific heights to angular and radial + components for polar plotting. + + :param u: U-Vector Wind Component from Forecast + :type u: float64 array + :param v: V-Vector Wind Component from Forecast + :type v: float64 array + :param h: Corresponding Converted Altitudes (m) from Forecast + :type h: float64 array + :returns: Array of bearings, radius, colors, and color map for plotting + :rtype: array + + """ + + # Calculate altitude + bearing = np.arctan2(v,u) + bearing = np.unwrap(bearing) + r = np.power((np.power(u,2)+np.power(v,2)),.5) + + # Set up Color Bar + colors = h + cmap=mpl.colors.ListedColormap(colors) + + return [bearing, r , colors, cmap] + + + def getWind(self,hour_index,lat_i,lon_i, interpolation_frequency = 1): + """ Calculates a wind vector estimate at a particular 3D coordinate and timestamp + using a 2-step linear interpolation approach. + + Currently using scipy.interpolat.CubicSpline instead of np.interp like in GFS and ERA5. + + See also :meth:`GFS.GFS.wind_alt_Interpolate` + + :param hour_index: Time index from forecast file + :type hour_index: int + :param lat_i: Array index for corresponding netcdf lattitude array + :type lat_i: int + :param lon_i: Array index for corresponding netcdf laongitude array + :type lon_i: int + :returns: [U, V] + :rtype: float64 2d array + + """ + + g = 9.80665 # gravitation constant used to convert geopotential height to height + + u = self.ugrdprs[hour_index,:,lat_i,lon_i] + v = self.vgrdprs[hour_index,:,lat_i,lon_i] + h = self.hgtprs[hour_index,:,lat_i,lon_i] + + # Remove missing data + u = u.filled(np.nan) + v = v.filled(np.nan) + nans = ~np.isnan(u) + u= u[nans] + v= v[nans] + h = h[nans] + + #for ERA5, need to reverse all array so h is increasing. + if config_earth.forecast['forecast_type'] == "ERA5": + u = np.flip(u) + v = np.flip(v) + h = np.flip(h) + h = h / g #have to do this for ERA5 + + #Fix this interpolation method later, espcially for ERA5 + cs_u = CubicSpline(h, u) + cs_v = CubicSpline(h, v) + if config_earth.forecast['forecast_type'] == "GFS": + h_new = np.arange(0, h[-1], interpolation_frequency) # New altitude range + elif config_earth.forecast['forecast_type'] == "ERA5": + h_new = np.arange(0, h[-1], interpolation_frequency) # New altitude range + u = cs_u(h_new) + v = cs_v(h_new) + + return self.windVectorToBearing(u, v, h_new) + + + def plotWind2(self,hour_index,lat,lon, num_interpolations = 100): + """ Calculates a wind vector estimate at a particular 3D coordinate and timestamp + using a 2-step linear interpolation approach. + + I believe this is more accurate than linear interpolating the U-V wind components. Using arctan2 + creates a non-linear distribution of points, however they should still be accurate. arctan2 causes issues + when there are 180 degree opposing winds because it is undefined, and the speed goes to 0 and back up to the new speed. + + Therefore instead we interpolate the wind speed and direction, and use an angle wrapping check to see if the shortest + distance around the circle crosses the 0/360 degree axis. This prevents speed down to 0, as well as undefined regions. + + 1. Get closest timesteps (t0 and t1) and lat/lon indexes for desired time + 2. Convert the entire altitude range at t0 and t1 U-V wind vector components to wind speed and direction (rad and m/s) + 3. Perform a linear interpolation of wind speed and direction. Fill in num_iterations + + :param hour_index: Time index from forecast file + :type hour_index: int + :param lat: Latitude coordinate [deg] + :type lat_i: float + :param lon_i: Longitude coordinate [deg] + :type lon_i: cloast + :returns: 3D windrose plot + :rtype: matplotlib.plot + + """ + + if config_earth.forecast['forecast_type'] == "GFS": + lat_i = self.gfs.getNearestLat(lat, -90, 90.01 ) #I think instead of min max this is because download netcdf downloads the whole world, but many of the spots are empty. + lon_i = self.gfs.getNearestLon(lon, 0, 360 ) + + elif config_earth.forecast['forecast_type'] == "ERA5": + lat_i = self.era5.getNearestLatIdx(lat, self.era5.lat_min_idx, self.era5.lat_max_idx) + lon_i = self.era5.getNearestLonIdx(lon, self.era5.lon_min_idx, self.era5.lon_max_idx) + + + g = 9.80665 # gravitation constant used to convert geopotential height to height + + u = self.ugrdprs[hour_index,:,lat_i,lon_i] + v = self.vgrdprs[hour_index,:,lat_i,lon_i] + h = self.hgtprs[hour_index,:,lat_i,lon_i] + + # Remove missing data + u = u.filled(np.nan) + v = v.filled(np.nan) + nans = ~np.isnan(u) + u= u[nans] + v= v[nans] + h = h[nans] + + #for ERA5, need to reverse all array so h is increasing. + if config_earth.forecast['forecast_type'] == "ERA5": + u = np.flip(u) + v = np.flip(v) + h = np.flip(h) + h = h / g #have to do this for ERA5 + + bearing, r , colors, cmap = self.windVectorToBearing(u, v, h) + + # Create interpolated altitudes and corresponding wind data + interpolated_altitudes = [] + interpolated_speeds = [] + interpolated_directions_deg = [] + + + for i in range(len(h) - 1): + + #Do some angle wrapping checks + interp_dir_deg = 0 + angle1 = np.degrees(bearing[i]) %360 + angle2 = np.degrees(bearing[i + 1]) %360 + angular_difference = abs(angle2-angle1) + + if angular_difference > 180: + if (angle2 > angle1): + angle1 += 360 + else: + angle2 += 360 + + + for j in range(num_interpolations + 1): + alpha = j / num_interpolations + interp_alt = h[i] + alpha * (h[i + 1] - h[i]) + interp_speed = np.interp(interp_alt, [h[i], h[i + 1]], [r[i], r[i + 1]]) + + interp_dir_deg = np.interp(interp_alt, [h[i], h[i + 1]], [angle1, angle2]) % 360 #make sure in the range (0, 360) + + interpolated_altitudes.append(interp_alt) + interpolated_speeds.append(interp_speed) + interpolated_directions_deg.append(interp_dir_deg) + + fig = plt.figure(figsize=(10, 8)) + ax1 = fig.add_subplot(111, projection='polar') + + if config_earth.forecast['forecast_type'] == "GFS": + sc = ax1.scatter(np.radians(interpolated_directions_deg), interpolated_altitudes, c=interpolated_speeds, cmap='winter', s=2) + ax1.title.set_text("GFS 3D Windrose for (" + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + elif config_earth.forecast['forecast_type'] == "ERA5": + sc = ax1.scatter(np.radians(interpolated_directions_deg), interpolated_altitudes, c=interpolated_speeds, cmap='winter', s=2) + ax1.title.set_text("ERA5 3D Windrose for (" + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + cbar = plt.colorbar(sc, label='Wind Speed (m/s)') + #plt.scatter(np.radians(interpolated_directions_deg), interpolated_altitudes) + + # Set title + fig.suptitle("Wind Interpolation using Wind Speed and Directio Linear Interpolation") + #plt.title('Windmap with Wind Angles Interpolated') + + ''' + def plotWindOLD(self,hour_index,lat,lon, num_interpolations = 100): + + if config_earth.forecast['forecast_type'] == "GFS": + lat_i = self.gfs.getNearestLat(lat, -90, 90.01 ) #I think instead of min max this is because download netcdf downloads the whole world, but many of the spots are empty. + lon_i = self.gfs.getNearestLon(lon, 0, 360 ) + + elif config_earth.forecast['forecast_type'] == "ERA5": + lat_i = self.era5.getNearestLatIdx(lat, self.era5.lat_min_idx, self.era5.lat_max_idx) + lon_i = self.era5.getNearestLonIdx(lon, self.era5.lon_min_idx, self.era5.lon_max_idx) + + + g = 9.80665 # gravitation constant used to convert geopotential height to height + + u = self.ugrdprs[hour_index,:,lat_i,lon_i] + v = self.vgrdprs[hour_index,:,lat_i,lon_i] + h = self.hgtprs[hour_index,:,lat_i,lon_i] + + # Remove missing data + u = u.filled(np.nan) + v = v.filled(np.nan) + nans = ~np.isnan(u) + u= u[nans] + v= v[nans] + h = h[nans] + + #for ERA5, need to reverse all array so h is increasing. + if config_earth.forecast['forecast_type'] == "ERA5": + u = np.flip(u) + v = np.flip(v) + h = np.flip(h) + h = h / g #have to do this for ERA5 + + + # Create interpolated altitudes and corresponding wind data + interpolated_altitudes = [] + interpolated_u = [] + interpolated_v = [] + + for i in range(len(h) - 1): + for j in range(num_interpolations + 1): + alpha = j / num_interpolations + interp_alt = h[i] + alpha * (h[i + 1] - h[i]) + interp_u = np.interp(interp_alt, [h[i], h[i + 1]], [u[i], u[i + 1]]) + interp_v = np.interp(interp_alt, [h[i], h[i + 1]], [v[i], v[i + 1]]) + + interpolated_altitudes.append(interp_alt) + interpolated_u.append(interp_u) + interpolated_v.append(interp_v) + + bearing, r , colors, cmap = self.windVectorToBearing(interpolated_u, interpolated_v, interpolated_altitudes) + #bearing, r , colors, cmap = self.windVectorToBearing(np.full(len(interpolated_altitudes), 3), np.full(len(interpolated_altitudes), 2), interpolated_altitudes) + + + fig = plt.figure(figsize=(8, 8)) + ax = fig.add_subplot(111, projection='polar') + + # Create a scatter plot where radius is altitude, angle is wind direction (in radians), and color represents wind speed + sc = ax.scatter(bearing, colors, c=r, cmap='winter', s=2) + cbar = plt.colorbar(sc, label='Wind Speed (m/s)') + + #plt.scatter(np.radians(interpolated_directions_deg), interpolated_altitudes) + + # Set title + fig.suptitle("Wind Interpolation using OLDDDDDDDD") + #plt.title('Windmap with Wind Angles Interpolated') + ''' + + def plotWindVelocity(self,hour_index,lat,lon, interpolation_frequency = 1): + """ Plots a 3D Windrose for a particular coordinate and timestamp from a downloaded forecast. + + :param hour_index: Time index from forecast file + :type hour_index: int + :param lat: Latitude + :type lat: float + :param lon: Longitude + :type lon: float + :returns: + + """ + + #Should I remove arguments for the function and just use the initialized functions from config? + + + # Find location in data + if config_earth.forecast['forecast_type'] == "GFS": + lat_i = self.gfs.getNearestLat(lat, -90, 90.01 ) #I think instead of min max this is because download netcdf downloads the whole world, but many of the spots are empty. + lon_i = self.gfs.getNearestLon(lon, 0, 360 ) + bearing1, r1 , colors1, cmap1 = self.getWind(hour_index,lat_i,lon_i, interpolation_frequency) + + elif config_earth.forecast['forecast_type'] == "ERA5": + lat_i = self.era5.getNearestLatIdx(lat, self.era5.lat_min_idx, self.era5.lat_max_idx) + lon_i = self.era5.getNearestLonIdx(lon, self.era5.lon_min_idx, self.era5.lon_max_idx) + bearing1, r1 , colors1, cmap1 = self.getWind(hour_index,lat_i,lon_i, interpolation_frequency) + + # Plot figure and legend + fig = plt.figure(figsize=(10, 8)) + fig.suptitle("Wind Interpolation using Spline and U-V wind components") + ax1 = fig.add_subplot(111, projection='polar') + if config_earth.forecast['forecast_type'] == "GFS": + sc2 = ax1.scatter(bearing1, colors1, c=r1, cmap='winter', alpha=0.75, s = 2) + ax1.title.set_text("GFS 3D Windrose for (" + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + elif config_earth.forecast['forecast_type'] == "ERA5": + sc2 = ax1.scatter(bearing1, colors1, c=r1, cmap='winter', alpha=0.75, s = 2) + ax1.title.set_text("ERA5 3D Windrose for (" + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + #ax1.set_xticks([0,9,90,180, 180,270,270,360]) #Fixes the FixedLocator Warning for the line below + ax1.set_xticks(ax1.get_xticks()) + ax1.set_xticklabels(['E', '', 'N', '', 'W', '', 'S', '']) + + plt.colorbar(sc2, ax=ax1, label=" Wind Velocity (m/s)") + + + plt.figure() + plt.plot(self.ugrdprs[hour_index,:,lat_i,lon_i], self.hgtprs[hour_index,:,lat_i,lon_i]) + plt.plot(self.vgrdprs[hour_index,:,lat_i,lon_i], self.hgtprs[hour_index,:,lat_i,lon_i]) + plt.title("U V Wind Plot") + + """ + #Update this + def plotTempAlt(self,hour_index,lat,lon): + if config_earth.forecast['forecast_type'] == "ERA5": + hour_index = 0 #not right, hard_coded for now + + # Find nearest lat/lon in ncdf4 resolution + plt.figure(figsize=(10, 8)) + lat_i = self.getNearestLat(lat) + lon_i = self.getNearestLon(lon) + + # Extract relevant u/v wind velocity, and altitude + T = self.tmpprs[hour_index,:,lat_i,lon_i] + h = self.hgtprs[hour_index,:,lat_i,lon_i] +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 ''' # Forecast data is sparse, so use a cubic spline to add more points @@ -164,11 +598,18 @@ def plotTempAlt(hour_index,lat,lon): # Formatting plt.xlabel("Temperature (K)") plt.ylabel("Altitude (m)") +<<<<<<< HEAD plt.title('Atmospheric Temperature Profile for (' + str(LAT) + ", " + str(LON) + ") on " + str(new_timestamp)) +======= + plt.title('Atmospheric Temperature Profile for (' + str(self.LAT) + ", " + str(self.LON) + ") on " + str(self.new_timestamp)) + + +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972 plt.plot(T,h, label = "GFS Forecast") plt.plot(T_atm,el, label = "ISA Model") plt.legend(loc='upper right') +<<<<<<< HEAD ''' plotWindVelocity(hour_index,LAT,LON) @@ -179,3 +620,18 @@ def plotTempAlt(hour_index,lat,lon): +======= + """ + + def makePlots(self): + print(self.hour_index) + self.plotWindVelocity(self.hour_index,self.LAT,self.LON, interpolation_frequency = 100) + self.plotWind2(self.hour_index,self.LAT,self.LON, num_interpolations = 10) + #self.plotWindOLD(self.hour_index,self.LAT,self.LON, num_interpolations = 100) + wind.file.close() + plt.show() + + +#wind = Windmap() +#wind.makePlots() +>>>>>>> 5651e59f74d16b2dfe91028e73dd951d28aa3972