Skip to content
Commits on Source (5)
## Version v0.9.4 (2019/12/30)
### Pull Requests Merged
#### Bugs fixed
* [PR 99](https://github.com/pytroll/pyspectral/pull/99) - Fix Read The Doc pages - does not build at the moment
#### Features added
* [PR 97](https://github.com/pytroll/pyspectral/pull/97) - Fix NIR computations to be more lenient towards dask arrays
#### Documentation changes
* [PR 99](https://github.com/pytroll/pyspectral/pull/99) - Fix Read The Doc pages - does not build at the moment
In this release 3 pull requests were closed.
## Version v0.9.3 (2019/12/06)
### Issues Closed
......
pyspectral (0.9.4+ds-1) unstable; urgency=medium
* New upstream release.
* Refresh all patches.
-- Antonio Valentino <antonio.valentino@tiscali.it> Tue, 31 Dec 2019 07:23:03 +0000
pyspectral (0.9.3+ds-1) unstable; urgency=medium
* New upstream release.
......
......@@ -3,23 +3,9 @@ Date: Sat, 7 Dec 2019 09:16:27 +0100
Subject: No setuptools-scm
---
doc/conf.py | 2 +-
setup.cfg | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
setup.cfg | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/doc/conf.py b/doc/conf.py
index b3ba906..a69b601 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -39,7 +39,7 @@ sys.path.insert(0, os.path.abspath('../pyspectral'))
# |version| and |release|, also used in various other places throughout the
# built documents.
#
-release = get_distribution('satpy').version
+release = get_distribution('pyspectral').version
# for example take major/minor
version = '.'.join(release.split('.')[:2])
diff --git a/setup.cfg b/setup.cfg
index 0628c31..94e5892 100644
--- a/setup.cfg
......
......@@ -17,17 +17,8 @@ from pkg_resources import get_distribution
# PYTHONPATH = docs/source
DOC_SOURCES_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_ROOT_DIR = os.path.dirname(DOC_SOURCES_DIR)
sys.path.insert(0, DOC_SOURCES_DIR)
# If runs on ReadTheDocs environment
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
# Hack for lacking git-lfs support ReadTheDocs
if on_rtd:
# print('Fetching files with git_lfs')
from git_lfs import fetch
fetch(PROJECT_ROOT_DIR)
# 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
......@@ -39,7 +30,7 @@ sys.path.insert(0, os.path.abspath('../pyspectral'))
# |version| and |release|, also used in various other places throughout the
# built documents.
#
release = get_distribution('satpy').version
release = get_distribution('pyspectral').version
# for example take major/minor
version = '.'.join(release.split('.')[:2])
......
......@@ -27,7 +27,7 @@ The source code can be found on the github_ page.
With PySpectral and SatPy_ (or previously mpop_) it is possible to make RGB colour
composites like the SEVIRI `day solar`_ or the `day microphysical`_ RGB
composites according to the `MSG Interpretation Guide`_ (EUMETSAT_). Also with
SatPy_ (and mpop_) integration it is possible to make atmosphere corrected true
SatPy_ integration it is possible to make atmosphere corrected true
color imagery.
.. _`EUMETSAT`: http://www.eumetsat.int/
......
......@@ -35,7 +35,7 @@ in the figure below:
:scale: 70%
:align: center
The method is descriped in detail in a scientific paper_.
The method is descriped in detail in a `scientific paper`_.
To apply the atmospheric correction for a given satellite sensor band, the
procedure involves the following three steps:
......@@ -113,6 +113,6 @@ if you want another setup, e.g.:
.. _Satpy: http://www.github.com/pytroll/satpy
.. _zenodo: https://doi.org/10.5281/zenodo.1288441
.. _paper: https://doi.org/10.3390/rs10040560
.. _`scientific paper`: https://doi.org/10.3390/rs10040560
......@@ -32,9 +32,9 @@ window channel (usually around 11-12 microns).
import os
import numpy as np
try:
from dask.array import where, logical_or
from dask.array import where, logical_or, asanyarray, array
except ImportError:
from numpy import where, logical_or
from numpy import where, logical_or, asanyarray, array
from pyspectral.solar import (SolarIrradianceSpectrum,
TOTAL_IRRADIANCE_SPECTRUM_2000ASTM)
......@@ -216,14 +216,14 @@ class Calculator(RadTbConverter):
is_masked = False
if np.isscalar(tb_near_ir):
tb_nir = np.array([tb_near_ir, ])
tb_nir = array([tb_near_ir, ])
else:
tb_nir = np.asanyarray(tb_near_ir)
tb_nir = asanyarray(tb_near_ir)
if np.isscalar(tb_thermal):
tb_therm = np.array([tb_thermal, ])
tb_therm = array([tb_thermal, ])
else:
tb_therm = np.asanyarray(tb_thermal)
tb_therm = asanyarray(tb_thermal)
if tb_therm.shape != tb_nir.shape:
errmsg = 'Dimensions do not match! {0} and {1}'.format(
......@@ -239,9 +239,9 @@ class Calculator(RadTbConverter):
else:
co2corr = True
if np.isscalar(tb_ir_co2):
tbco2 = np.array([tb_ir_co2, ])
tbco2 = array([tb_ir_co2, ])
else:
tbco2 = np.asanyarray(tb_ir_co2)
tbco2 = asanyarray(tb_ir_co2)
if not self.rsr:
raise NotImplementedError("Reflectance calculations without "
......@@ -260,7 +260,7 @@ class Calculator(RadTbConverter):
LOG.info('l_nir = %s', str(l_nir))
sunzmask = (sun_zenith < 0.0) | (sun_zenith > 88.0)
sunz = where(sunzmask, 88.0, sun_zenith)
sunz = sun_zenith.clip(0, 88.0)
mu0 = np.cos(np.deg2rad(sunz))
# mu0 = np.where(np.less(mu0, 0.1), 0.1, mu0)
......@@ -275,11 +275,11 @@ class Calculator(RadTbConverter):
else:
self._rad3x_correction = 1.0
nomin = l_nir - thermal_emiss_one * self._rad3x_correction
denom = self._solar_radiance - thermal_emiss_one * self._rad3x_correction
corrected_thermal_emiss_one = thermal_emiss_one * self._rad3x_correction
nomin = l_nir - corrected_thermal_emiss_one
denom = self._solar_radiance - corrected_thermal_emiss_one
data = nomin / denom
mask = (self._solar_radiance - thermal_emiss_one *
self._rad3x_correction) < EPSILON
mask = denom < EPSILON
logical_or(sunzmask, mask, out=mask)
logical_or(mask, np.isnan(tb_nir), out=mask)
......@@ -294,5 +294,5 @@ class Calculator(RadTbConverter):
else:
res = self._r3x
if is_masked:
res = np.ma.masked_array(res, mask=np.isnan(res))
res = np.ma.masked_invalid(res)
return res
......@@ -172,6 +172,11 @@ class RadTbConverter(object):
raise NotImplementedError(
'Platform {0} not yet supported...'.format(self.platform_name))
@staticmethod
def _getitem(block, lut):
"""Index the lut, numpy style."""
return lut[block]
def tb2radiance(self, tb_, **kwargs):
"""Get the radiance from the brightness temperature (Tb) given the band name.
......@@ -207,10 +212,15 @@ class RadTbConverter(object):
start = int(lut['tb'][0] * self.tb_scale)
retv = {}
bounds = 0, lut['radiance'].shape[0] - 1
index = np.clip(ntb - start, bounds[0], bounds[1])
retv['radiance'] = lut['radiance'][index]
if retv['radiance'].ravel().shape[0] == 1:
retv['radiance'] = retv['radiance'][0]
index = (ntb - start).clip(bounds[0], bounds[1])
try:
retv['radiance'] = index.map_blocks(self._getitem, lut['radiance'], dtype=lut['radiance'].dtype)
except AttributeError:
retv['radiance'] = lut['radiance'][index]
try:
retv['radiance'] = retv['radiance'].item()
except (ValueError, AttributeError):
pass
retv['unit'] = unit
retv['scale'] = scale
return retv
......