Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Superpixel on NDCube #450

Merged
merged 120 commits into from
Mar 1, 2023
Merged
Show file tree
Hide file tree
Changes from 102 commits
Commits
Show all changes
120 commits
Select commit Hold shift + click to select a range
57e9a02
First version of NDCube.superpixel.
DanRyanIrish Jul 29, 2021
899f740
Merge branch 'resampled_wcs' into superpixel
DanRyanIrish Jul 29, 2021
820c670
Add #450 changelog.
DanRyanIrish Jul 29, 2021
5ff666f
Minor fixes.
DanRyanIrish Jul 29, 2021
0b0230d
Remove additive/subtractive factors from ResampledLowLevelWCS.
DanRyanIrish Jul 29, 2021
511f251
Merge branch 'resampled_wcs' into superpixel
DanRyanIrish Jul 29, 2021
90a1725
First version of superpixel that handles extra coords.
DanRyanIrish Jul 29, 2021
db9c504
Implement new interpolate method on ExtraCoords.
DanRyanIrish Jul 29, 2021
384cd85
Merge branch 'resampled_wcs' into superpixel
DanRyanIrish Jul 29, 2021
7634286
Codestyle fixes.
DanRyanIrish Jul 29, 2021
5095e5e
Ensure interpolated extra_coord mapping is an int.
DanRyanIrish Jul 29, 2021
32b66c5
Merge branch 'resampled_wcs' into superpixel
DanRyanIrish Jul 30, 2021
e6b91dc
Merge branch 'resampled_wcs' into superpixel
DanRyanIrish Jul 30, 2021
fbe2cb4
Test NDCube.superpixel.
DanRyanIrish Jul 30, 2021
4154001
Minor bug fixes.
DanRyanIrish Jul 30, 2021
e978354
Merge branch 'resampled_wcs' into superpixel
DanRyanIrish Jul 30, 2021
f986fec
Merge branch 'resampled_wcs' into superpixel
DanRyanIrish Jul 30, 2021
20c3684
Codestyle fixes.
DanRyanIrish Jul 30, 2021
bf0a2a0
Merge branch 'resampled_wcs' into superpixel
DanRyanIrish Aug 4, 2021
ebc22ae
minor changes
DanRyanIrish Aug 4, 2021
6472b90
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Aug 6, 2021
34ff5ca
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Aug 14, 2021
c12bdab
Update ndcube/extra_coords/extra_coords.py
DanRyanIrish Aug 14, 2021
8660936
Add support for SkyCoords to ExtraCoords.interpolate.
DanRyanIrish Aug 21, 2021
4096adf
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Aug 21, 2021
b6b2f05
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Aug 21, 2021
7a367f7
Fix bug in ExtraCoords.interpolate when no limit given.
DanRyanIrish Sep 1, 2021
4ebdc1a
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Sep 8, 2021
f39dc02
Stop NDCube.superpixel crashing when there are no extra_coords.
DanRyanIrish Sep 8, 2021
987c275
Add changelog for new ExtraCoords.is_empty property.
DanRyanIrish Sep 8, 2021
8ff26a7
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Nov 3, 2021
4d2f995
Minor comment improvements
DanRyanIrish Nov 4, 2021
cd0b0cd
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Nov 4, 2021
730fbb3
Merge branch 'superpixel' of https://github.com/DanRyanIrish/ndcube i…
DanRyanIrish Nov 4, 2021
4d0346c
Add changelog for ExtraCoords.interpolate.
DanRyanIrish Nov 4, 2021
74ea1ff
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Nov 10, 2021
e9af6d1
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Nov 18, 2021
d7d8ed4
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Aug 26, 2022
a03c901
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Sep 16, 2022
ec93b15
Made superpixel only support certain aggregation functions.
DanRyanIrish Sep 16, 2022
79cd54b
First draft implementation of error propagation in NDCube.superpixel.
DanRyanIrish Sep 16, 2022
a9f956d
Generalize interpolation of SkyCoord extra coords.
DanRyanIrish Sep 16, 2022
e80d767
Changed func_name kwarg to method in NDCube.superpixel.
DanRyanIrish Sep 18, 2022
aa6deb0
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Sep 18, 2022
6ea3a44
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Sep 21, 2022
1557941
Add missing frame kwarg to a SkyCoord definition
DanRyanIrish Sep 21, 2022
56e313d
Set initial masked uncertainty to 0 and indexing correction.
DanRyanIrish Sep 24, 2022
fc189cf
Update calling NDCube.superpixel in test.
DanRyanIrish Sep 24, 2022
488fc6b
Correct NDCube.superpixel type check for uncert propagation. Also add…
DanRyanIrish Sep 30, 2022
cf0f3b2
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Dec 19, 2022
a49737d
Remove unneeded for loop.
DanRyanIrish Dec 19, 2022
b8414ff
Start writing tests for superpixel error propagation.
DanRyanIrish Dec 19, 2022
c23b4a7
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Dec 19, 2022
0cb4c24
Test error propagation in NDCube.superpixel.
DanRyanIrish Dec 19, 2022
90bce97
Switch ExtraCoords.interpolate to use numpy.interp.
DanRyanIrish Dec 19, 2022
74fa8c8
Fix codestyle
DanRyanIrish Dec 19, 2022
af9ca37
Rename NDCube.superpixel to rebin.
DanRyanIrish Dec 19, 2022
75a55a6
Propagate uncerts in min/max methods of NDCube.rebin.
DanRyanIrish Dec 19, 2022
e16cfd9
Add std dev support to NDCube.rebin.
DanRyanIrish Dec 19, 2022
27e4131
Add test for max version of NDCube.rebin.
DanRyanIrish Dec 20, 2022
e327cdf
Remove another scipy interpolate usage previously missed.
DanRyanIrish Dec 20, 2022
aab6650
Change how NDCube.rebin gets uncerts for min/max versions.
DanRyanIrish Dec 22, 2022
c4df4ca
Refactors uncertainty calculation for NDCube.rebin.
DanRyanIrish Jan 19, 2023
8062ee2
Add option to include/exclude masked values in NDCube.rebin.
DanRyanIrish Jan 20, 2023
9349fcd
Make np.mean default op for NDCube.rebin and general code improvements
DanRyanIrish Jan 24, 2023
db39ea7
Add test for NDCube.rebin with exclude_masked_values=False and update…
DanRyanIrish Jan 24, 2023
10a74d9
Fixes codestyle.
DanRyanIrish Jan 24, 2023
3bf58f0
Updates NDCube.rebin docstring.
DanRyanIrish Jan 24, 2023
ab89e27
Minor code tidying
DanRyanIrish Jan 25, 2023
f374b28
Move rebin error propagation function to utils.
DanRyanIrish Jan 25, 2023
86648b4
Update ndcube/ndcube.py
DanRyanIrish Jan 26, 2023
6b985b0
Pass kwargs to ExtraCoords.interpolate to numpy.interp.
DanRyanIrish Jan 26, 2023
0795d9a
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Jan 31, 2023
2f7275b
Fix codestyle.
DanRyanIrish Jan 31, 2023
e46017b
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Feb 17, 2023
4770ad4
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Feb 18, 2023
719cbe2
Rename propagate_uncertainty kwarg to propagate_uncertainties
DanRyanIrish Feb 18, 2023
a6d7380
Move rebin() from NDCubeBase to NDCube.
DanRyanIrish Feb 18, 2023
8f4564b
Add handle_mask kwarg to NDCube.rebin API.
DanRyanIrish Feb 20, 2023
8b5fb14
Merge branch 'superpixel' of https://github.com/DanRyanIrish/ndcube i…
DanRyanIrish Feb 20, 2023
2c0be40
Add dask support ot NDCube.rebin
DanRyanIrish Feb 21, 2023
9cf76c9
Make default NDCube.rebin propagation dask-friendly.
DanRyanIrish Feb 21, 2023
b8a5abe
Update ndcube/ndcube.py from code review
DanRyanIrish Feb 21, 2023
7901488
Fix codestyle
DanRyanIrish Feb 21, 2023
35e8f06
Move try import dask out of NDCube.rebin to module level dict.
DanRyanIrish Feb 21, 2023
178d4ae
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Feb 21, 2023
62ca28f
Fix codestyle
DanRyanIrish Feb 21, 2023
674d978
Apply suggestions from code review
DanRyanIrish Feb 22, 2023
d708d74
Add interpolate methods to TableCoordinate classes.
DanRyanIrish Feb 22, 2023
e670928
Add resample method to ExtraCoords.
DanRyanIrish Feb 22, 2023
91868cb
Add resample method to ExtraCoords.
DanRyanIrish Feb 23, 2023
0e8d0c7
Update changelog for PR 450.
DanRyanIrish Feb 23, 2023
482ee26
Remove ExtraCoords.interpolate as superceded by ExtraCoord.resample.
DanRyanIrish Feb 23, 2023
aee99b6
Fix bug in ExtraCoord.resample so upper edge of lookup table coords c…
DanRyanIrish Feb 23, 2023
eff2f7d
Refactor SkyCoordTableCoordinate.interpolate.
DanRyanIrish Feb 25, 2023
8c444a6
Update QuantityTableCoord interpolate and MultiTabCoord init.
DanRyanIrish Feb 26, 2023
03ba1c6
Apply changes from code review.
DanRyanIrish Feb 26, 2023
7ff8482
Fixes bugs in TableCoord interpolation.
DanRyanIrish Feb 27, 2023
b1a0473
Remove mesh support from QuantityTableCoordinate.
DanRyanIrish Feb 27, 2023
87d6cb8
Add back mesh support for SkyCoordTableCoord including in interpolate…
DanRyanIrish Feb 27, 2023
ae6bc31
Update minimum version test dependencies.
DanRyanIrish Feb 27, 2023
01b809a
Ignore warnings for oldestdeps tests.
DanRyanIrish Feb 27, 2023
4cbb4e3
Undo warning ignoring as it didnt work.
DanRyanIrish Feb 27, 2023
77d293f
Should trigger no warning
nabobalis Feb 27, 2023
577b539
actual fix
nabobalis Feb 27, 2023
c783738
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Feb 28, 2023
8f550e5
Merge branch 'superpixel' of https://github.com/DanRyanIrish/ndcube i…
DanRyanIrish Feb 28, 2023
d7f0007
Merge branch 'main' of https://github.com/sunpy/ndcube into superpixel
DanRyanIrish Feb 28, 2023
cc4b8f7
Add tests for NDCube.rebin errors.
DanRyanIrish Feb 28, 2023
ce020b6
Add tests for NDCube.rebin warnings.
DanRyanIrish Feb 28, 2023
d8ce29e
Add test for scalar inputs to ExtraCoords.resample.
DanRyanIrish Feb 28, 2023
26a7812
Add tests for correct errors raised by ExtraCoords.resample
DanRyanIrish Feb 28, 2023
3a7533f
Add test for resampling wcs-based ExtraCoords.
DanRyanIrish Feb 28, 2023
6d39cdd
Apply suggestions from code review
DanRyanIrish Feb 28, 2023
b9bbf10
Add tests TableCoord interpolate raises correct errors.
DanRyanIrish Feb 28, 2023
d59b208
Add tests for propagate_rebin_uncertainties().
DanRyanIrish Feb 28, 2023
e906890
Fix codestyle.
DanRyanIrish Feb 28, 2023
9927ad9
Update handling of mesh in SkyCoordTableCoordinate.interpolate.
DanRyanIrish Feb 28, 2023
8b82817
Changes suggested by code review.
DanRyanIrish Feb 28, 2023
5605aef
Rename use_masked_values kwarg to operation_ignores_mask.
DanRyanIrish Mar 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/450.feature.1.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Implement a new `ndcube.NDCube.rebin` method to combine integer numbers of pixels along each axis into larger pixels.
1 change: 1 addition & 0 deletions changelog/450.feature.2.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Implement new property, `ndcube.ExtraCoords.is_empty` that returns ``True`` if the object has not extra coords. Otherwise return ``False``.
DanRyanIrish marked this conversation as resolved.
Show resolved Hide resolved
1 change: 1 addition & 0 deletions changelog/450.feature.3.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add new methods to interpolate lookup table coordinates: `ndcube.extra_coords.table_coord.QuantityTableCoordinate.interpolate`, `ndcube.extra_coords.table_coord.SkyCoordTableCoordinate.interpolate`, `ndcube.extra_coords.table_coord.TimeTableCoordinate.interpolate`, `ndcube.extra_coords.table_coord.MultipleTableCoordinate.interpolate`
1 change: 1 addition & 0 deletions changelog/450.feature.4.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add `ndcube.ExtraCoords.resample` method to resample extra coordinates by a certain factor in each array dimension.
48 changes: 44 additions & 4 deletions ndcube/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"""
import logging

import astropy.nddata
import astropy.units as u
import dask.array
import numpy as np
Expand Down Expand Up @@ -58,11 +59,15 @@ def gen_ndcube_3d_l_ln_lt_ectime(wcs_3d_lt_ln_l, time_axis, time_base, global_co
wcs_3d_lt_ln_l.array_shape = shape
data_cube = data_nd(shape)
mask = data_cube < 0
meta = {"message": "hello world"}
unit = u.ph
extra_coords = time_extra_coords(shape, time_axis, time_base)
cube = NDCube(data_cube,
wcs_3d_lt_ln_l,
mask=mask,
uncertainty=data_cube)
uncertainty=data_cube,
meta=meta,
unit=unit)
cube._extra_coords = extra_coords

if global_coords:
Expand Down Expand Up @@ -468,6 +473,41 @@ def ndcube_2d_ln_lt(wcs_2d_lt_ln):
return NDCube(data_cube, wcs=wcs_2d_lt_ln)


@pytest.fixture
def ndcube_2d_ln_lt_uncert(wcs_2d_lt_ln):
shape = (10, 12)
data_cube = data_nd(shape)
uncertainty = astropy.nddata.StdDevUncertainty(data_cube * 0.1)
cube = NDCube(data_cube, wcs=wcs_2d_lt_ln, uncertainty=uncertainty)
return cube


@pytest.fixture
def ndcube_2d_ln_lt_mask_uncert(wcs_2d_lt_ln):
shape = (10, 12)
data_cube = data_nd(shape)
uncertainty = astropy.nddata.StdDevUncertainty(data_cube * 0.1)
mask = np.zeros(shape, dtype=bool)
mask[1, 1] = True
mask[2, 0] = True
mask[3, 3] = True
mask[4:6, :4] = True
cube = NDCube(data_cube, wcs=wcs_2d_lt_ln, uncertainty=uncertainty, mask=mask)
return cube


@pytest.fixture
def ndcube_2d_ln_lt_uncert_ec(wcs_2d_lt_ln):
shape = (4, 9)
data_cube = data_nd(shape)
uncertainty = astropy.nddata.StdDevUncertainty(data_cube * 0.1)
cube = NDCube(data_cube, wcs=wcs_2d_lt_ln, uncertainty=uncertainty)
cube.extra_coords.add(
"time", 0,
Time("2000-01-01 00:00", scale="utc") + Timedelta(np.arange(shape[0])*60, format="sec"))
return cube


@pytest.fixture
def ndcube_2d_ln_lt_units(wcs_2d_lt_ln):
shape = (10, 12)
Expand All @@ -480,11 +520,11 @@ def ndcube_2d_dask(wcs_2d_lt_ln):
shape = (8, 4)
chunks = 2
data = data_nd(shape).astype(float)
da = dask.array.from_array(data, chunks=chunks)
da = dask.array.asarray(data, chunks=chunks)
mask = np.zeros(shape, dtype=bool)
da_mask = dask.array.from_array(mask, chunks=chunks)
da_mask = dask.array.asarray(mask, chunks=chunks)
uncert = data * 0.1
da_uncert = StdDevUncertainty(dask.array.from_array(uncert, chunks=chunks))
da_uncert = StdDevUncertainty(dask.array.asarray(uncert, chunks=chunks))
return NDCube(da, wcs=wcs_2d_lt_ln, uncertainty=da_uncert, mask=da_mask, unit=u.J)


Expand Down
86 changes: 83 additions & 3 deletions ndcube/extra_coords/extra_coords.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
from astropy.time import Time
from astropy.wcs import WCS
from astropy.wcs.wcsapi import BaseHighLevelWCS
from astropy.wcs.wcsapi.high_level_wcs_wrapper import HighLevelWCSWrapper
from astropy.wcs.wcsapi.wrappers.sliced_wcs import SlicedLowLevelWCS, sanitize_slices

from ndcube.utils.wcs import convert_between_array_and_pixel_axes
from ndcube.wcs.wrappers import CompoundLowLevelWCS
from ndcube.wcs.wrappers import CompoundLowLevelWCS, ResampledLowLevelWCS

from .table_coord import (BaseTableCoordinate, MultipleTableCoordinate, QuantityTableCoordinate,
SkyCoordTableCoordinate, TimeTableCoordinate)
Expand Down Expand Up @@ -53,7 +54,7 @@ def add(self,
name : `str` or sequence of `str`
The name(s) for these world coordinate(s).
array_dimension : `int` or `tuple` of `int`
The pixel dimension(s), in the array, to which this lookup table corresponds.
The array dimension(s), in the array, to which this lookup table corresponds.
DanRyanIrish marked this conversation as resolved.
Show resolved Hide resolved
lookup_table : `object` or sequence of `object`
The lookup table. A `BaseTableCoordinate <.table_coord>` subclass or anything
that can instantiate one, i.e. currently a `~astropy.time.Time`,
Expand Down Expand Up @@ -96,6 +97,11 @@ def wcs(self) -> BaseHighLevelWCS:

"""

