- Enabled support for python 3.13 and numpy 2.0.
- Fixed some detection statistic / output values corner cases.
- E.g. in case the user wants
twoFX(viasingleFstatsoption), but notBSGL. - This includes fixes for regressions in 2.2.0.
- E.g. in case the user wants
- Added
t0_MPandtau_MPmax-posterior estimates in transient outputs, following lalpulsar conventions.- Correspondingly, renamed the max-likelihood values to
t0_MLandtau_ML.
- Correspondingly, renamed the max-likelihood values to
- Added support for
BtSGdetection statistic inSearchOverGridFile. - Improved logging of grid search classes.
- Added
utils.translate_keys_to_lal()function.
- Changed the core F-stat functions to alternatively take parameter-space points as dictionaries. The old individual arguments are still supported, but deprecated and will be removed in a future version.
- Added new function
utils.plot_spectrogram. - Added support for spindown orders >3 in Writer and search classes (up to
lalpulsar.PULSAR_MAX_SPINS). - Added SearchOverGridFile class that can read a grid file following the format of
lalpulsar_ComputeFStatistic_v2. - Some internal refactoring of code between mcmc, grid and core classes.
- Updated various dependencies, mostly for developers.
- Pinned chainconsumer dependency to <1.0.
- Added codespell to pre-commit hooks.
- Fixed some deprecations and code-formatting issues.
- Extended tests.
- Changed tutorial notebooks plotting from pcolorfast to pcolormesh.
- This is a maintenance release for updating python and numpy compatibility and fixing minor bugs.
- Dropped python 3.8 support.
- Enabled python 3.12 support.
- Enabled support for numpy >=1.24.0 as long as it's still <2.0.
- Fixed binder notebooks.
- Fixes to some MCMC plotting methods in case of returning fig and axes (rather than saving to files).
- Fix for transient parameters in get_predict_fstat_parameters_from_dict().
- for developers: upgraded to black 24 style, refactored and updated the github actions
- Pinned to python<3.12 until more dependencies are updated and a few things fixed on our end.
- Fixed compatibility with matplotlib=3.8 and bumped minimum requirement to >=3.3.
- Fixed pulling in ephemerides via lalpulsar optional dependency.
- Fixed line simulation in "generating noise" tutorial.
- Fixed some type checks to conform to flake8>=1.7 standards.
- PyPI uploads now done using "trusted publishing" (OIDC).
- This is a major release of PyFstat in the sense that users will likely have to make some changes to the way they call it, but mostly just regarding class instance labels / file naming.
- Mainly, we follow the recent
lalpulsarupgrade to v3 of the SFT file format specification (see https://dcc.ligo.org/T040164-v2/public and note the v2 in the URL is not a typo, this file version describes both the v2 and v3 specifications).- We now require
lalsuite>=7.13. - The file format update itself is fully backwards compatible: the only change is including window information in the header, which however reuses existing padding bytes, and hence does not affect compatibility.
- The file naming convention however has become more restrictive:
SFT files, and hence
labelarguments forWriterand derived classes, now may only contain ASCII alphanumerical characters, which specifically makes the old PyFstat habit of using underscores illegal. We suggest CamelCase instead. - Instead of
SFTWindowBeta, one must now useSFTWindowParam. noiseSFTsno longer requiresSFTWindow[Beta/Param], only if a window specification cannot be read from the headers of input SFTs.
- We now require
- Fixed an error that prevented one parameter to be printed in search output file header comments.
- Fixed compatibility with
corner=2.2.2. - Removed
utils.get_lal_exec(), now always expect executables to be namedlalpulsar_. (Old LALSuite versions withlalapps_CW executables are quite outdated by now.) - Removed deprecated prior formats in
InjectionParametersGeneratorclass. - Transient F-stat GPU implementation:
- Introduced F-stat condition number check,
with threshold equivalent to defaults of
XLALComputeAntennaPatternSqrtDeterminant()andestimateAntennaPatternConditionNumber(). - Now falls back to F=2 (2F=4) if Ddinv=0,
also equivalent to
lalpulsar. - Added unit tests.
- Improved CUDA device info logging.
- Introduced F-stat condition number check,
with threshold equivalent to defaults of
- For developers: updated coding style to
black23.1.0 rules (mostly newlines policy).
- Pinned to
numpy<1.24.0to avoid incompatibility withptemcee.
- This is the first PyFstat release to officially support python 3.11.
- LALSuite is introducing an SFT specification and filename update
- see https://dcc.ligo.org/T040164-v2/public)
- This version of PyFstat is pinned to
lalsuite<=7.11(orlalpulsar<6.0) so that it is ensured to keep working with the old convention. - Next PyFstat release will adapt to the LALSuite changes.
- Added
get_official_sft_filename()utility function to ease migration.
- Improvements to
injection_parametersmodule with new priors logic (see documentation); old input style still supported for now but deprecated. Writer: improved timestamps handling: support 1-column format (without nanoseconds), which has been the LALPulsar default for a while.- Changed
ComputeFstat.write_atoms_to_file()method to use consistent%%comment markers. - Fixed segfault in
get_semicoherent_single_IFO_twoFs()with recent LALSuite (need to properly copy FstatAtomVector struct). - Fixed
TransientGridSearchwhen not setting any actual transient parameters. - Added (h0,cosi)<->(aplus,across) functions to
utils.converting. - Added
utils.atomsubmodule with tools related to F-stat atoms. utils.get_sft_as_arrays()now user-accessibleWriter: warning about inferring parameters (innoiseSFTs is not Nonecase) downgraded to info message- improvements to documentation and test suite
- fixed finalizer setup for calling
ComputeFstatand its children in context-manager mode - reverted "walrus operators" (
:=) and use ofLiteraltyping checks to facilitatepython 3.7backwards compatibility (not officially supported from release, but can be easily restored on branches / local clones) - lalsuite-from-source install instructions no longer included in README, now live on wiki
- fixed logging use in examples
- improved testing of tutorial notebooks
- refurbished logging system:
- on
import.pyfstat, stdout logging at INFO level is activated unless there are already handlers attached to the root logger - recommended to further call
pyfstat.set_up_loggerand define an output log file, as demonstrated in our examples - see https://pyfstat.readthedocs.io/en/v1.18.0/pyfstat.html#module-pyfstat.logging for details
- removed the last global argparse options
--quiteand--verbose, along with the remainders of thehelper_functions.set_up_command_line_arguments()function. Please usepyfstat.set_up_loggerinstead to determine verbosity level. - tests now by default print all >=WARNING messages even for passing cases and full >=INFO for failing cases
- improved handling of LALSuite executables through
run_commandline- better stderr/stdout capture
- return is now either a
subprocess.CompletedProcessobject orNone - default is now
return_output=False log_levelargument removed (please usepyfstat.set_up_loggerinstead)
- capture and handling of output from SWIG-wrapped LALSuite functions likely to be further improved in future versions
- on
- refactored
helper_functionsmodule intoutilssubpackage with multiple source files;- user can access all functions directly as
utils.some_functionwithout worrying about the level one further down - moved
matplotlibsetup into newutils.safe_X_less_plt() - removed deprecated/unused helper functions
get_peak_valuesget_comb_valuesget_sft_array
- user can access all functions directly as
- can install with
NO_LALSUITE_FROM_PYPIenvironment variable, e.g. to avoid duplication of dependencies from conda and pip (now used this way in recommendedpyfstat-dev.yml) - removed
peakutilsdependency - optional
[dev]set of dependencies now also includesdocsdependencies - added
sphinx_autodoc_typehintstodocsdependencies and updated pinned versions of other sphinx packages DetectorStates: fixed passing plain lists as values of atimestampsdict
- dropped python 3.7 support
- dropped dependency on
lalappsand now requiringlalpulsar>=5.0.0instead, where LALSuite executables now live (corresponding tolalsuite>=7.7)- there is a
get_lal_exec()helper function to still allow running on old installations where the executables live inlalapps
- there is a
- removed most of the old package-level hardcoded
argparseoptions, this should reduce conflicts when users import it in their own caller scripts:--cleanto be given as an argument to supporting classes-Nto be given as class argumentnum_threadsto the one classFrequencyModulatedArtifactWriterthat supported it--setup-onlyand--no-template-countingto be given as class arguments to the (now deprecated)MCMCFollowUpSearch--no-interactivewas not supported anywhere
- LaTeX no longer enabled for plotting by default
- removed
bashplotlibdependency and SFT timestamps ASCII art - removed fallbacks in case
tqdmis not available, which is a dependency anyway snrclass: fixed behaviour when instantiating with a dictionary of timestamps- removed old backwards compatibility code from
FrequencyModulatedArtifactWriter - developers: updated pre-commit hooks
- include local versions of autocorr functions from
ptemceeto restore compatibility withnumpy>=1.23.0 Writer: remove deprecatedtimestampsFilesoption, please use the more generaltimestampsinstead- added
BtSGoption to transient searches (transient Bayes factor from PGM2011) pyTransientFstatMapis now available viaimport pyfstat- some refactoring of internal detection statistics functions
- use of
lalapps_tconvertreplaced by newgps_to_datestr_utc()helper function (which usesXLALGPSToUTCanddatetime) - fix CUDA context detaching at garbage collection time for
ComputeFstatandTransientGridSearchclasses- using
weakref - should not require any caller code changes in standard use cases
- but if user wants to initiate more than one such object from one session/script,
these should be used in context manager style (
with ComputeFstat asetc)
- using
- remove redundant complex entries from output of
tcw_fstat_map_funcs.reshape_FstatAtomsVector() - streamline installation instructions for developers and remove single-use helper bash scripts
- pin
numpy<1.23.0to work aroundptemceeincompatibility pyfstat.__version__now reported with the leadingvstripped out (e.g. just1.15.0)- added new method
compute_h0_from_snr2()toSignalToNoiseRatioclass init_transient_fstat_map_features()now is stricter about feature name strings- added tutorial notebooks to binder
- improved installation instructions
- fixed
phi0argument name tophiinSignalToNoiseRatio.compute_snr2()function to match conventions elsewhere - fixed syntax error in
Writerwhen both timestamps and detector names are given - added new set of intro notebooks
in
examples/tutorials
- new dependencies:
attr(core),flaky(for tests only) - removed deprecated option to use
$LALPULSAR_DATADIRfor ephemerides - added
SignalToNoiseRatioclass (equivalent tolalapps_PredictFstat) andDetectorStateshelper class in newsnrmodule InjectionParametersGeneratorand its children moved to separate moduleinjection_parametersWriter(and its children) now acceptstimestampsas a list, dict over detectors, or comma-separated string of files per detector (timestampsFilesinput is now deprecated)- some simplifications to
Writerinternal methods - for developers:
- test suite now split up by module,
full suite can now be run with
pytest tests/ - flaky MCMC tests will be rerun 3 times if needed
- now enforcing
isortimport ordering style and some other simple pre-commit-hook rules
- test suite now split up by module,
full suite can now be run with
- add new helper function
get_sft_as_arrays() - deprecate
get_sft_array() - the new one supports multiple IFOs and returns full complex amplitude info
- note that the order of returned values is different
- now tested for python 3.10
- simpler handling of ephemerides files:
- lalsuite >= 7.2.0 (lalpulsar >= 3.1.1) now includes a sufficient minimal set by default and has gotten much better at resolving default paths
- no manual setup should be required any more for
pipinstalls - remove download script
- deprecate using
$LALPULSAR_DATADIR
- bump LALSuite version requirements correspondingly
Writerclasses: fix bug with spurious expected filename mismatch if givennoiseSFTsincluding multiple frequency-segmented SFTsGridSearchnow hasgenerate_loudest()method like MCMC classes- fix some deprecation warnings
- add backwards compatibility workaround
for lalapps 7.3.0 in
FrequencyModulatedArtifactWriterto fix running with conda dependencies
- drop python 3.6 support
- require LALSuite >= 7.1
- no longer pinning numpy
- resolved various deprecation warnings
- follow updated "narrowband" SFT file name convention from lalapps_splitSFTs
- new
timestampsFilesoption forWriterclasses - new
allowedMismatchFromSFTLengthoption for core and MCMC classes - new
singleFstatsoption forComputeFstatand derived classes - new
randSeedoption forComputeFstatand derived classes for reproducible on-the-fly Gaussian noise generation - fix data-from-disk reuse in
LineWriterand some internal cleanup toWriterand derived classes in general
- new reference paper for PyFstat: https://doi.org/10.21105/joss.03000
- all requirements are now handled through setup.py,
e.g. instead of
pip install -r requirements.txtand manually installing optional dependencies, just usepip install pyfstat[optionalpackage] - improved formatting of MCMC corner plots
- extended cumulative 2F plots for the transient case
- ComputeFstat.get_semicoherent_twoF() now returns its value
- minor internal cleanups
- test coverage improvements
- PyPI source tarball for v1.11.4 didn't include files needed to build conda package
- improved codecov setup
- no actual changes to package
- python 3.9 now supported
- improvements to documentation and examples
- for developers: flake8-docstrings and flake8-executable rules now enforced
- added a codemeta.json file
- started tracking test coverage with codecov
- added LineWriter class for simulating unmodulated noise artifacts
- pinned numpy dependency to <1.20 to fix incompatibility with lalsuite 6.81
- updated ephemerides instructions and citation requests in README
- fixed FrequencyModulatedArtifactWriter class
- matplotlib will no longer be automatically forced to
agg, but only ifenv["DISPLAY"]is not set - improved default scaling of MCMC corner plots
- fixed missing unit for
tpbinary parameter in MCMC default plot labels
- LALSuite >= 6.80 now required
- simplified calls to F-stat prediction
- Writer:
- internal cleanup of sftfilenames vs sftfilepath
- SFTs are validated at end of
run_makefakedata()
- core and search classes: improved and fixed non-standard detection statistics
- fixed basic twoFX and BSGL computation logic for transient and semicoherent cases, generalized to Ndet>2
- reorganised methods for these computations
- additional results are stored as class attributes
- for transients, the detection statistic is now called explicitly
maxTwoF
- grid classes now initiate their
.searchobject at instantiation instead of at firstrun()call
- bugfix for
MCMCSearch.plot_prior_posterior()
- documentation now available from https://pyfstat.readthedocs.io
- and examples can be run on https://mybinder.org/v2/gh/PyFstat/PyFstat/master
- still being improved
- added
gridcornermodule for plotting GridSearch results - removed the specialist grid-based classes which were deprecated in 1.9.0
- internal changes to search classes
- should ideally not change anything for standard CW use cases
- but fix some corner cases and make for more robustness
- made tstart,tend optional in
get_fullycoherent_twoF() - adapted most high-level search classes to this change
- grid searches now internally use named-column ndarrays
- some cleanup to keys storage in MCMC classes
- changed
helper_functions.get_doppler_params_output_format()to return dict - fixed sorting of output fmt specifiers for both MCMC and grid classes
- changed
GridSearch.inititate_search_object()to internal method_initiate_search_object()
- line-robust statistics are now always stored and returned as log10BSGL (for consistency with LALSuite)
- made various class methods private that had no obvious end-user use case
MCMCSearch.run(): initiate search object before checking for old dataMCMCGlitchSearch.plot_cumulative_max(): add savefig option (defaults to false)GridSearch.plot_2D(): renamendsaveoption tosavefigfor consistency with other plotting functions- removed unused
ComputeFstat.get_full_CFSv2_output() - removed unused helper functions:
compute_P_twoFstarcheck()compute_pstar()twoFDMoffThreshold()
- new example
other_examples/PyFstat_example_spectrogram.py - some improvements to tests and examples
- KNOWN ISSUES: implementation of line-robust statistic BSGL will need to be overhauled
- new class
InjectionParametersGenerator- draws dicts of parameters from arbitrary priors
- can then be directly passed e.g. to Writer as
**params - and derived
AllSkyInjectionParametersGenerator
- deprecate various grid-based specialist classes:
- these were all more or less unmaintained since a long time
- SliceGridSearch
- GridUniformPriorSearch
- SlidingWindow
- FrequencySlidingWindow
- EarthTest
- DMoff_NO_SPIN
- will be removed in next version unless users speak up
- these were all more or less unmaintained since a long time
- big overhaul of cumulative twoF calculations and plotting
- Writer: fix expected sftfilepattern in multi-IFO and custom-TSFT cases
- fixed internal consistency of parameter names:
- Freq->F0 and phi0->phi for all PyFstat classes/functions
- consistent conversion to lalappas arguments
- fixed parsing of injectSqrtSX and assumeSqrtSX arguments
- helper_functions.predict_fstat() no longer takes
**kwargs - new instructions and helpful scripts for setting up developer environments (venv or conda)
- various improvements to test suite
- GridSearch: will now always include the end point in each 1D parameter points array
- restored MCMCSearch.plot_chainconsumer() to a workable state
- optional dependency checked and documented more cleanly
- the injections parameter option for this is actually called "truth" not "truths
- fixed checks of injection parameter keys for other MCMC plotting functions
- improved GridSearch.check_old_data_is_okay_to_use()
- minor logging improvements for Writer, GridSearch, TransientGridSearch
- new binary_mcmc_vs_grid example
- minor improvements to tests and other examples
- LALSuite 6.76 now required
- predict_fstat() helper function made more flexible
- Writer: fixed check_cached_data_okay_to_use() for multiple IFOs
- MCMCSearch and derived classes now store sampler as an attribute
- fixes to MCMC plotting
- proper scaling of injection parameters in walker plots
- proper display of prior (not logprior) in prior_posterior comparisons
- consistently close figure objects after saving
- all classes now announce their creation to the logger
- flake8 compliance
- code style now complying to stricter black 20.8b standards
- improvements to examples
- Writer: fix binary tp handling and clean up injection parameter parsing
- MCMCSearch plotting improvements:
- add injection parameters through "truths" kwarg
- F->2F fixes
- fix failures for single-parameter posteriors
- removed unused Bunch class
- refactored some core functions into BaseSearchClass methods or moved to helper_functions
- removed deprecated options/functions:
- ComputeFstat option estimate_covering_band
- Writer options minStartTime, maxStartTime
- MCMCSearch.get_median_stds()
- new internal class SearchForSignalWithJump which SemiCoherentGlitchSearch and GlitchWriter inherit from
- Writer classes, including several backwards-incompatbile changes:
- removed lots of default values where there isn't really a logical "default"; e.g. detectors and signal parameters now always need to be explicitly set.
- more flexible setup getting info from noiseSFTs (tstart, duration now optional and used as constraints)
- can now auto-estimate SFT frequency band if not set by user (assuming a single-template search)
- added manual ephemerides options
- removed add_noise option, same behaviour can still be controlled through options sqrtSX or noiseSFTs
- no .cff file generated any more if h0==0 (no signal)
- verbose option for make_cff() and make_data() methods
- clearer error messages in many cases
- ComputeFstat, SemiCoherentSearch and derived classes:
- fixed internal maxStartTime default if not set by user
- by that, fixed the SemiCoherentSearch segments auto-setup
- added Tsft as user option
- clearer error and logging messages
- improved helper_functions.get_sft_array()
- extended, cleaned up and further modularised test suite
- updated examples to changes in Writer and other classes
- fixed semi-coherent search bug introduced in 1.5.0:
- last segment was always skipped due to off-by-one error in segment boundary calculation.
- MCMC searches:
- extended print_summary() with new get_summary_stats() helper and deprecated get_median_stds()
- fixes to some of the more exotic prior types.
- Extended MCMC test coverage.
- The only change in this release is an updated README to point to the new 1.5+ Zenodo record.
- new default coverage band behaviour for all search classes:
- estimate from search ranges (GridSearch) or prior (MCMCSearch) unless minCoverFreq, maxCoverFreq set
- negative values can be used to reproduce old default of setting from SFT width
- explicit option estimate_covering_band deprecated
- semicoherent searches:
- sped up by only calling ComputeTransientFstatMap once per point
- BSGL now computed from summed F-stats, not for each segment
- per-segment results now stored in attribute twoF_per_segment instead of det_stat_per_segment
- MCMC searches: save twoF for each sample to .dat file
- Writer:
- options minStartTime, maxStartTime deprecated
- always use tstart, duration for actual data range
- and use transientStartTime, transientTau for transients
- transient-on-GPU output file writing fix
- examples:
- all output now goes to a directory "PyFstat_example_data"
- added mcmc_vs_grid_simple_example
- small fixes to search classes:
- get_max_twoF() fixed for TransientGridSearch
- fix column header format for per-Doppler-point transient Fmn output files
- fixed regexp deprecation warning
- throw warning if using MCMCSearch.generate_loudest() called for transients
- Writer: fix SFT counting for non-contiguous or overlapping SFTs
- now fully python3.8 compatible
- now using versioneer for versioning
- require lalsuite>=6.72
- added docker images, provided through github packages
- Writer class:
- new options randSeed, noiseSFTs and windowing
- change default sqrtSX from 1 to 0
- improved support for sources in binaries
- search classes:
- improved support for sources in binaries
- additional file outputs for MCMC (including full posterior samples)
- improved output file headers with version and options strings
- improved MCMC walker plotting
- implemented CFS feature injectSqrtSX
- manual ephemerides option
- new options estimate_covering_band and RngMedWindow
- extended get_covering_band() to deal with fkdot bands
- improved GridSearch logic to reuse (or not) old results
- removed injection_helper_functions module
- fixed placement of temporary output files
- improved error handling for lal programs
- added 1to1 test against CFSv2
- reorganised and improved examples
- various minor bug fixes and code cleanup
- python3 migration
- enforce black style checker
- smarter ephemerides finding
- pycuda as optional dependency
- improved test suite
- improved logic in Writer class
- fixes to ComputeFstat flags handling
- various minor bug fixes
- reorganised examples
- timing of transient F-stat map function
- see git commit history