All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added for new features.
- Changed for changes in existing functionality.
- Deprecated for soon-to-be removed features.
- Removed for now removed features.
- Fixed for any bug fixes.
- Security in case of vulnerabilities.
- currently supported versions of python now range from 3.8 to 3.12. There is a catch for python 3.8: the corresponding astropy version is pinned to astropy<5.3
- the deprecated
write
method now callssave
internally
- all methods of
MOC
with signatures likefunction(self, lon, lat, **kwargs)
now accept both lists of coordinates and single coordinates mocpy.stmoc.STMOC.from_spatial_coverages
also accepts single moc objects (had to be a list before)AbstractMOC
derives from metaclassABCMeta
save
now acceptsfits_keywords
that are added to the fits header before writing the filen_cells
gives the number of cells corresponding to a given order
- brand new support of frequency MOC ! 🚀
- documentation has galleries of notebooks
AbstractMOC.__init__
raisesPermissionError
if user tries to modify order manuallyAbstractMOC.store_index_dtype
becameAbstractMOC._store_index_dtype
as is is intended for internal use only to handle 32 and 64b systems- tests in doctrings now run in CI too
- CI won't run for linux 32 anymore, but support will still be provided upon bug repports
sum([moc1, moc2, moc3])
now works correctly (fixes #99)MOC.wcs()
now works correctly for non-squared figures (fixes #98)MOC.from_fits_image
now works even when the fits file has no CDELT (fixes #90)
MOC.__init__
andSTMOC.__init__
raisePermissionError
if user tries to modify order manually
- 🐛 position angle limited to PI/2 instead of PI in
MOC.from_elliptical_cone
MOC.MAX_ORDER
andTimeMOC.MAX_ORDER
to replace formerIntervalSet.HPX_MAX_ORDER
andIntervalSet.TIME_MAX_ORDER
MOC.to_depth29_ranges
(+test) to replace formerIntervalSet.nested
TimeMOC.to_depth61_ranges
- tests on
MOC.uniq_hpx
- 🐛 return statement was missing in
MOC.uniq_hpx
- add methods
AbstractMOC.__copy__
andAbstractMOC.__deepcopy__
- add op parameter
timeout
inquery_simbad
andquery_vizier_table
that defaults to 1000s - warning if
max_depth
is not set inMOC.from_valued_cells
⚠️ BREAKING: public functionset
inplot.axis_viewport
module has been renamed into_set_wcs
and moved to moduleplot.utils
- 🐛 a bug was introduced in [0.12.0] on the functions
query_simbad
andquery_vizier_table
that are compatible withpre_v2
format only - 🐛 when
max_depth=None
inMOC.from_valued_cells
⚠️ BREAKING: Deserialisation of ST-MOCs from FITs HDU (reading/writting FITS file fully supported on the Rust side)⚠️ BREAKING: Remove support of pre_v2 ST-MOC fits file writing (reading still ok)⚠️ BREAKING: internal classIntervalSet
removed⚠️ BREAKING:utils
file removed
- add
hdu_index
optional parameter inMOC.from_fits_images
TimeMOC.to_time_ranges
to get time ranges from a T-MOCMOC.to_rgba
andMOC.dsiplay_preview
for a quick S-MOC allsky viewuniq_gen
anduniq_zorder
added toAbstractMOC
flatten
added toAbstractMOC
- constructor
MOC.from_healpix_depth29_ranges
- parameter
values_are_densities
inMOC.from_valued_healpix_cells
- parameter
complement
inMOC.from_polygon
+
,|
,-
,&
,~
operators redefinition forunion
,union
,difference
,intersect
andcomplement
respectively.contains_skycoords
andcontains_lonlat
to replacecontains
- add
fold
parameter intosave
andto_string
- add
MOC.barycenter
andMOC.largest_distance_from_coo_to_vertices
of a moc - add
MOC.wcs
giving an astropy WCS centered around a the barycenter of moc
⚠️ BREAKING:times_to_microseconds
andmicroseconds_to_times
moved fromutils
totmoc
.⚠️ BREAKING:uniq
removed fromIntervalSet
, but replacing methoduniq_hpx
added toMOC
⚠️ BREAKING: the output ofuniq_hpx
is not sorted (but follow the order of the cells in the internal range list)
⚠️ BREAKING:STMOC.query_by_time
now takes in input aTimeMOC
⚠️ BREAKING:STMOC.query_by_space
now returns aMOC
⚠️ BREAKING:TimeMOC.contains
does not take any longer a time resolution as input parameter⚠️ BREAKING:TimeMOC.contains_with_timeresolution
as been added with the previous behaviour ofTimeMOC.contains
- add
save
toAbstractMOC
and remove from sub-classes - add
to_string
toAbstractMOC
and remove from sub-classes from_uniq
removed fromIntervalSet
and added toMOC
- change the
contains
implementation to be much memory efficient, faster, and thus working at all HEALPix orders. - update
cdshealpix
andmoc
dependencies ⚠️ BREAKING:MOC.from_healpix_cells
- now requires the
max_depth
, the depth of the MOC we want to create - optional parameter
fully_covered
removed since it was not used
- now requires the
⚠️ BREAKING: inMOC.from_valued_healpix_cells
, the user now have to degrade manually the resolution if max_depth < deepest cell depth.⚠️ BREAKING:World2ScreenMPL
has been renamedWCS
- Add
MOC.from_ring
- Option
include_indirect_neighbours
tosplit
andsplit_count
- Extend the
moc.fill
andmoc.border
to directly accept an astropy wcs object. This solves the issue cds-astro#69 - Addresses the plotting artefacts when plotting big HEALPix cells. Cells of depth < 3 are subdivided to the depth 3 before being plotted
- Set the default
time_order
from 29 to 61, i.e. tomax_order
instmoc.from_spatial_coverages
(29 was themax_order
in the previous MOC V2.0 version).
- More robust FITS UNIQ deserialization (ignoring 0 values)
- Rename
TimeMOC
logical operations taking a deltaT constraint adding the sufix_with_timeresolution
- WARNING logical
TimeMOC
logical operations are now at the deepest depth (no time resolution parameter)
- Deprecate
from_fits
, ... methods - Add
MOC.spli_count
,MOC.split
,MOC.from_multiordermap_fits_file
- Add support for u16 and u32 fits MOC and TMOC in 'load'
- Replace empty moc shape (1, 0) by (0, 2)
- Fix
tmoc.max_time
- Fix doc (due to an evolution of sphinx)
- Add compatibility with MOC2.0: Time depth in now in
[0, 61]
instead of[0, 29]
- Add
from_time_ranges_in_microsec_since_jd_origin
intemporal_coverage.rs
- Time operations now precise to the microseconds, see:
utils.times_to_microseconds
utils.microseconds_to_times
- Add several options to
moc.from_valued_healpix_cells
- Add
load
andsave
methods for serialization/deserialization in pure Rust (ensuring MOC2.0 compatibility). - Improve performance and some operations (like intersection and union)
- Improve
to_uniq
performances (x5 according to a bench in pure Rust) - Improve
add_neighbours
andremove_neighbours
performances (now in pure Rust)
complement()
: remove from AbstractMoc / IntervalSet, and add it in Moc and TimeMoc (because complement now depends on the qty)
- Remove the
moc
crate from MOCPy and publish it as a standalone here (with a lot of added stuff) - Add FITS serialization/deserialization on the Rust code.
- Add ASCII and JSON serialization/deserialization on the Rust code.
- Move
rand
from dependencies to dev-dependenciies - Generalize the code to support various quantities with different dimensions (HEALPix indices, Time, ...)
- create
MocableQty
andMocQty
implemented byHpx
andTime
- create
- Remove depth/qty dependent operations from
Ranges
(depth/complement/degrade), create a trait for generic operations - Add
MocRange(s)
since we introducedMocQty
for depth dependent operations, and introduce both:HpxRange(s)
andTimeRange(s)
- Add
MocRanges2D
for depth dependent operations - Rename
NestedXX
inHpxXX
to possibly support Ring indices (the code should be the same as far as the NSIDE is a power of 2) - ...
- change the CI: replace travis and appveyor by github actions
- replace setuptools rust by maturin
- update dependencies
- remove ',' separator when deserializing MOC from ascii (this follows the MOC 1.1 standard http://ivoa.net/documents/MOC/20191007/REC-MOC-1.1-20191007.pdf)
- from_valued_healpix_cells
- API Breaking change! from_image -> from_fits_image(hdulist, max_norder)
- WCS -> World2ScreenMPL. It's a context manager class
- Change API for ST-MOC: query_by_time, query_by_space
- Space-Time coverages, classmethod from creating them from (time, ra, dec) tuples
- Query a Space-Time coverages with time frames and spatial coverages
- Rust backend
- Add tests for windows py27 and py3
- from_polygon relies on cdshealpix. spherical_geometry dependency removed!
- change astropy-healpix dependency from mandatory to optional. astropy-healpix is now used in only a few deprecated methods
(such as the old plot method from
mocpy.MOC
andget_boundaries
which will soon make use of cdshealpix too).
- API CHANGE!: the
inside
parameter of from_polygon and from_polygon_skycoord has been removed ! The inside of the polygon is deduced from the order of the sky coordinates passed.
- Change from_cells to from_healpix_cells. Its API does change too. It now takes the three ipix, depth and flags numpy arrays separatly instead as a numpy structure. This has the advantage of direcltly passing the arrays returned by
cdshealpix
. Creating a numpy structured array from simple numpy column arrays needed to copy the data from the arrays to the structural array. - Add cdshealpix as a dep. Will remove astropy-healpix dep. When cdshealpix will be merged into astropy-healpix then the astropy-healpix dep will be restored.
- Serialize to str. Call moc.serialize(format="str")
- Load a MOC from a str (see section 2.3.2 of MOC IVOA paper).
- Fix vizualization bug when plotting all the allsky MOC. Biggest cells to plot are limited to depth 2. Cells of depth 0 and 1 are subdivided into cells of depth 2 for the visualization purpose.
- Add of a
overwrite
optional keyword in the write method. Before 0.5.6 the default behaviour was to always overwrite already existing files. Now it does not overwrite by default. To do that, you have to set theoverwrite
keyword.
- Plotting a moc with matplotlib axes is faster (concers fill and border methods). The level of detail of the plotted MOC is function of the FoV. The MOC is degraded to the minimum depth so that a cell of this depth can be contained in 1px at the center of the projection. For small FoVs, we only plot the part of MOC contained in the view (thanks to the speed of logical operation between MOCs).
- The docs features more examples on how to plot a MOC, perform logical operations between MOCs, etc...
- The doc of the API has been reviewed and features some test codes that can be run with the sphinx command
make doctest
.
- The use of multiprocessing in the
fill
method.
- Novel python file hierarchy. moc/ and tmoc/ containing the sources for MOC (resp. TMOC) classes.
- A new mocpy.WCS object type that must be declared in a context (with WCS(...) as wcs:) for use. This facilitates the creation of an astropy.wcs.WCS object for plotting a MOC in a matplotlib axes. This replaces the wcs.spatial.utils.make_wcs method that returned an astropy.wcs.WCS object.
- Use of multiprocessing.Pool in mocpy.MOC.fill
- wcs.spatial.utils.make_wcs has been removed. See mocpy.WCS as replacement.
- A new constructor from_cells. It returns a new MOC instance from a numpy structured array representing the cells of a MOC. The structured array passed must contains 3 attributes: "ipix": np.uint64, "depth": np.uint32, "fully_covered": np.uint8 (a flag bit. For the moment its value has no effect for the newly created MOC).
- A new from_polygon_skycoord method added where you can pass an astropy.coordinates.SkyCoord describing the polygon coordinates instead of two lon, lat astropy.units.Quantity. The max_depth, and inside optional arguments remain.
- Remove spherical geom from dependency so that astroquery.cds wheel for windows/py3 can be generated. Spherical Geom is only used in MOC.from_polygon. A message is addressed to the user telling him to install sphrical geom if it is not installed and if he wants to create a MOC from a polygon.
pip install mocpy
now installs all the dependencies of mocpy. See the setup.py file. (requires changed to install_requires).
- Two methods
fill
andborder
taking an astropy.wcs.WCS and a matplotlib axis.fill
projects the MOC into the WCS and draws it on the MPL axis using pathpatches for each HEALPix cell.border
draws the border the same way and requires a WCS and an MPL axe too. You can pass to these functions additional keyword arguments that will directly be passed to MPL when plotting (e.g. the color, the linewidth, and alpha component etc...). Check the notebooks to see how to use these new methods. - You can retrieve the list of skycoords describing the border MOC. Each skycoord from the list refers to one border of the MOC (either an external border or the border of a hole in a connexe MOC). The process takes for the moment a quite amount of time and thus may be optimized in the future. A new GALEX boundaries notebook has been added so that you can check how it works. I recommend to decrease the order of GALEX to 5 before computing the boundaries otherwise it will take some time. This add relies on the issue #29 initiated by @ggreco77.
- A new
from_polygon
method taking the vertices (i.e. (skycoords) or (lon, lat) tuples) responsible for setting up a new MOC from a polygon. An inside SkyCoord point is requested and says to the algorithm which area (2 possible as on the sphere, an area and its complement are both finite) must be chosen. If no inside sky coord is given, we consider the mean of the vertices of the polygon as belonging to the MOC (This is without ambiguity for convex polygons but it may not work for concave ones). Vertices describing a convex or concave polygon are accepted. Vertices describing a self-intersecting polygon are not accepted. This method does not rely on astropy_healpix as there is for the moment no method returning the set of HEALPix cells belonging to a polygon and is thus implemented purely in Python. - A new
serialize
public method allows to serialize the MOC in two possible format, FITS and json. For a FITS serialization the method returns an astropy HDU binary table. For a JSON serialization, the method returns a python dictionary storing order-[list of HEALPix cells] as key-value pairs.
write
method does not take awrite_to_file
argument. For serialization purpose, there is now a newserialize
method.- astropy_healpix.HEALPix.lonlat_to_healpix seems to not accept astropy MaskedColumn anymore. For lon as a MaskedColumn, please pass lon.T * u.deg to mocpy.MOC.from_lonlat. We need to transpose the column and then convert it to an astropy.units.Quantity.
- Notebooks have been updated and all the plots now use the new methods
fill
andborder
. - A new package
spatial
, invisible from the user, but keeping all the code of spatial MOCs (plotting methods, border computation, special utils for creating WCS...) has been created. tmocs and core functions are still located in the root of the project. - Add of a changelog