from datetime import datetime, timedelta # needed to work with time in plotting time series
import cartopy.crs as ccrs
import earthaccess # needed to discover and download TEMPO data
import h5py # needed to read DSCOVR_EPIC_L2_TO3 files
import matplotlib.pyplot as plt # needed to plot the resulting time series
import netCDF4 as nc # needed to read TEMPO data
import numpy as np
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from shapely.geometry import Point, Polygon # needed to search a point within a polygon
from scipy.interpolate import griddata # needed to interpolate TEMPO data to the point of interest
TEMPO UVAI vs DSCOVR (spatial)
Summary
This notebook illustrates a comparison of ultra-violet aerosol index (UVAI) between the Tropospheric Emissions: Monitoring of Pollution (TEMPO) instrument and DSCOVR EPIC UVAI. TEMPO_O3TOT_L2_V03 and DSCOVR_EPIC_L2_AER_03 are the data collections used as sources of UVAI.
TEMPO and DSCOVR granules are downloaded on-the-fly with earthaccess library, which may need to be installed first.
Dataset Information
“DSCOVR_EPIC_L2_AER_03 is the Deep Space Climate Observatory (DSCOVR) Enhanced Polychromatic Imaging Camera (EPIC) Level 2 UV Aerosol Version 3 data product. Observations for this data product are at 340 and 388 nm and are used to derive near UV (ultraviolet) aerosol properties. The EPIC aerosol retrieval algorithm (EPICAERUV) uses a set of aerosol models to account for the presence of carbonaceous aerosols from biomass burning and wildfires (BIO), desert dust (DST), and sulfate-based (SLF) aerosols. These aerosol models are identical to those assumed in the OMI (Ozone Monitoring Instrument) algorithm (Torres et al., 2007; Jethva and Torres, 2011).” (Source)
Total ozone Level 2 files provide ozone information at Tropospheric Emissions: Monitoring of Pollution (TEMPO)’s native spatial resolution, ~10 km^2 at the center of the Field of Regard (FOR), for individual granules. Each granule covers the entire North-South TEMPO FOR but only a portion of the East-West FOR.
Descriptive outline:
- A timeframe of interest is selected by a user.
- Data from DSCOVR EPIC are found within the TEMPO field of regard (FOR) and within user’s timeframe using the
earthaccess
library. - After downloading DSCOVR EPIC granules, a loop of these granules searches for TEMPO granules simultaneous with DSCOVR EPIC one.
- If coincident TEMPO granules exist, DSCOVR EPIC UVAI retrievals are interpolated to the positions of the TEMPO pixels.
- Interpolated values are written into a netCDF file along with TEMPO geolocations.
- Finally, original UVAI data from DSCOVR EPIC and TEMPO are plotted along with interpolated DSCOVR EPIC values in the same plot. Output images are written into PNG files.
Prerequisites
A free(!) account at https://www.earthdata.nasa.gov/ is needed to login and download the appropriate files.
This notebook was last tested using Python 3.10.15, and requires these libraries:
- cartopy
- earthaccess
- [h5py]
- matplotlib
- netCDF4
- numpy
- [shapely]
- [scipy]
1. Setup
2. Define utility functions for DSCOVR and TEMPO data
2.1 Function to read DSCOVR AER data files
Function read_epic_l2_AER
reads a DSCOVR_EPIC_L2_AER product file given by its filename and returns arrays of 2D latitudes, longitudes, UVAI, AOD, and wavelength, along with their fill values and time.
def get_dataset_array_and_fill_value(file_object: h5py.File, dataset_path: str):
= file_object[dataset_path]
h5_dataset return np.array(h5_dataset[:]), h5_dataset.fillvalue
def read_epic_l2_AER(filename: str):
= "/HDFEOS/SWATHS/Aerosol NearUV Swath/Data Fields/FinalAerosolOpticalDepth"
aod_name = "/HDFEOS/SWATHS/Aerosol NearUV Swath/Data Fields/UVAerosolIndex"
uvai_name = "/HDFEOS/SWATHS/Aerosol NearUV Swath/Geolocation Fields/Latitude"
lat_name = "/HDFEOS/SWATHS/Aerosol NearUV Swath/Geolocation Fields/Longitude"
lon_name = "/HDFEOS/SWATHS/Aerosol NearUV Swath/Data Fields/Wavelength"
wl_name
= {}
arrays = {}
fill_values
with h5py.File(filename, "r") as f:
"aod2D"], fill_values["aod"] = get_dataset_array_and_fill_value(f, aod_name)
arrays["uvai2D"], fill_values["uvai"] = get_dataset_array_and_fill_value(f, uvai_name)
arrays["lat2D"], fill_values["lat"] = get_dataset_array_and_fill_value(f, lat_name)
arrays["lon2D"], fill_values["lon"] = get_dataset_array_and_fill_value(f, lon_name)
arrays["wl"], fill_values["wl"] = get_dataset_array_and_fill_value(f, wl_name)
arrays[
# Get time from the granule's filename.
= datetime.strptime(filename.split("_")[-2], "%Y%m%d%H%M%S")
timestamp
return arrays, fill_values, timestamp
2.2 Function to read UV Aerosol Index from TEMPO O3TOT data file
def read_TEMPO_O3TOT_L2_UVAI(filename):
"""Read the following product arrays from the TEMPO_O3TOT_L2_V03(2):
- vertical_column
- vertical_column_uncertainty
and returns the respective fields along with coordinates of the pixels.
"""
= "uv_aerosol_index"
var_name = "quality_flag"
var_QF_name
= {}
arrays = {}
fill_values
with nc.Dataset(filename) as ds:
# Open the product group (/product), read the chosen UVAI variable and its quality flag.
= ds.groups["product"]
prod "uvai"] = prod.variables[var_name][:]
arrays["uvai"] = prod.variables[var_name].getncattr("_FillValue")
fill_values[= prod.variables[var_QF_name]
var_QF "uvai_QF"] = var_QF[:]
arrays[# Note: there is no fill value for the quality flag.
# Once it is available in the next version of the product,
# uncomment the line below and add fv_QF to the return line.
# fv_QF = var_QF.getncattr('_FillValue'
# Open geolocation group (/geolocation), and
# read the latitude and longitude variables into a numpy array.
= ds.groups["geolocation"]
geo "lat"] = geo.variables["latitude"][:]
arrays["lon"] = geo.variables["longitude"][:]
arrays["geo"] = geo.variables["latitude"].getncattr("_FillValue")
fill_values[# Note: it appeared that garbage values of latitudes and longitudes in the L2 files
# are 9.969209968386869E36 while fill value is -1.2676506E30
# (after deeper search, it was found that the actual value in the file is -1.2676506002282294E30).
# For this reason, fv_geo is set to 9.96921E36 to make the code working.
# Once the problem is resolved and garbage values of latitudes and longitudes
# equal to their fill value, the line below must be removed.
"geo"] = 9.969209968386869e3
fill_values[
# Read the time variable from the geolocation group into a numpy array.
"time"] = geo.variables["time"][:]
arrays[
return arrays, fill_values
2.3 Function to create TEMPO O3 granule polygon
def TEMPO_L2_polygon(lat, lon, geo_fillvalue):
= lon.shape
nx, ny print(f"granule has {nx: >3} scanlines by {ny: >4} pixels")
= np.empty([0, 2])
dpos
# Create arrays for x and y indices.
= np.arange(nx).reshape(-1, 1)
x_indices = np.arange(ny).reshape(1, -1)
y_indices = np.repeat(x_indices, ny, axis=1)
x_index_array = np.repeat(y_indices, nx, axis=0)
y_index_array
= (lon[nx - 1, ny - 1] != geo_fillvalue) & (lat[nx - 1, ny - 1] != geo_fillvalue)
mask if len(lon[mask]) == 0:
print("the granule is empty - no meaningful positions")
return dpos
def get_local_mask(row_index):
return (lon[row_index, :] != geo_fillvalue) & (lat[row_index, :] != geo_fillvalue)
# Right boundary.
= np.min(x_index_array[mask])
right_min_index = get_local_mask(right_min_index)
local_mask = np.stack(
right_boundary
(lon[right_min_index, local_mask], lat[right_min_index, local_mask])
).T
# Left boundary.
= np.max(x_index_array[mask])
left_max_index = get_local_mask(left_max_index)
local_mask = np.stack((lon[left_max_index, local_mask], lat[left_max_index, local_mask])).T
left_boundary
# Top and bottom boundaries.
= np.empty([0, 2])
top_boundary = np.empty([0, 2])
bot_boundary for ix in range(right_min_index + 1, left_max_index):
= get_local_mask(ix)
local_mask = y_index_array[ix, local_mask]
local_y_ind = min(local_y_ind)
y_ind_top = max(local_y_ind)
y_ind_bottom = np.append(top_boundary, [[lon[ix, y_ind_top], lat[ix, y_ind_top]]], axis=0)
top_boundary = np.append(
bot_boundary =0
bot_boundary, [[lon[ix, y_ind_bottom], lat[ix, y_ind_bottom]]], axis
)
# Combine right, top, left, and bottom boundaries, going along the combined boundary counterclockwise.
= np.append(dpos, right_boundary[::-1, :], axis=0)
dpos = np.append(dpos, top_boundary, axis=0)
dpos = np.append(dpos, left_boundary, axis=0)
dpos = np.append(dpos, bot_boundary[::-1, :], axis=0)
dpos
print("polygon shape: ", dpos.shape)
= list(dpos)
coords_poly = Polygon(coords_poly)
poly
return poly
2.4 Function to write DSCOVR EPIC UV Aerosol Index re-mapped to TEMPO granule locations
def write_DSCOVR_TEMPO_UVAI(filename, lat2D, lon2D, uvai2D):
"""Create a netCDF file. Return True if successful, otherwise return False.
variables:
filename: TEMPO file name, which will be used to create output file name
lat2D: 2D array of TEMPO latitudes
lon2D: 2D array of TEMPO longitudes
uvai2D: 2D array of DSCOVR EPIC UVAI re-mapped to TEMPO locations
Arrays above should be of the same shape.
"""
= lat2D.shape
(nx, ny)
with nc.Dataset("DSCOVR_UVAI_" + filename, mode="w", format="NETCDF4_CLASSIC") as ncf:
= ncf.createDimension("mirror_step", nx) # number of scanlines
_ = ncf.createDimension("xtrack", ny) # number of pixels in a scanline
_
= ncf.createVariable("lat", np.float32, ("mirror_step", "xtrack"))
lat = "degrees_north"
lat.units = "latitude"
lat.long_name = lat2D
lat[:, :]
= ncf.createVariable("lon", np.float32, ("mirror_step", "xtrack"))
lon = "degrees_east"
lon.units = "longitude"
lon.long_name = lon2D
lon[:, :]
= ncf.createVariable(
uv_aerosol_index "uv_aerosol_index", np.float32, ("mirror_step", "xtrack")
)= uvai2D uv_aerosol_index[:, :]
2.5 Function to find TEMPO granules that match time of DSCOVR granule
# Setting TEMPO name constants
= "TEMPO_O3TOT_L2" # collection name to search for in the EarthData
tempo_short_name = "V03" # this is the latest available version as of August 02, 2024
tempo_version
def get_TEMPO_results_to_match_DSCOVR_granule(dscovr_timestamp):
"""Return results for TEMPO. If none found, return None.
It was discovered that the actual timespan of an EPIC granule begins 289 s before
the granule timestamp and ends 107 s after it.
This timeframe will be used for searching TEMPO granules.
"""
= dscovr_timestamp + timedelta(seconds=-289)
timestamp1 = dscovr_timestamp + timedelta(seconds=107)
timestamp2 print(dscovr_timestamp, timestamp1, timestamp2)
# Try twice.
for attempt in range(2):
try:
= earthaccess.search_data(
results =tempo_short_name,
short_name=tempo_version,
version=(timestamp1, timestamp2),
temporal
)
if len(results) > 0:
print(
f"Total number of TEMPO version {tempo_version} granules found"
f"\nwithin period of interest between {timestamp1} and {timestamp2}"
f" is {len(results)}"
)return results
else:
break
except Exception:
continue
print(
f"Zero TEMPO version {tempo_version} granules found"
f"\nwithin period of interest between {timestamp1} and {timestamp2}"
)return None
2.6 Function to find ‘good’ TEMPO data points
def get_good_tempo_points(lat, lon, geo_fillvalue, uvai, uvai_fillvalue):
# Mask out fill values of TEMPO lat/lon positions.
= (lat != geo_fillvalue) & (lon != geo_fillvalue) & (uvai != uvai_fillvalue)
mask = lon[mask]
lon1D = lat[mask]
lat1D = np.column_stack((lon1D, lat1D))
lonlat_stacked = uvai[mask]
uvai1D = (min(lon1D), max(lon1D), min(lat1D), max(lat1D))
extent
# Create arrays of indices to restore TEMPO 2D arrays after re-mapping.
= lat.shape
nx, ny = np.tile(np.linspace(0, ny, ny, endpoint=False, dtype=int), (nx, 1))
y_index_array = np.tile(np.linspace(0, nx, nx, endpoint=False, dtype=int), (ny, 1)).transpose()
x_index_array = x_index_array[mask]
x_indices_masked = y_index_array[mask]
y_indices_masked print(f"nx, ny = {nx}, {ny}")
# Restore 2D arrays by filling over a fill value.
= np.full((nx, ny), -999.0)
lat2D = np.full((nx, ny), -999.0)
lon2D = np.full((nx, ny), -999.0)
uvai2D
for ix, iy, lon1, lat1, uvai1 in zip(x_indices_masked, y_indices_masked, lon1D, lat1D, uvai1D):
= lat1
lat2D[ix, iy] = lon1
lon2D[ix, iy] = uvai1
uvai2D[ix, iy]
# Write restored 2D arrays to a netCDF file.
try:
write_DSCOVR_TEMPO_UVAI(tempo_file_name, lat2D, lon2D, uvai2D)except Exception:
print("failed to write restored TEMPO 2D arrays into the output file")
return lonlat_stacked, extent, lon1D, lat1D, uvai1D
2.7 Function to determine DSCOVR data points within the domain of TEMPO data
def mask_dscovr_to_tempo(
lat2D, lon2D, uvai2D, uvai_fillvalue, tempo_extent, tempo_polygon-> dict | None:
) # Mask out DSCOVR UVAI to the geospatial extent of TEMPO granule.
= (
mask != uvai_fillvalue)
(uvai2D & (lat2D > tempo_extent[2])
& (lat2D < tempo_extent[3])
& (lon2D > tempo_extent[0])
& (lon2D < tempo_extent[1])
)= lon2D[mask]
lon1D = lat2D[mask]
lat1D = uvai2D[mask]
uvai1D
# Number of DSCOVR pixels falling into ranges min_TEMPO_lat < lat2D < max_TEMPO_lat, min_TEMPO_lon < lat2D < max_TEMPO_lon.
= len(uvai1D)
n_DSCOVR_TEMPO if n_DSCOVR_TEMPO == 0:
print("no original DSCOVR pixels within TEMPO granule")
return None
= np.empty(n_DSCOVR_TEMPO, dtype=np.bool_)
mask_DSCOVR_in_TEMPO for i in range(n_DSCOVR_TEMPO):
= Point(np.array([lon1D[i], lat1D[i]]))
dscovr_point = dscovr_point.within(tempo_polygon)
mask_DSCOVR_in_TEMPO[i]
= lon1D[mask_DSCOVR_in_TEMPO]
lon1D_DSCOVR_TEMPO = lat1D[mask_DSCOVR_in_TEMPO]
lat1D_DSCOVR_TEMPO = uvai1D[mask_DSCOVR_in_TEMPO]
uvai1D_DSCOVR_TEMPO
return {
"lon1D": lon1D_DSCOVR_TEMPO,
"lat1D": lat1D_DSCOVR_TEMPO,
"uvai1D": uvai1D_DSCOVR_TEMPO,
"mask": mask_DSCOVR_in_TEMPO,
}
3. Establish access to EarthData - Log in
Function earthaccess.login
prompts for EarthData login and password.
= earthaccess.login(strategy="interactive", persist=True) auth
4. Select timeframe of interest
DSCOVR EPIC granules will be searched within this timeframe.
For the tutorial demonstration, 20230805
was used for both the start and end date.
print("enter period of interest, start and end dates, in the form YYYYMMDD")
= input("enter start date of interest ")
datestamp_initial = input("enter end date of interest ")
datestamp_final
= datetime.strptime(datestamp_initial + "00:00:00", "%Y%m%d%H:%M:%S").strftime(
date_start "%Y-%m-%d %H:%M:%S"
)= datetime.strptime(datestamp_final + "23:59:59", "%Y%m%d%H:%M:%S").strftime(
date_end "%Y-%m-%d %H:%M:%S"
)
print(date_start, date_end)
enter period of interest, start and end dates, in the form YYYYMMDD
enter start date of interest 20230805
enter end date of interest 20230805
2023-08-05 00:00:00 2023-08-05 23:59:59
enter start date of interest 20230805
enter end date of interest 20230805
2023 8 5 2023 8 5
5. Retrieve DSCOVR EPIC granules
We search for DSCOVR EPIC granules that fall within the time of interest and within the TEMPO Field of Regard (FOR) polygon.
= "DSCOVR_EPIC_L2_AER" # collection name to search for in the EarthData
short_name
# The polygon below is taken from MMT description of TEMPO_O3TOT_L2,
# see https://mmt.earthdata.nasa.gov/collections/C2842849465-LARC_CLOUD
# Polygon: (10.0°, -170.0°), (10.0°, -10.0°), (80.0°, -10.0°), (80.0°, -170.0°), (10.0°, -170.0°)
= (-170.0, 10.0, -10.0, 80.0)
bbox
= earthaccess.search_data(
FOR_results_EPIC =short_name, temporal=(date_start, date_end), bounding_box=bbox
short_name
)
print(
f"Total number of DSCOVR EPIC L2_AER granules found for TEMPO Field of Regard"
f"\nwithin period of interest between {date_start} and {date_end} is {len(FOR_results_EPIC)}"
)
Total number of DSCOVR EPIC L2_AER granules found for TEMPO Field of Regard
within period of interest between 2023-08-05 00:00:00 and 2023-08-05 23:59:59 is 21
5.1. Ensure all discovered granules have download links
Without this step, missing granules can crash the call of earthaccess.download()
.
def get_url_value_from_result(earthaccess_result):
"""Return a tuple of the result itself and the data URL, only if the URL field is accessible."""
try:
return earthaccess_result, earthaccess_result["umm"]["RelatedUrls"][0]["URL"]
except Exception:
return None
# Populate the list of results that have links.
= [
good_EPIC_result_links
get_url_value_from_result(result)for result in FOR_results_EPIC
if get_url_value_from_result(result) is not None
]
# Show the result links
for r in sorted(good_EPIC_result_links, key=lambda x: x[1]):
print(r[1])
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805004554_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805015122_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805025649_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805040216_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805050743_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805071838_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805082405_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805092932_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805103500_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805114028_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805124555_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805135123_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805145650_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805160217_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805170745_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805181312_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805191839_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805202406_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805212934_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805223501_03.he5
https://asdc.larc.nasa.gov/data/DSCOVR/EPIC/L2_AER_03/2023/08/DSCOVR_EPIC_L2_AER_03_20230805234028_03.he5
5.2. Download DSCOVR EPIC granules
This next cell will likely take awhile.
= earthaccess.download(FOR_results_EPIC, local_path=".") downloaded_files
6. For every DSCOVR EPIC granule, find simultaneous TEMPO granules and re-map DSCOVR EPIC data to geolocations of TEMPO
Cycle through the DSCOVR EPIC granules.
Write re-mapped DSCOVR EPIC UVAI to a netCDF file, and plot the original DSCOVR EPIC and TEMPO along with re-mapped DSCOVR EPIC UVAI.
This next cell takes a long time to run.
for epic_granule_link in sorted(good_EPIC_result_links, key=lambda x: x[1]):
= epic_granule_link[1][epic_granule_link[1].rfind("/") + 1 :]
dscovr_file_name print(dscovr_file_name)
# Read the EPIC Level-2 Aerosol data.
try:
= read_epic_l2_AER(dscovr_file_name)
dscovr, dscovr_fv, dscovr_timestamp except Exception:
print(f"Unable to find or read hdf5 input granule file {dscovr_file_name}")
continue
# Search for and download TEMPO data that align with the times of the DSCOVR granule.
= get_TEMPO_results_to_match_DSCOVR_granule(dscovr_timestamp)
tempo_results if tempo_results is None:
continue # if no TEMPO granules found within the DSCOVR EPIC timeframe, go to the next EPIC granule
else:
= earthaccess.download(tempo_results, local_path=".")
downloaded_files
# Generate mask from DSCOVR fill values.
= (
mask "lat2D"] != dscovr_fv["lat"])
(dscovr[& (dscovr["lon2D"] != dscovr_fv["lon"])
& (dscovr["uvai2D"] != dscovr_fv["uvai"])
)= np.column_stack((dscovr["lon2D"][mask], dscovr["lat2D"][mask]))
dscovr_good_latlon = dscovr["uvai2D"][mask]
dscovr_good_uvai2D
for tempo_result in tempo_results:
= tempo_result.data_links()
tempo_granule_links = tempo_granule_links[0][tempo_granule_links[0].rfind("/") + 1 :]
tempo_file_name
# Read the TEMPO data.
try:
= read_TEMPO_O3TOT_L2_UVAI(tempo_file_name)
tempo, tempo_fv except Exception:
print(f"TEMPO UVAI cannot be read in file {tempo_file_name}")
continue
# Generate a polygon representing the boundaries of the TEMPO data.
= TEMPO_L2_polygon(tempo["lat"], tempo["lon"], tempo_fv["geo"])
tempo_polygon
# Get positions from TEMPO
= (
tempo_good_lonlat, tempo_extent, lon1D_TEMPO, lat1D_TEMPO, uvai1D_TEMPO
get_good_tempo_points("lat"], tempo["lon"], tempo_fv["geo"], tempo["uvai"], tempo_fv["uvai"]
tempo[
)
)
# Interpolate DSCOVR data to the TEMPO data locations.
= griddata(
DSCOVR_uvai_at_tempo_points
dscovr_good_latlon,
dscovr_good_uvai2D,
tempo_good_lonlat,="linear",
method=-999.0,
fill_value=False,
rescale
)
# Determine where the interpolated values fall within the valid range.
= (DSCOVR_uvai_at_tempo_points > -30) & (DSCOVR_uvai_at_tempo_points < 30)
valid_mask if len(DSCOVR_uvai_at_tempo_points[valid_mask]) == 0:
print("no re-mapped DSCOVR pixels within TEMPO granule")
continue
= tempo_good_lonlat[valid_mask, 0]
tempo_valid_lon = tempo_good_lonlat[valid_mask, 1]
tempo_valid_lat = DSCOVR_uvai_at_tempo_points[valid_mask]
DSCOVR_uvai_at_tempo_points_valid
# Find where DSCOVR data fall within the boundaries of the TEMPO data.
= mask_dscovr_to_tempo(
dscovr_in_tempo_polygon "lat2D"],
dscovr["lon2D"],
dscovr["uvai2D"],
dscovr["uvai"],
dscovr_fv[
tempo_extent,
tempo_polygon,
)if dscovr_in_tempo_polygon is None:
continue # if no original DSCOVR pixels within TEMPO granule, then go to the next EPIC granule
# Plot comparisons of TEMPO and DSCOVR EPIC UVAI
= ccrs.LambertConformal(
proj =(tempo_extent[0] + tempo_extent[1]) * 0.5, # -96.0
central_longitude=39.0,
central_latitude=0.0,
false_easting=0.0,
false_northing=(33, 45),
standard_parallels=None,
globe=10,
cutoff
)= ccrs.PlateCarree()
transform
= plt.subplots(
fig, axes 1, 3, figsize=(20, 9), dpi=300, facecolor=None, subplot_kw={"projection": proj}
)
for ax in axes:
=transform)
ax.set_extent(tempo_extent, crs="50m", color="black", linewidth=1)
ax.coastlines(resolution= ax.gridlines(draw_labels=True, dms=True)
grid = LONGITUDE_FORMATTER
grid.xformatter = LATITUDE_FORMATTER
grid.yformatter
= dict(s=1, cmap="jet", vmin=-4.0, vmax=4.0, transform=transform)
plot_kwargs
# Axis 1
= axes[0].scatter(
im "lon1D"],
dscovr_in_tempo_polygon["lat1D"],
dscovr_in_tempo_polygon[=dscovr_in_tempo_polygon["uvai1D"],
c**plot_kwargs,
)= plt.colorbar(im, ticks=[-4, -2, 0, 2, 4], fraction=0.022, pad=0.01)
cb "UVAI", fontsize=10)
cb.set_label(0].set_title("UVAI " + dscovr_file_name, size=10)
axes[
# Axis 2
= axes[1].scatter(lon1D_TEMPO, lat1D_TEMPO, c=uvai1D_TEMPO, **plot_kwargs)
im = plt.colorbar(im, ticks=[-4, -2, 0, 2, 4], fraction=0.022, pad=0.01)
cb "UVAI", fontsize=10)
cb.set_label(1].set_title("UVAI " + tempo_file_name, size=10)
axes[
# Axis 3
= axes[2].scatter(
im =DSCOVR_uvai_at_tempo_points_valid, **plot_kwargs
tempo_valid_lon, tempo_valid_lat, c
)= plt.colorbar(im, ticks=[-4, -2, 0, 2, 4], fraction=0.022, pad=0.01)
cb "UVAI", fontsize=10)
cb.set_label(2].set_title("DSCOVR EPIC UVAI re-mapped", size=10)
axes[
"UVAI_" + tempo_file_name + ".png", dpi=300)
plt.savefig( plt.close()
DSCOVR_EPIC_L2_AER_03_20230805004554_03.he5
2023-08-05 00:45:54 2023-08-05 00:41:05 2023-08-05 00:47:41
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 00:41:05 and 2023-08-05 00:47:41
DSCOVR_EPIC_L2_AER_03_20230805015122_03.he5
2023-08-05 01:51:22 2023-08-05 01:46:33 2023-08-05 01:53:09
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 01:46:33 and 2023-08-05 01:53:09
DSCOVR_EPIC_L2_AER_03_20230805025649_03.he5
2023-08-05 02:56:49 2023-08-05 02:52:00 2023-08-05 02:58:36
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 02:52:00 and 2023-08-05 02:58:36
DSCOVR_EPIC_L2_AER_03_20230805040216_03.he5
2023-08-05 04:02:16 2023-08-05 03:57:27 2023-08-05 04:04:03
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 03:57:27 and 2023-08-05 04:04:03
DSCOVR_EPIC_L2_AER_03_20230805050743_03.he5
2023-08-05 05:07:43 2023-08-05 05:02:54 2023-08-05 05:09:30
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 05:02:54 and 2023-08-05 05:09:30
DSCOVR_EPIC_L2_AER_03_20230805071838_03.he5
2023-08-05 07:18:38 2023-08-05 07:13:49 2023-08-05 07:20:25
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 07:13:49 and 2023-08-05 07:20:25
DSCOVR_EPIC_L2_AER_03_20230805082405_03.he5
2023-08-05 08:24:05 2023-08-05 08:19:16 2023-08-05 08:25:52
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 08:19:16 and 2023-08-05 08:25:52
DSCOVR_EPIC_L2_AER_03_20230805092932_03.he5
2023-08-05 09:29:32 2023-08-05 09:24:43 2023-08-05 09:31:19
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 09:24:43 and 2023-08-05 09:31:19
DSCOVR_EPIC_L2_AER_03_20230805103500_03.he5
2023-08-05 10:35:00 2023-08-05 10:30:11 2023-08-05 10:36:47
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 10:30:11 and 2023-08-05 10:36:47
DSCOVR_EPIC_L2_AER_03_20230805114028_03.he5
2023-08-05 11:40:28 2023-08-05 11:35:39 2023-08-05 11:42:15
Zero TEMPO version V03 granules found
within period of interest between 2023-08-05 11:35:39 and 2023-08-05 11:42:15
DSCOVR_EPIC_L2_AER_03_20230805124555_03.he5
2023-08-05 12:45:55 2023-08-05 12:41:06 2023-08-05 12:47:42
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 12:41:06 and 2023-08-05 12:47:42 is 2
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805135123_03.he5
2023-08-05 13:51:23 2023-08-05 13:46:34 2023-08-05 13:53:10
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 13:46:34 and 2023-08-05 13:53:10 is 2
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805145650_03.he5
2023-08-05 14:56:50 2023-08-05 14:52:01 2023-08-05 14:58:37
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 14:52:01 and 2023-08-05 14:58:37 is 2
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805160217_03.he5
2023-08-05 16:02:17 2023-08-05 15:57:28 2023-08-05 16:04:04
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 15:57:28 and 2023-08-05 16:04:04 is 2
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805170745_03.he5
2023-08-05 17:07:45 2023-08-05 17:02:56 2023-08-05 17:09:32
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 17:02:56 and 2023-08-05 17:09:32 is 2
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805181312_03.he5
2023-08-05 18:13:12 2023-08-05 18:08:23 2023-08-05 18:14:59
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 18:08:23 and 2023-08-05 18:14:59 is 3
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805191839_03.he5
2023-08-05 19:18:39 2023-08-05 19:13:50 2023-08-05 19:20:26
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 19:13:50 and 2023-08-05 19:20:26 is 2
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805202406_03.he5
2023-08-05 20:24:06 2023-08-05 20:19:17 2023-08-05 20:25:53
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 20:19:17 and 2023-08-05 20:25:53 is 3
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/numpy/lib/_function_base_impl.py:5711: UserWarning: Warning: converting a masked element to nan.
return concatenate((arr, values), axis=axis)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:24: UserWarning: Warning: converting a masked element to nan.
lat2D[ix, iy] = lat1
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:25: UserWarning: Warning: converting a masked element to nan.
lon2D[ix, iy] = lon1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805212934_03.he5
2023-08-05 21:29:34 2023-08-05 21:24:45 2023-08-05 21:31:21
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 21:24:45 and 2023-08-05 21:31:21 is 2
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/numpy/lib/_function_base_impl.py:5711: UserWarning: Warning: converting a masked element to nan.
return concatenate((arr, values), axis=axis)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:24: UserWarning: Warning: converting a masked element to nan.
lat2D[ix, iy] = lat1
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:25: UserWarning: Warning: converting a masked element to nan.
lon2D[ix, iy] = lon1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805223501_03.he5
2023-08-05 22:35:01 2023-08-05 22:30:12 2023-08-05 22:36:48
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 22:30:12 and 2023-08-05 22:36:48 is 2
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/numpy/lib/_function_base_impl.py:5711: UserWarning: Warning: converting a masked element to nan.
return concatenate((arr, values), axis=axis)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:24: UserWarning: Warning: converting a masked element to nan.
lat2D[ix, iy] = lat1
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:25: UserWarning: Warning: converting a masked element to nan.
lon2D[ix, iy] = lon1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
DSCOVR_EPIC_L2_AER_03_20230805234028_03.he5
2023-08-05 23:40:28 2023-08-05 23:35:39 2023-08-05 23:42:15
Total number of TEMPO version V03 granules found
within period of interest between 2023-08-05 23:35:39 and 2023-08-05 23:42:15 is 1
granule has 123 scanlines by 2048 pixels
polygon shape: (4338, 2)
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/numpy/lib/_function_base_impl.py:5711: UserWarning: Warning: converting a masked element to nan.
return concatenate((arr, values), axis=axis)
nx, ny = 123, 2048
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:26: UserWarning: Warning: converting a masked element to nan.
uvai2D[ix, iy] = uvai1
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:24: UserWarning: Warning: converting a masked element to nan.
lat2D[ix, iy] = lat1
/var/folders/m6/n4zwmdm91l52f9d9_sj49zy00000gp/T/ipykernel_22277/3761221750.py:25: UserWarning: Warning: converting a masked element to nan.
lon2D[ix, iy] = lon1
/opt/homebrew/Caskroom/miniconda/base/envs/asdc-github-dev/lib/python3.10/site-packages/matplotlib/cbook.py:1719: UserWarning: Warning: converting a masked element to nan.
return math.isfinite(val)
An example output image from running the above: