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.
This is a major release, meaning we are changing the API a little bit.
This was primarily driven by upstream changes to the binary file format that Kete was using to write files. This provides an opportunity to update a number of other lower priority structural issues in the rust backend. Very little has changed in the python code beyond rewriting the binary file format.
The rust backend got a huge restructuring, and if you are a rust user of Kete this is a very significant code change.
Be sure to checkout the new addition (these are still beta, but should stabilize soon):
- Orbit fitting!
- MCMC based optical and simple thermal model fitting!
- Added comprehensive MCMC based NEATM/FRM/HG flux fitting.
- Added orbit determination, including Initial Orbit Determination (IOD), State Transition Matrices, and support for non-gravitational parameter fitting.
- API for NEATM/FRM and generally all flux functions were re-written to support the new fitting methods. No functionality was lost, but this was a significant restructuring.
- Remove Bincode (the crate we were using for writing binary files of SimultaneousStates), this has been replaced with a custom format which should support future improvements while being backward compatible.
- Implemented several state of the art orbit integrators, tested them, found some small improvements in radau, and found it out performed all others. These integrators have been left in place but are not hooked up (for anyone who is curious).
- Restructured kete_core
propagationintointegratorsandforces. - Huge SPICE re-write, well not so much a re-write as a significant restructure and adding support for writing spice files. This support currently only exists in the rust backend, but may eventually make its way to the python.
- Removed FOVList from the python front-end as it was dead weight.
- SPICE SPK Type 10 (used by hubble only as far as I know) uses a older time format from modern TLEs, the kete implementation was using the modern standard leading to a small (~10-20km) position offset in the modern era. This has been fixed.
- Radau had poor initial starting step size for objects which were undergoing a close encounter, this step size is now adaptive and performance in these edge cases is much improved.
- Two-body calculations got a once-over and they now are effectively unbiased and accurate to within numerical machine precision, and are a tiny bit faster.
- Added a new numerical integrator based on Picard-Chebyshev integration. This integrator has only been added to the rust backend at this point, until more testing can be done and it be made available on the frontend.
- Saving
SimultaneousStatesto parquet files can now optionally include a column containing the TDB JD of when the state information was last updated. This allows users to selectively update state vectors only when necessary. - Added multi-core propagation support to rust backend.
- Added
kete_statsas a new rust crate, moving some of the fitting and statistics tools that have been in kete into their own crate. This is in support for some upcoming changes, and is being used as a test case for breaking up kete into smaller crates for easier consumption in the rust ecosystem.
- Rewrite of NEATM and FRM internal models, remove support for saving files related to thermal and optical models.
- Throughout the rust code,
Timeis being enforced as inputs for functions instead of acceptingf64in a large number of places. - Updated SPHEREx SPICE kernel to include orbit through Dec 10, 2025.
- Fixed epoch times in PCK Type 2 frames that were not being converted correctly.
- Fixed bug in the non-gravitational model constructor for dust, where the default value for converting from diameter to beta values was missing a 1e-3. This only impacted when dust models were constructed using the diameter input.
- Due to popular request, build kete for Intel macs.
- Added support for STScI MAST Tap queries.
- Updated observability example (simpler and faster).
- Added support for MPC Extended Packed Provisional designations.
- Added plotting tool for annotating orbits on a fits file.
kete.spice.get_statenow accepts MPC Observatory codes as well.- WISE SPICE kernel download location moved.
- Plotting no longer rescales the image in place.
- Plotting now works with integer valued data.
- Plotting correctly displays the names of the coordinate frame used.
- Added GAIA TAP server to kete's TAP functionality.
- Added phase correction model for comet dust.
- Next solar noon calculation fixed to always be the future noon.
- Loading WISE FoVs optimized, at least 5x faster for already downloaded data.
- Fixed the angle calculations of orbital elements in
Stateobjects where they were being converted to degrees twice, causing them to be multiplied by 360/2pi.
- Added support for SPHEREx public data, this includes a custom constructed SPICE kernel.
- Added support for computing sunrise and sunset times at any location on Earth.
- Added support for approximate earth location computation, to enable precovery work on frames from before 1972.
- Moved name lookups for SPICE and Observatory codes to the rust backend. This speeds up lookup of states in python by about a factor of 2.
- Renamed
wgs_84.rstoearth.rsand moved Earth related computations into it.
HorizonsPropertiessampling and queries to horizons is more robust to unexpected responses from the Horizons service.
This version introduces significant rewrites to the rust core of kete. Includes complete rewrite of the internal representation of coordinate frames, a new internal rust class for Vectors, and how SPICE files are parsed.
Unfortunately the above changes break any binary saved files which were previously saved by kete. Files can still be saved as binary, but the formats with the old version are not compatible any more.
Also included in this version are quality of life changes, for example state vectors now expose all of the underlying orbital elements directly. Queries to services such as IRSA are now cached by default and will recover if the same query is issues.
- Added support for PTF fields of view for all public data. PTF operated from 2009 to 2018, however data is only publicly available through early 2015.
- Generalized TAP queries to support queries to the Canadian Astronomy Data Centre (CADC).
- Added initial support for SPICE SCLK text kernels, allowing the conversion of
spacecraft formatted time strings to
kete.Timeobjects. Conversion matches cSPICE to near numerical precision limits. - Added initial support for SPICE CK binary kernels, allowing conversion of instrument coordinate frames to equatorial frame and back.
- Exposed orbital element values on Python State objects, instead of having to convert
the state first to an
CometaryElementsobject.
- Saving files to any binary format will no longer be guaranteed to be compatible in future versions. If a file is saved by a particular version of kete, it may only be compatible for that version.
- Restructured frames of reference throughout the core rust code. This is a significant
breaking change, which introduces new objects into the kete_core code. The biggest
changes are that frames of reference are now individual classes which implement a new
traits
InertialFrameandNonInertialFrame, and removes the previous Enum for frames. As a result of this, there is a new classVector<T>which has been added as well, which must be of typeInertialFrame. Numerous places throughout the code now use theseVectorclasses, which guarantees the reference frames are preserved without manually performing a check for matching frames.Statenow use reference frames as well, andSimultaneousStatesandFOVobjects now all useState<Equatorial>as the base representation of the states of the objects. - Significant rewrite of reading SPICE files, there are now wrapper view types to the for SPK and PCK.
- Field of Views as downloaded from IRSA are now saved as parquet files. This enables them to be backward compatible if there are future changes to FOV, States, or Vector definitions. This is a breaking change for previously downloaded FOV files, and these may be deleted.
- Moved plotting tools out of
kete.irsaintokete.plot. - Generalized
kete.irsatools tokete.tap, and added cached query support. Queries to any TAP service are now cached by default, and re-running the query will restore the existing results by default. - Moved
kete.mpc.table_to_statesintokete.conversion.table_to_states. - Renamed
kete.wise.fetch_wise_fovstokete.wise.fetch_fovs. - Renamed
kete.ztf.fetch_ztf_fovstokete.ztf.fetch_fovs. - Moved RA/DEC string parsing to rust backend.
- Many functions in python now support passing one or a list of objects, for example,
kete.propagate_n_bodycan now be passed single or multiple states, and will return the correct type back. - Parsing and packing of MPC Designations was re-written and moved out of Python.
- Reduced threshold for hyperbolic orbits to
|ecc - 1| < 1e-4from1e-3. - Improved accuracy for Apophis example by included non-gravitational forces.
- Fixed support for
MPCObservationparsing of MPC files, this regression was due to upstream changes at the MPC in their formats. - Parsing some non-gravitational forces from JPL Horizons was not correctly resolving parameter names, this is now fixed.
Announcement: Author of Kete (Dar Dahlen) has left IPAC Caltech to begin a PhD at TU Braunschweig in Germany. Kete has been forked from the public copy maintained by Caltech, and future development of this fork will occur as a personal project.
- SPICE kernels were removed for the repository, and now automatically download on first use.
- Improved SPICE kernel lookup performance when using large numbers of kernels. Testing with 1500 kernels has increased lookup speed by ~26x.
- Added
HorizonsProperties.desigswhich lists all of the designations in horizons. This will use a cached json file, for existing installations you will have to update the cached horizons properties:HorizonsProperties.fetch(desig, update_cache=True) - Updated the NAIF ID list for all comets, allowing kete to resolve recent comet spice IDs, this includes redesignations of known comets.
- Previous update to WISE spice kernel accidentally deleted the original mission spice kernel. This section has been re-added to the WISE kernel, which should now contain all phases of operation with the best orbit knowledge available.
- Added functions for estimating the position of Earth coordinates outside of the PCK limits. This allows for estimating Palomar's position in 1950.
- Switched to using the MPC Observatory code file for the source of observatory locations.
- WGS84 conversion between ECEF and Lat/Lon/Alt was missing a square-root causing a small offset (typically 10s to 100s of meters). This has been fixed.
- Added support for SPICE kernels of type 3, this allows reading satellites of Mars.
- Added support for choosing to not load the DE440 file when reloading SPICE kernels.
- Added optional suppression of impact warnings during propagation.
- Added new definitions for orbital families of objects.
- Fixed the recently added Earth precession calculation which was providing a transposed matrix.
- Updated PCK Files for Earth's orientation to the latest produced by NAIF.
- Updated leap second file (no new leap seconds).
- Updated the WISE spice kernels, which improves accuracy significantly for the final 2 years of WISE/NEOWISE.
- Added support for SPICE kernels of type 9, this allows reading SOHO spice files.
- Added support for SPICE kernels of type 18, this allows reading Rosetta spice files.
- Added calculation of Earth's precession, allowing the computation of time dependent equatorial vectors.
- Comet Magnitude estimates now accepts two phase correction values instead of 1.
- Restructured SPICE kernel memory management to make entire class of bugs impossible.
- Fixed a text case-sensitivity but on Horizons parameter parsing.
- Thermal model example had function arguments out of order.
- Added support for saving and loading
SimultaneousStatesas Parquet files.
- Horizons orbit table query now includes, M1/2, K1/2, PC, and rotation period.
- NEOS Chip size calculation was slightly incorrect with regard to the placement of the gaps between the chips.
- NEOS FOV rotation was being calculated in the ecliptic frame, whereas images will be in the equatorial frame. Rotation is now defaulting to the equatorial frame.
- Added support for loading orbit information from JPL Horizons
- Added more complete testing for light delay computations in the various FOV checks.
- Added quality of life function to
SimultaneousStatefor computing the RA/Dec along with the projected on sky rates of motion.
- Changed the return signature for
fov_static_check, this now returns indices of the inputs, instead of the original inputs themselves.
- Sampling of JPL Horizons orbit fits was slightly off, and appears to be fixed by assuming that the epoch time of the covariance fits is in UTC. This assumption is now included in the covariance matrix sampling. This is different than their other data products.
- Field of View checks for SPK checks was not returning the correct light delayed time, it was returning the position/velocity at the observed position, but the time was the instantaneous time.
- Removed several polar coordinate transformations in the rust backend which were all equivalent variations of latitude/longitude conversions. Nothing in the Python was impacted.
- Added Python 3.13 to the built packages.
- Added
sampleto theHorizonsPropertiesobject, allowing sampling of the orbit's uncertainty. - Added support for time delayed non-gravitational forces, as is found a number of comets in JPL Horizons.
- Added worked example of calculating if an object is an Earth Trojan.
- Add Earth obliquity calculation.
- Exposed WGS84 coordinate conversions in the python frontend.
- Epoch and Perihelion time conversion when loading JPL Horizons covariance matrices was not being done for UTC to TDB, leading to small residuals in covariance sampling.
- Added final SPICE kernels for the WISE mission, it now contains all positions from all phases of operation. There is a gap for the years it was not operating.
- Updated WISE mission phases to reflect the final data products about to be released.
- Updated ZTF for the current release 22.
- Added
kete.RectangleFOV.from_wcs, allowing the construction of a FOV from a given Astropy WCS object. - Added
kete.conversion.bin_data, which allows for binning matrix data such as images. - Added tutorial showing precovery of an asteroid from a 1950's glass plate observation done at the Palomar Observatory.
- Added sun-shield rotation calculation for NEO Surveyor.
- All FOV's now have the
.jd()method which returns the JD of the observer state.
- Building FOVs from corners, now will flip the corner ordering if the final FOV is pointing in the opposite direction of the input corners. This means Rectangle FOVs cannot be defined from corners with on sky angles greater than 180 degrees.
- Orbital elements calculations for True Anomaly and Eccentric Anomaly were numerically unstable with nearly parabolic orbits.
- Time scaling bugs when loading times from both Horizons and the MPC were fixed, these were causing offsets of about a minute in the loaded states. However it was shifting both the perihelion time and the epoch time by the same amount, leading to only minor effective errors.
- Fixed a time offset in the FOV's downloaded from IRSA WISE/NEOWISE. They were offset by 4.4 seconds.
- Fixed rotation approximation in WISE/NEOWISE field of views which was causing a small percentage of objects to not be found during FOV checks when they were close to the edge of the field.
- Constant for the sqrt of GMS was incorrect by a small amount, this value was fixed.
- IRSA username/password options are now being passed through correctly in WISE.
- Removed
plot_framefrom ZTF, as a better version of this is available in kete.irsa. - Removed
cache_WISE_frameandfetch_WISE_framedeprecated functions in WISE.
0.3.0 - 2024 - 8 - 28
- Added an Omni-Directional Field of View.
- Added a "getting started" example.
- Renamed the project to Kete.
- Optimized the
moidcomputation, improving performance by over 30x.
- Field of View checks for states was optimized for multi-core processing on millions of objects, leading to huge speed gains for large queries.
- Fixed a bug where saving lists of SimultaneousStates had a bug where field of view information was not being saved correctly.
- Fixed incompatibility with older versions of the rust compiler, working back to at least v1.75.0
0.2.5 - 2024 - 8 - 12
- Added support for long term integrations, on the scale of less than a mega-year.
- Added clear deprecation tooling, which helps indicate how to update kete when a function's signature changes or is removed.
- Added default plotting tools for fits files, which make decent scaling guesses for ZTF and WISE frames. This includes annotation and zooming functions.
- Cached files are now zipped if possible after download.
- Cached WISE frames are sorted by folders by the last 2 digits of the scan id, this helps when downloading thousands of frames.
- Combined
fetch_WISE_frameandcache_WISE_framefunctions intofetch_frame. - Renamed
cached_gzip_json_downloadtodownload_json. - Renamed
cached_file_downloadtodownload_file. - Optimizations to SPICE kernel queries leading to a 20% speedup in orbit propagation, along with >43% speedup in state queries from the spice kernels. Speedup from orbit propagation comes directly from the spice kernel optimization.
- Moved python wrappers over propagation into the rust backend entirely.
- Simplified polymorphic support in the rust wrappers, removing some intermediate objects which were over-complicating the interface.
- Refactored the computation of gravitational forces, improving maintainability.
- Fixed documentation on Time which was not being displayed correctly in python.
cached_zip_downloadwas deprecated, this was automatically unzipping folders.
0.2.4 - 2024 - 7 - 15
- Add
J2non-spherical terms for the gravitational models of Earth and Jupiter. - Add non-gravitational force model for dust particles which includes the Poynting-Roberterson effect.
- Added
Time.year_floatwhich converts theTimeobject to the Year as a float. - Added
SimultaneousState.obs_vecswhich creates vectors from the observer to the objects contained within the state. - Added
NEATMtutorial which gives an overview of NEATM along with a small example.
- Optimized SPICE kernel loading for Type 2 records, which is what DE440 is saved as. This means effectively all n-body propagation is now 15-20% faster than before.
- Removed
SpiceKernelas a class, lowering all its methods to the submodule level, see #68 for more discussion. - Removed
Timeobject which was a wrapper over astropy.Time, instead making a custom implementation of time which is ~3-400x faster than previous. - Improved orbital element conversion, leading to a 2-3x speedup in two body orbit propagation.
- Significant rewrite of the SPICE kernel file management, this rewrite is required so that future work can enable writing SPICE kernel files.
- Moved the downloading of Horizons spice kernels from
SpiceKerneltohorizons. - Renamed all field of view checking functions to similar names:
fov_static_check,fov_state_check, andfov_spice_check. These functions are exposed at the base level of kete. - Moved much of the python documentation into the rust wrappers, and removed the remaining empty python files. Part of the rewrite involved moving and renaming many functions.
- Updated
nalgebrato minimum version^0.33.0, which uses a simplified allocator. - Fixed minimum versions for all rust libraries.
- Orbital Elements now correctly computes
true_anomaly,mean_anomaly,eccentric_anomaly,semi_major_axis, andmean_motionfor parabolic and hyperbolic orbits. - Two body propagation for parabolic orbits was incorrect.
- Typo in Observability example was leading to an incorrect Magnitude value.
- Astropy WCS warnings are now suppressed.
SpiceKernels.moon_illuminated_fracnow agrees with JPL Horizons, this was doing a geometric calculation which was correct, but with a different interpretation than desired.
- Removed support for SPK Files of type 3, these should be a trivial change from type 2 however I do not have access to a file of type 3 for testing. Because it cannot be validated at the moment, the code has been removed.
0.2.3 - 2024 - 6 - 12
- Added computation for Tisserand's Parameter.
- Added support for NEOS Visit FOVs, which are joint FOVs containing 4 rectangles.
- Added python interface to WISE Color Correction functions.
- Added support for querying static sky sources in FOVs.
- SpiceKernels can now load SPK files directly, without needing the files to be in the cache.
- SpiceKernels now supports displaying the contents of the headers of SPk/PCK files.
- SpiceKernels can now return the available loaded SPK segments of an object.
- Renamed "HorizonsCovariance" to "Covariance" and generalized it to support both cometary and cartesian representations.
- Made api more consistent for conversion to State objects by renaming all instances of
.as_stateto.state. - Improved performance of integration and propagation by about 10%.
- Restructured the Rust FOVs to be organized by observatory.
- Renamed
SpiceKernels.cache_kernel_reloadtokernel_reloadand changed it's args.
- Astropy will no longer warning about deprecated WCS header values for NEOWISE images.
0.2.2 - 2024 - 5 - 20
- Added support for downloading ZTF full fields FOV information into the kete cache.
- Added simple lookup for observatory ecliptic state using MPC observatory codes.
- Added 'Tutorials' to the documentation, these are larger worked examples which do not build at the same time as the standard docs. They are designed to be examples which take significant compute, and may run for many minutes.
- Added Tutorials for 'KONA' and 'WISE Precovery'.
- Moved population definitions to the base level and renamed it
population. - Changed references to diameters in the broken power law sampler.
- FOV propagation tests now return a flatten list of states.
- Renamed
datatocacheto more accurately represent its function.
- Coordinate frame conversion was resulting in incorrect coordinate positions when passing Equatorial based frames to some FOV related functions. Specifically it was failing to convert the Equatorial frame to Ecliptic frame before performing orbit calculations.
- Removed construction of populations entirely.
- Removed folder for
population, the remaining contents were moved up to the base level of the package. - Removed PDS related tools.
0.2.1 - 2024 - 5 - 13
- Added support for querying SPK kernels of a specific epoch of fit from JPL Horizons.
- Added support for looking up the MPC preferred unpacked designation for asteroids.
- Change documentation to clarify that designations are unpacked.
- Updated MPC Obs codes to include NEO Surveyor with code C58.
- Updated NAIF ID list to include new designations for about 20-30 comets.
- Renamed underlying
_rustbinary to_core. - Moved NAIF ID list to a dedicated CSV file which is read during compilation.
- Rename
population.diametertopopulation.power_law.
- Removed main belt construction tools, out of scope and not accurate enough.
- Removed redundant MPC name resolver function.
0.2.0 - 2024-3-16
Initial Release
- Initial version release of kete!
- kete's primary goal is to enable simulations of NEOs, however it also supports any asteroid or comet. Included are n-body orbit propagation tools, thermal and optical modeling, tools for computing what minor planets can be seen by an observer. Along with many helpful interfaces to web tools such as JPL Horizons or IPAC's IRSA.