Changelog
=========

2.4.1 (2026-03-16)
------------------
  * fix M2_fit() strict-mode trimming so focal-zone points are not discarded
  * fix set_zero_to_lightgray() IndexError when zero lies at the top of the display range
  * fix M2_diameter_plot() minor-axis residual ISO spans to use the minor-axis fit limits
  * fix mypy annotations in human_test_for_phi_fixed.py 
  * eliminate spurious OptimizeWarning from strict-mode M² regression tests

2.4.0 (2026-03-15)
------------------
  * fix plot_beam_diagram() used d_major for minor-rectangle dimension
  * fix plot_image_analysis() minor-axis label compared major-axis variables
  * fix beam_size() crash when d_minor becomes None during iterative refinement
  * fix NaN propagation in basic_beam_fit() when measured diameter is smaller than fitted waist
  * fix divide-by-zero in beam_parameter_product() and M² error propagation when waist or divergence is zero
  * fix hardcoded figure number in m2_display that caused matplotlib warnings on repeated calls
  * fix variable shadowing of plane-fit coefficient b in subtract_tilted_background()
  * fix _format_beam_title() docstring: z parameter is in meters, not mm
  * fix _fmt() NaN check to handle np.floating types, not just Python float
  * fix M2_fit() zone-trimming loops to guard against None index when a zone is exhausted
  * fix beam_parameter_product() zero-check to use np.isclose() instead of exact equality
  * fix plot_image_analysis() minor-axis subplot x-limits used s_major_px instead of s_minor_px
  * fix M2_fit() focal-zone trimming loop ignored the n_outer==4 special-case adjustment
  * fix divide-by-zero in M2_radius_plot() and _fit_plot() when d0==0 and M2<1
  * fix stale laserbeamsize.m2 reference in package docstring
  * fix rotated_rect_mask() docstring: removed non-existent mask_diameters parameter
  * fix _prepare_beam_analysis() docstring: return tuple listed 7 items but function returns 6
  * fix create_test_image() docstring: corrected "magnitued" typo and documented valid ntype values
  * fix elliptical_mask() silent all-False mask for zero diameter: now raises ValueError
  * fix corner_background() docstring: now lists both corner_mean and corner_stdev
  * fix rotate_points() docstring: explains why -phi is used internally
  * replace print() with warnings.warn() in M2_fit() for strict-mode messages
  * replace Python loops with numpy in max_index_in_focal_zone() and min_index_in_outer_zone()
  * remove dead code: basic_beam_size_naive(), rotated_rect_mask_slow(), _mean_filter(), _std_filter(), image_background2()
  * remove unused scipy.ndimage import from background.py
  * add PEP 484 type annotations to all public and private functions across all source modules
  * fix mypy errors that surfaced after adding type annotations
  * add comprehensive tests for all fixed issues

2.3.2 (2026-03-05)
------------------
  * complete `M2_report()` support for focal length 
  * add tests for major/minor fits
  * add entry to 14-M2-Example.ipynb for new M2_report()

2.3.1 (2026-02-04)
------------------
  * fix regression when units=None
  * fix image display in docs
  * update github workflows
  * default python is 3.12
  * all requirements are in pyproject.toml
  * faster testing with pytest
  * fix errors in .yaml files

2.3.0 (2025-11-30)
------------------
  * Jupyterlite updated to 0.64
  * fix bug with strongly asymmetric rotated beams
  * fix jupyterlite import of npy files
  * fix integration rect drawing when mask_diameters is not the default
  * fix handling for failed d_minor calculation
  * add make lab target
  * add make readme target for images
  * improve handling of small images
  * improve plot_image_analysis
  * improve citations
  * refactored functions in display.py
  * background.py works with images having masks

2.2.0 (2025-11-10)
------------------
  * Jupyterlite support on github pages
  * eliminate circular imports
  * use venv for packaging and testing
  * remove setup.py and setup.sh
  * no longer package test files
  * clean up MANIFEST.IN
  * improve pyproject.toml
  * improve README.rst
  * requirements-dev.txt is now complete

2.1.0 (2025-06-10)
------------------
  * make fixed angle work much better (thanks @przemororo)
  * use major axis (d_major) instead of dx (near x-axis)
  * trim distribution down to core files
  * eliminate dependence on pillow and scikit-image
  * correct angle definitions
  * use black for all formatting
  * adopt pyproject.toml with PEP 621 metadata and eliminate setup.cfg
  * lint YAML files and run ruff during make rcheck
  * allow iso_noise option in display and background functions
  * rename tests/test_all_notebooks.py to tests/all_test_notebooks.py
  * replace master branch references with main in docs
  * numerous style and docstring improvements
  * remove flake8
  * bump minimum python version to 3.9
  * eliminate non-standard use of semi-major and semi-minor

2.0.5 (2023-11-28)
------------------
  * fix mistake in focused_diameter (thanks @rdgraham)

