Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
'''
try:
from pyorbital import astronomy
except ImportError:
LOG.warning("Could not load pyorbital.astronomy")
return None
if lons is None or lats is None:
# Read coordinates
lons, lats = self.area.get_lonlats()
# Calculate Sun zenith angles and the cosine
zen_angles = astronomy.sun_zenith_angle(time_slot,
lons, lats)
cos_zen = astronomy.cos_zen(time_slot, lons, lats)
# Copy the channel
new_ch = copy.deepcopy(self)
# Update the name
if name is None:
new_ch.name += '_SZC'
else:
new_ch.name = name
if mode == 'cos':
# Cosine correction
lim_y, lim_x = np.where(zen_angles < limit)
new_ch.data[lim_y, lim_x] /= cos_zen[lim_y, lim_x]
# Use constant value (the limit) for larger zenith
# angles
lim_y, lim_x = np.where(zen_angles >= limit)
try:
from pyorbital import astronomy
except ImportError:
LOG.warning("Could not load pyorbital.astronomy")
return None
if lonlats is None or len(lonlats) != 2:
# Read coordinates
LOG.debug("No valid coordinates given, reading from the "
"channel data")
lons, lats = self.area.get_lonlats()
else:
lons, lats = lonlats
# Calculate Sun zenith angles and the cosine
cos_zen = astronomy.cos_zen(time_slot, lons, lats)
# Copy the channel
new_ch = copy.deepcopy(self)
# Set the name
new_ch.name += '_SZC'
if mode == 'cos':
new_ch.data = mpop.tools.sunzen_corr_cos(new_ch.data,
cos_zen, limit=limit)
else:
# Placeholder for other correction methods
pass
# Add information about the corrected version to original
# channel
try:
from pyorbital import astronomy
except ImportError:
LOG.warning("Could not load pyorbital.astronomy")
return None
if lonlats is None or len(lonlats) != 2:
# Read coordinates
LOG.debug("No valid coordinates given, reading from the "
"channel data")
lons, lats = self.area.get_lonlats()
else:
lons, lats = lonlats
# Calculate Sun zenith angles and the cosine
cos_zen = astronomy.cos_zen(time_slot, lons, lats)
# Copy the channel
new_ch = copy.deepcopy(self)
# Set the name
new_ch.name += '_SZC'
if mode == 'cos':
new_ch.data = satpy.tools.sunzen_corr_cos(new_ch.data,
cos_zen, limit=limit)
else:
# Placeholder for other correction methods
pass
# Add information about the corrected version to original
# channel
if hasattr(vis.attrs["area"], 'name'):
area_name = vis.attrs["area"].name
else:
area_name = 'swath' + str(vis.shape)
key = (vis.attrs["start_time"], area_name)
tic = time.time()
LOG.debug("Applying sun zen correction")
if len(projectables) == 1:
coszen = self.coszen.get(key)
if coszen is None:
from pyorbital.astronomy import cos_zen
LOG.debug("Computing sun zenith angles.")
lons, lats = vis.attrs["area"].get_lonlats_dask(CHUNK_SIZE)
coszen = xr.DataArray(cos_zen(vis.attrs["start_time"],
lons, lats),
dims=['y', 'x'],
coords=[vis['y'], vis['x']])
coszen = coszen.where((coszen > 0.035) & (coszen < 1))
self.coszen[key] = coszen
else:
coszen = np.cos(np.deg2rad(projectables[1]))
self.coszen[key] = coszen
if vis.shape != coszen.shape:
# assume we were given lower resolution szen data than band data
LOG.debug(
"Interpolating coszen calculations for higher resolution band")
factor = int(vis.shape[1] / coszen.shape[1])
coszen = np.repeat(
np.repeat(coszen, factor, axis=0), factor, axis=1)
area_name = hash(vis.attrs['area'])
key = (vis.attrs["start_time"], area_name)
tic = time.time()
LOG.debug("Applying sun zen correction")
coszen = self.coszen.get(key)
if coszen is None and len(projectables) == 1:
# we were not given SZA, generate SZA then calculate cos(SZA)
from pyorbital.astronomy import cos_zen
LOG.debug("Computing sun zenith angles.")
lons, lats = vis.attrs["area"].get_lonlats(chunks=CHUNK_SIZE)
coords = {}
if 'y' in vis.coords and 'x' in vis.coords:
coords['y'] = vis['y']
coords['x'] = vis['x']
coszen = xr.DataArray(cos_zen(vis.attrs["start_time"], lons, lats),
dims=['y', 'x'], coords=coords)
if self.max_sza is not None:
coszen = coszen.where(coszen >= self.max_sza_cos)
self.coszen[key] = coszen
elif coszen is None:
# we were given the SZA, calculate the cos(SZA)
coszen = np.cos(np.deg2rad(projectables[1]))
self.coszen[key] = coszen
proj = self._apply_correction(vis, coszen)
proj.attrs = vis.attrs.copy()
self.apply_modifier_info(vis, proj)
LOG.debug("Sun-zenith correction applied. Computation time: %5.1f (sec)", time.time() - tic)
return proj