@property
@abc.abstractproperty
def is_empty(self):
"""Return True if no extra coords present, else return False."""
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"""Return True if no extra coords present, else return False."""
"""
Return True if no extra coords present, else return False.
"""


@abc.abstractmethod
def __getitem__(self, item: Union[str, int, slice, Iterable[Union[str, int, slice]]]) -> "ExtraCoordsABC":
"""
Expand Down Expand Up @@ -218,7 +224,7 @@ def add(self, name, array_dimension, lookup_table, physical_types=None, **kwargs

# Sort the LUTs so that the mapping and the wcs are ordered in pixel dim order
self._lookup_tables = list(sorted(self._lookup_tables,
key=lambda x: x[0] if isinstance(x[0], int) else x[0][0]))
key=lambda x: x[0] if isinstance(x[0], Integral) else x[0][0]))

@property
def _name_lut_map(self):
Expand Down Expand Up @@ -305,6 +311,14 @@ def wcs(self, wcs):

self._wcs = wcs

@property
def is_empty(self):
# docstring in ABC
if not self._wcs and not self._lookup_tables:
return True
else:
return False

def _getitem_string(self, item):
"""
Slice the Extracoords based on axis names.
Expand Down Expand Up @@ -406,6 +420,72 @@ def dropped_world_dimensions(self):

