-
-
Notifications
You must be signed in to change notification settings - Fork 53
Add NDCube method to convert to NDData instance. #887
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
Merged
Merged
Changes from all commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
df8cdc3
Add NDCube method to convert to NDData instance.
DanRyanIrish d4b670f
Add #887 changelog.
DanRyanIrish 7f12b60
Increase test coverage of NDCube.to_nddata.
DanRyanIrish efffe44
Minor docstring edit.
DanRyanIrish c54cfb0
Merge branch 'main' of https://github.com/sunpy/ndcube into to_nddata
DanRyanIrish f88ce60
Simplify updating new kwargs in NDCube.to_nddata
DanRyanIrish c6bd658
Docstring fix.
DanRyanIrish 263a917
Retain extra_coords and global_coords when using NDCube.to_nddata to …
DanRyanIrish 7cb3737
Docstring formatting fix.
DanRyanIrish 9c9572d
Fix test of to_nddata to ndcube.
DanRyanIrish 361f887
Make common kwargs for NDCube.to_nddata explicit in call signature.
DanRyanIrish d46bcaa
Make handling of extra and global coords by NDCube.to_nddata more gen…
DanRyanIrish 6b9d019
Fix docstring reference.
DanRyanIrish b88580b
Update changelog/887.feature.rst
DanRyanIrish 551601d
Streamline extra and global coords in NDCube.to_nddata.
DanRyanIrish File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add new method, `ndcube.NDCube.to_nddata`, which allows easy conversion of an `~ndcube.NDCube` to a subclass of `~astropy.nddata.NDData`. Attribute values can be altered during the conversion by supplying the new values via kwargs. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -48,6 +48,8 @@ | |
except ImportError: | ||
pass | ||
|
||
COPY = object() | ||
|
||
|
||
class NDCubeABC(astropy.nddata.NDDataBase): | ||
|
||
|
@@ -1461,6 +1463,102 @@ def fill_masked(self, fill_value, uncertainty_fill_value=None, unmask=False, fil | |
self.mask = False | ||
return None | ||
|
||
def to_nddata(self, | ||
*, | ||
data=COPY, | ||
wcs=COPY, | ||
uncertainty=COPY, | ||
mask=COPY, | ||
unit=COPY, | ||
meta=COPY, | ||
psf=COPY, | ||
extra_coords=COPY, | ||
global_coords=COPY, | ||
nddata_type=NDData, | ||
**kwargs, | ||
): | ||
""" | ||
Constructs new type instance with the same attribute values as this `~ndcube.NDCube`. | ||
|
||
Attribute values can be altered on the output object by setting a kwarg with the new | ||
value, e.g. ``data=new_data``. | ||
Any attributes not supported by the new class (``nddata_type``), will be discarded. | ||
|
||
Parameters | ||
---------- | ||
data: array-like, optional | ||
Data array of new instance. Default is to use data of this instance. | ||
wcs: `astropy.wcs.wcsapi.BaseLowLevelWCS`, `astropy.wcs.wcsapi.BaseHighLevelWCS`, optional | ||
WCS object of new instance. Default is to use data of this instance. | ||
uncertainty: Any, optional | ||
Uncertainy object of new instance. Default is to use data of this instance. | ||
mask: Any, optional | ||
Mask object of new instance. Default is to use data of this instance. | ||
unit: Any, optional | ||
Unit of new instance. Default is to use data of this instance. | ||
meta: dict-like, optional | ||
Metadata object of new instance. Default is to use data of this instance. | ||
psf: Any, optional | ||
PSF object of new instance. Default is to use data of this instance. | ||
extra_coords: `ndcube.ExtraCoordsABC`, optional | ||
Extra coords object of new instance. Default is to use data of this instance. | ||
global_coords: `ndcube.GlobalCoordsABC`, optional | ||
WCS object of new instance. Default is to use data of this instance. | ||
nddata_type: Any, optional | ||
The type of the returned object. Must be a subclass of `~astropy.nddata.NDData` | ||
or a class that behaves like one. Default=`~astropy.nddata.NDData`. | ||
kwargs: | ||
Additional inputs to the ``nddata_type`` constructor that should differ from, | ||
or are not represented by, the attributes of this instance. For example, to | ||
set different data values on the returned object, set a kwarg ``data=new_data``, | ||
where ``new_data`` is an array of compatible shape and dtype. Note that kwargs | ||
given by the user and attributes on this instance that are not supported by the | ||
``nddata_type`` constructor are ignored. | ||
|
||
Returns | ||
------- | ||
new_nddata: Any | ||
The new instance of class given by ``nddata_type`` with the same attribute values | ||
as this `~ndcube.NDCube` instance, except for any alterations specified by the | ||
kwargs. | ||
|
||
Examples | ||
-------- | ||
To create an `~astropy.nddata.NDData` instance which is a copy of an `~ndcube.NDCube` | ||
(called ``cube``) without a WCS, do: | ||
|
||
>>> nddata_without_coords = cube.to_nddata(wcs=None) # doctest: +SKIP | ||
""" | ||
# Build dictionary of new attribute values from this NDCube instance | ||
# and update with user-defined kwargs. Remove any kwargs not set by user. | ||
user_kwargs = {"data": data, | ||
"wcs": wcs, | ||
"uncertainty": uncertainty, | ||
"mask": mask, | ||
"unit": unit, | ||
"meta": meta, | ||
"psf": psf, | ||
"extra_coords": extra_coords, | ||
"global_coords": global_coords} | ||
user_kwargs = {key: value for key, value in user_kwargs.items() if value is not COPY} | ||
user_kwargs.update(kwargs) | ||
all_kwargs = {key.strip("_"): value for key, value in self.__dict__.items()} | ||
all_kwargs.update(user_kwargs) | ||
# Inspect call signature of new_nddata class and | ||
# remove unsupported items from new_kwargs. | ||
all_kwargs = {key: value for key, value in all_kwargs.items() | ||
if key in inspect.signature(nddata_type).parameters.keys()} | ||
# Construct and return new instance. | ||
new_nddata = nddata_type(**all_kwargs) | ||
if isinstance(new_nddata, NDCubeBase): | ||
if extra_coords is COPY: | ||
extra_coords = copy.copy(self._extra_coords) | ||
extra_coords._ndcube = new_nddata | ||
new_nddata._extra_coords = extra_coords | ||
if global_coords is COPY: | ||
new_nddata._global_coords = copy.copy(self._global_coords) | ||
Comment on lines
+1554
to
+1559
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should really add these as kwargs to ndcube's constructor lol. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I agree! Let's keep that as separate to this PR though. |
||
return new_nddata | ||
|
||
|
||
def _create_masked_array_for_rebinning(data, mask, operation_ignores_mask): | ||
m = None if (mask is None or mask is False or operation_ignores_mask) else mask | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not a fan of extracting all the attributes like this, it feels exceptionally brittle.
Do we really need to do this? Can't we just say if you need to copy custom attributes of a non-NDData class you need to specify them as explicit keyword arguments? Then this dictionary comprehension is just for the things where the kwarg value is COPY.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unless there's a better way to filter the kwargs by the call signature of
nddata_type
, then yes, we need this.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That wasn't the part I was objecting to. I'll open a followup PR when I get the chance.