2.0.4 (2023-10-24)
------------------
  * fix zenodo and CITATION.cff
  * fix pypi github action
  * fix copyright
  * fix manifest
  * correct README.rst to use `plot_image_analysis()`
  * tweak badges
  * allow fixed phi angle of 0° (thanks @cptyannick)

2.0.3 (2023-09-16)
------------------
  * readthedocs does not do well with new module names

2.0.2 (2023-09-16)
------------------
  * splitting monolithic m2.py
  * added tests for functions in gaussian.py
  * improved docstrings in gaussian.py
  * improved module docstrings in m2_fit and m2_display

2.0.1 (2023-09-14)
------------------
  * trying to get conda release working

2.0.0 (2023-09-14)
------------------
  * change default background removal to match ISO recommendation
  * split monolithic laserbeamsize module in separate modules
  * rationalized functions names
  * add citation stuff
  * add github actions to test and update citation
  * improve readme so images work on pypi.org
  * add conda-forge support
  * update copyright years
  * more badges

v1.9.4 (2022-03-19)
-------------------
  * allow beam angle to be specified during fitting
  * new notebook to illustrate constrained fits
  * improve docstrings and therefore api documentation
  * still better ellipse and rect outlines
  * start adding examples

v1.9.3 (2022-03-15)
-------------------
  * use faster version of creating rotated rect mask
  * move tests to their own directory
  * avoid deprecated np.float
  * improve drawing of rect and ellipse outlines
  * improve some docstrings

v1.9.2 (2022-03-12)
-------------------
  * use both black and white dashed lines
  * fit to d and not d**2
  * add more dunders to __init__.py
  * fix residual calculation broken in v1.9.1

v1.9.1 (2022-03-10)
-------------------
  * centralize version number to a single place

v1.9.0 (2022-03-09)
-------------------
  * add beam_ellipticity()
  * add beam_parameter_product()
  * rotate x-tick labels when more than 10 ticks
  * removed deprecated use of np.matrix()
  * M2_report now includes BPP values
  * improve API docs
  * code linting

v1.8.0 (2021-12-15)
-------------------
  * handle rotated masks properly
  * fix readthedoc configuration

v1.7.3 (2021-08-07)
-------------------
  * create pure python packaging
  * include wheel file
  * package as python3 only

v1.7.2 (2021-03-22)
-------------------
  * allow non-integer beam centers
  * add badges to docs
  * use sphinx-book-theme for docs

v1.7.1 (2021-01-03)
-------------------
  * explicit warning for non-monochrome images in `beam_size()`
  * improve help() messages

v1.7.0 (2020-11-11)
-------------------
  * fix error in identifying major/minor axes in `beam_size_plot()`

v1.6.1 (2020-09-30)
-------------------
  * fix deprecation warning for register_cmap
  * use entire perimeter of background rectangle for tilted background fit
  * fix sphinx and docstyle warnings

v1.6.0 (2020-08-03)
-------------------
  * Add `subtract_tilted_background()`
  * Add M²=1 line to `M2_radius_plot()`
  * try to autoselect line color on images (still imperfect)
  * more documentation tweaks

v1.5.0 (2020-07-28)
-------------------
  * Add M² fitting and plotting
  * rename `visual_report()` to `beam_size_plot()`
  * add `plot_size_montage()`
  * hopefully stable API now
  * allow any colormap, but default to `gist_ncar`
  * extensive documentation of M² fitting process

v1.3.0 (2020-07-28)
-------------------
  * Add another figure to readme
  * Improve `visual_report()`
  * Add `plot_beam_fit()`

v1.2.0 (2020-06-07)
-------------------
  * Add routines to plot values along semi axes
  * Add `visual_report()` for simple beam analysis
  * Fix error when calculating circular radius
  * Add missing scipy requirement
  * Improve README.rst with figure

v1.1.0 (2020-06-02)
-------------------
  * Works dramatically better across a wide range of images
  * Minor API changes to `beam_size()`
  * Use ISO 11146 integration areas
  * Add background routines for corners
  * Add functions for rotations
  * Eliminate old threshold technique
  * Use google docstyle for functions
  * Explain background and integration areas in notebooks
  * Tweak notebooks for clarity

v1.0.2 (2020-03-29)
-------------------
  * use sphinx for documentation
  * revise Jupyter notebooks

v1.0.1 (2017-11-25)
-------------------
  * trivial fix for release.txt
  * improve text
  * remove completed tasks
  * initial commit of 07-M2-Measurement.ipynb
  * bump version

v1.0.0 (2017-11-25)
-------------------
  * first pass at docs
  * General doc improvements
  * add routine to draw default figure
  * handle symmetric case dx=dy better
  * add new definitions and test dx=dy case

v0.2.0 (2017-11-25)
-------------------
  * initial commit
  * ensure float used for sums
  * first public release