return dict()

def resample(self, factor, offset=0, ndcube=None, **kwargs):
"""
Resample all extra coords by given factors in array-index-space.

One resample factor must be supplied for each array axis in array-axis order.
Kwargs are passed to `numpy.interp`.
DanRyanIrish marked this conversation as resolved.
Show resolved Hide resolved

Parameters
----------
factor: `ìnt`, `float`, or iterable thereof.
The factor by which each array axis is resampled.
If scalar, same factor is applied to all axes.
Otherwise a factor for each axis must be provided.

offset: `int` `float` of iterable therefore.
The location on the underlying grid which corresponds
to the zeroth element after resampling. If iterable, must have an entry
for each dimension. If a scalar, the grid will be
shifted by the same amount in all dimensions.

ndcube: `~ndcube.NDCube`
The NDCube instance with which the output ExtraCoords object is associated.
DanRyanIrish marked this conversation as resolved.
Show resolved Hide resolved

Returns
-------
new_ec: `~ndcube.extra_coords.ExtraCoords`
A new ExtraCoords object holding the interpolated coords.
"""
new_ec = type(self)(ndcube)
if self.is_empty:
DanRyanIrish marked this conversation as resolved.
Show resolved Hide resolved
return new_ec
cube_shape = self._ndcube.data.shape
ndim = len(cube_shape)
if np.isscalar(factor):
factor = [factor] * ndim
if len(factor) != ndim:
raise ValueError(
"factor must be scalar or an iterable with length equal to number of cube "
f"dimensions: len(factor) = {len(factor)}; No. cube dimensions = {ndim}.")
if np.isscalar(offset):
offset = [offset] * ndim
if len(offset) != ndim:
raise ValueError(
"offset must be scalar or an iterable with length equal to number of cube "
f"dimensions: len(offset) = {len(offset)}; No. cube dimensions = {ndim}.")
# If ExtraCoords object built on WCS, resample using WCS insfrastructure
if self._wcs is not None:
new_ec.wcs = HighLevelWCSWrapper(ResampledLowLevelWCS(self._wcs.low_level_wcs,
factor, offset))
return new_ec
# Else interpolate the lookup table coordinates.
factor = np.asarray(factor)
new_grids = []
for c, d, f in zip(offset, cube_shape, factor):
x = np.arange(c, d+f, f)
x = x[x <= d-1]
new_grids.append(x)
new_grids = np.array(new_grids, dtype=object)
for array_axes, coord in self._lookup_tables:
if np.isscalar(array_axes):
new_coord = coord.interpolate(new_grids[array_axes], **kwargs)
else:
new_coord = coord.interpolate(*new_grids[np.asarray(array_axes)], **kwargs)
new_ec.add(coord.names, array_axes, new_coord, physical_types=coord.physical_types)
return new_ec

@property
def cube_wcs(self):
"""Produce a WCS that describes the associated NDCube with just the extra coords.
Expand Down
Loading