Changelog#
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog (keepachangelog), and this project adheres to Semantic Versioning (semver).
Unreleased changes live as fragments in changelog.d/ and are merged here by
nox -s release. See docs/source/contributing/releasing.rst.
[2.2.1] - Pipeline hardening#
Changed#
user guide and developer guide reworked for clarity: tighter prose, corrected grammar, consistent sentence-case headings, and each mechanism now explains the reason behind it, not just the behaviour
home page, user-guide and developer-guide landing pages now share the same card-based navigation with consistent line icons, rendered from reStructuredText instead of hand-written HTML and clip-art
Removed#
unused documentation dependencies from the
docsextra (sphinx-rtd-theme,sphinx-panels,sphinxcontrib-napoleon,nbsphinx,myst-parserand a few transitive-only pins)dead duplicate
PrepareInstantaneousReadOut.force_power_conservationmethod (the live implementation is inInstantaneousReadOut)
Fixed#
nox -s docsandnox -s docs-livenow install thedocsextra, so the documentation builds on a clean checkout (Sphinx and the theme were missing)two broken links on the user-guide landing page
several
noteandwarningadmonitions that were not rendering because their content was not indentedbroken cross-references to the installation instructions from the quick-start and FAQ pages
malformed XML in the custom-task example (
unitattributes now quoted) and a duplicate documentation label for pixel non-linearitystale continuous-integration details in the contributing guide (workflow name and supported Python versions)
title overline/underline mismatch on the sky-sources page that newer Sphinx rejects
corrupted LaTeX in several task docstrings (
\frac,\timesand similar were being read as escape characters), so the rendered formulae for read noise, dark current noise and the dark-current map are now correctthe ExoSim logo no longer overflows and clips the page header
FocalPlanePlotterfailed withKeyError: 'channels'on a normal focal-plane output: it looked forchannels/channelsinstead ofchannelsexosim.__branch__andexosim.__commit__were alwaysNone: the git metadata reader looked for.gitone directory too shallowInstantaneousReadOutin memory-saving mode (slicing=True) crashed withAttributeError: 'InstantaneousReadOut' object has no attribute 'getOversampleFactors'whenever the pointing jitter needed sub-pixel magnification; the call now uses the renamedget_oversample_factorsthe target-list mode of
RadiometricModel(atargetlist_filepathundersky/source) crashed withKeyError: component not found: it rebinned the channel efficiencies from the file root instead of from the per-targettargets/<name>/channelsgroup. The recipe now runs to completion and writes a radiometric table for every target in the list.RadiometricModelandCreateFocalPlanefailed on a payload with a single, unwrappedchannelentry (KeyError: component not found/KeyError: 'Photometer'): the efficiency-rebinning and the foreground/source signal helpers iterated the channel dictionary as if it were the multi-channel mapping. Single-channel configurations now run through the whole radiometric pipeline.Signal.get_slice/Signal.set_slicenow accept a plainfloatstart/end time as documented (assumed to be hours); before they raisedAttributeErrorAddGainDriftraises a clearKeyErrorwhen neithergain_drift_amplitudenor the amplitude range is configured, instead of anUnboundLocalErrorEstimatePlanetarySignalraises a clearValueErrorwhen the planetrpis neither a file path nor a number, instead of anUnboundLocalErrorChannel.target_sourceraises an informativeKeyErrorwhen several sources are defined but none (or more than one) is flagged as the science target, instead of anIndexErrorRadiometricModelnow passes the per-channel configuration to the sub-foreground signal task, so the<contribution>_total_signalcolumns are computed for every channel typeCreateFocalPlaneinfers the wavelength grid from the channel passbands (channel/wl_min/wl_max) whenwl_gridis absent from the configuration; the previous fallback looked up a non-existentchannelskey and always used the 1-2 micron defaultthe spectrometer focal-plane builder no longer relies on a fragile buffer-level
array == zeroscomparison to detect a flat wavelength axis (inCreateFocalPlaneArray._wav_osrand the PSF window locator); it now checks the values explicitlylocate_wavelength_windowsraises a clear error for an unsupported PSF dimensionality or channel type instead of returningNone(which made the caller fail with an opaque unpackingTypeError)EstimateZodino longer loops forever when the bundleddatadirectory cannot be found by walking up from the module; the search is bounded and raisesOSErrorif it failsAccumulateSubExposurescorrupted the ramp of a single-exposure acquisition: the first chunk readstate_machine[-1]/dataset[-1](the wrapped-around last frame) as its carry-in offset. The first chunk now starts from zeroAnalogToDigitalclips the converted signal to the ADC full scale; a bright pixel above full scale with a fixed ADC gain used to wrap around on the integer cast (e.g. 200000 counts became 3392 on a 16-bit ADC)AddCosmicRaysno longer fails with anUnboundLocalErrorwhen the configuredinteraction_shapesprobabilities sum to less than one; the event shape falls back to the last configured shapeMergeGroupsraises a clear error when the number of sub-exposures is notn_groups * n_ndrsinstead of silently mis-averaging a truncated group or raisingIndexErrorComputeSourcesPointingOffsetcomputes the source-to-pointing offset withSkyCoord.spherical_offsets_to, so it handles the RA 0/360 wrap and thecos(dec)foreshortening (a plain RA/Dec difference was wrong away from the equator and near RA = 0); the offset is now rounded to the nearest sub-pixel rather than truncated
Security#
refreshed the locked dependency versions to pull in security fixes for
pillow,requests,urllib3,cryptography,idna,jupyter-server,jupyterlab,notebook,nbconvert,mistune,tornado,pygmentsand thesafetytoolchain (authlib,nltk); this clears the outstanding Dependabot alerts onuv.lock. The release still installs the highest compatible versions for end users, so this only affects reproducible development and CI environments
[2.2.0] - End-to-end simulations#
Added#
new recipe
SimulateObservationto run the full simulation pipeline from an options file to the NDRsradiometric model now supports target-list mode
new documentation section for the radiometric model with a detailed description of the pipeline and operating modes
observation efficiency can now be specified in the options file
slim_outputoption for recipes to reduce output file size by dropping intermediate data productsSED download task to fetch stellar spectra from online databases (currently Phoenix models only)
Changed#
fast_convolutionnow usesscipy.signal.fftconvolvefor better performance and accuracysaturation time now includes the well-depth fraction; integration time is the minimum saturation time across the detector; frame time is integration time divided by observation efficiency
photon noise is now computed on the observation-efficiency-corrected signal
packaging and dependency management moved from Poetry to uv
logging moved to
structlogwl_interpolatereworked to use argsort + inverse mapping, avoiding O(n^2) lookups and extra copiesExoSim can now run without any source (no input SED)
versioning is now derived from git tags via setuptools-scm; releases are cut with
nox -s release
Fixed#
normalization in
Signalnow handles custom units correctlyforeground is now decimated before being added to the focal plane instead of summed
inverted parameters in the wavelength-centering equation, to avoid a polynomial inversion
wrong wavelength order for
loadPsfPaos
[2.1.1] - CLI Fixed#
Fixed#
missing summary for cli.
[2.1.0] - Hello Python 3.12#
Added#
added unit normalization in Signal
Changed#
dropped support for Python 3.9 and 3.10. Now supports only Python >3.12
test framework changed into pytest
added default value for low frequency time grid
[2.0.1] - stable release#
Added#
improved exosim CLI with new click commands
option to load optical elements from .hdf5 files (LoadOpticalElementHDF5)
option to parse options file replacing a custom keyword with a value (LoadOptions)
added codemeta.json file for better metadata management
warning for misuse of oversampling factor and intra-pixel response function
added support for wavelength dependent limb darkening
Changed#
updated citation information
rp in astronomical signal is now binned with the same binning method as Signal
Fixed#
Custom SED units and documentation (added missing angle in loadCustom.py)
find keys is not case sensitive anymore
cosmic rays now work for low rates
fixed elliptical PSF from PAOS
ADC offset implemented as trigger offset (no negative values)
astronomical signal now is weighted by the stellar flux on the detector
[2.0.0-rc2] - ADC automode fix and minor improvements#
Added#
boundaries for random amplitude in gain noise
option to force non-time-dependent PSF for LoadPsfPaos (time_dependence parameter to False)
option to slice jitter to save memory when the focal plane is sampled at high frequencies (slicing parameter to True)
Changed#
dependencies versions updated to support Poetry for Python 3.10
Fixed#
added offset and “auto” mode to ADC
removed Numba in populateFocalPlane (better numerical accuracy)
interp2d replaced with RectBivariateSpline in LoadPsfPaos to support Scipy 1.10+
[2.0.0-rc1] - Scipy compatibility fix#
Added#
.npy input support for pixel non-linearity coefficients (LoadPixelsNonLinearityMapNumpy)
multiplicative noise simulator (AddGainNoise)
Fixed#
replaced scipy.convolve with scipy.signal.convolve
ADC now works with unsigned integers
[v2.0.0-rc0] - Release Candidate#
Cleaned repository