PlasmaPy v0.6.0 (2021-03-14)
============================

The people who have contributed to the code for this release are:

* Anthony Vo
* Dhawal Modi *
* Dominik Stańczak
* Drozdov David *
* Erik Everson
* Kevin Montes *
* Nick Murphy
* Peter Heuer
* Ramiz Qudsi
* Tiger Du

Where a * indicates their first contribution to PlasmaPy.


Backwards Incompatible Changes
------------------------------

- The ``State`` namedtuple was changed to the ``plasmapy.particles.IonicFraction``
  class. (Note: #1046 subsequently changed that to
  `~plasmapy.particles.ionization_state.IonicLevel`). (`#796 <https://github.com/plasmapy/plasmapy/pull/796>`__)
- Now, when the `~plasmapy.particles.ionization_state.IonizationState` class is provided with an ion,
  the ionic fraction for that ion is set to 100% for the corresponding element or
  isotope. (`#796 <https://github.com/plasmapy/plasmapy/pull/796>`__)
- ``AtomicError`` was renamed to `~plasmapy.particles.exceptions.ParticleError`
  and ``MissingAtomicDataError`` was renamed to
  `~plasmapy.particles.exceptions.MissingParticleDataError`. (`#796 <https://github.com/plasmapy/plasmapy/pull/796>`__)
- In `plasmapy.particles`, the ``IonizationStates`` class was renamed to
  `~plasmapy.particles.ionization_state_collection.IonizationStateCollection`.  Argument ``n`` of
  ``IonizationStates`` was changed to ``n0`` in
  `~plasmapy.particles.ionization_state_collection.IonizationStateCollection`. (`#796 <https://github.com/plasmapy/plasmapy/pull/796>`__)
- Moved and refactored error message formatting functionality from
  ``plasmapy.utils.error_messages`` to `plasmapy.utils.code_repr`. (`#920 <https://github.com/plasmapy/plasmapy/pull/920>`__)
- Renamed the available "methods" for computing the Coulomb logarithm in an attempt
  to make the names more explicit.  This is implemented using the ``method`` keyword
  for functions `~plasmapy.formulary.collisions.coulomb.Coulomb_logarithm` and
  `~plasmapy.formulary.collisions.lengths.impact_parameter`, and then propagated throughout
  the functionality in `plasmapy.formulary.collisions`. (`#962 <https://github.com/plasmapy/plasmapy/pull/962>`__)
- Add dependency ``pandas >= 1.0.0``.  Modify ``xarray`` dependency to be
  ``xarray >= 0.14.0``. (`#963 <https://github.com/plasmapy/plasmapy/pull/963>`__)
- The `~plasmapy.plasma.grids.AbstractGrid` property
  `~plasmapy.plasma.grids.AbstractGrid.grid` is now dimensioned (has units) and
  cannot be accessed if all dimensions do not share the same units. (`#981 <https://github.com/plasmapy/plasmapy/pull/981>`__)
- Renamed attribute ``is_uniform_grid`` on `~plasmapy.plasma.grids.AbstractGrid`
  to ``is_uniform``. (`#981 <https://github.com/plasmapy/plasmapy/pull/981>`__)
- Drop Python 3.6 support. (`#987 <https://github.com/plasmapy/plasmapy/pull/987>`__)
- The ``__getitem__`` method of `~plasmapy.plasma.grids.AbstractGrid` now returns
  a |Quantity| array instead of a reference to a ``xarray.DataArray``. (`#1027 <https://github.com/plasmapy/plasmapy/pull/1027>`__)
- Renamed ``IonicFraction`` to `~plasmapy.particles.ionization_state.IonicLevel`.
  This lays groundwork for future changes, where that class is going to become
  more than a fraction. (`#1046 <https://github.com/plasmapy/plasmapy/pull/1046>`__)


Deprecations and Removals
-------------------------

- The ``particle`` attribute of `~plasmapy.particles.particle_class.Particle`
  has been deprecated in favor of the new ``symbol`` attribute.  The ``particle``
  attribute now issues a `FutureWarning` to indicate that it will be removed in
  a future release. (`#984 <https://github.com/plasmapy/plasmapy/pull/984>`__)


Features
--------

- Created the `~plasmapy.simulation.abstractions.AbstractNormalizations` class
  to serve as an abstract interface for future classes that represent normalizations. (`#859 <https://github.com/plasmapy/plasmapy/pull/859>`__)
- Create the analysis sub-package `plasmapy.analysis.swept_langmuir` for analysis
  code related to analyzing swept Langmuir traces.  Sub-package is initiated with
  functionality for calculating the floating potential,
  `~plasmapy.analysis.swept_langmuir.floating_potential.find_floating_potential`. (`#889 <https://github.com/plasmapy/plasmapy/pull/889>`__)
- Added a proton radiography diagnostic module containing a tool for generating synthetic proton radiographs from simulated or calculated fields using a particle tracking algorithm. (`#895 <https://github.com/plasmapy/plasmapy/pull/895>`__)
- Created new grid objects for representing plasma quantities as functions of space. (`#909 <https://github.com/plasmapy/plasmapy/pull/909>`__)
- Added functions in `plasmapy.utils.code_repr` to reproduce strings
  that represent a call to a method or attribute of an object. These
  functions are used, for example, in error messages. (`#920 <https://github.com/plasmapy/plasmapy/pull/920>`__)
- Add the function
  ``plasmapy.dispersion.two_fluid_dispersion.two_fluid_dispersion_solution`` to
  `plasmapy.dispersion`, which gives an analytical solution to the dispersion relation as
  derived by :cite:t:`bellan:2012`\ . (`#932 <https://github.com/plasmapy/plasmapy/pull/932>`__)
- Refactor out the ``plasmapy.simulation.particle_integrators.boris_push`` tracking
  integrator algorithm from ``plasmapy.simulation.particletracker.ParticleTracker``. (`#953 <https://github.com/plasmapy/plasmapy/pull/953>`__)
- For `plasmapy.plasma.grids` functionality, add better support for recognizing and
  handling physical quantities (e.g. spatial position, magnetic field, etc.) added
  to a grid object. (`#963 <https://github.com/plasmapy/plasmapy/pull/963>`__)
- For `plasmapy.plasma.grids` functionality, improve interpolation performance on
  non-uniform grids. (`#963 <https://github.com/plasmapy/plasmapy/pull/963>`__)
- Added the `~plasmapy.formulary.drifts.diamagnetic_drift` function to
  `~plasmapy.formulary.drifts`. (`#972 <https://github.com/plasmapy/plasmapy/pull/972>`__)
- Add properties ``grid_resolution`` and
  `~plasmapy.plasma.grids.AbstractGrid.quantities` to
  `~plasmapy.plasma.grids.AbstractGrid`. (`#981 <https://github.com/plasmapy/plasmapy/pull/981>`__)
- Make several speed improvements to the functionality in `~plasmapy.plasma.grids`,
  including the addition of keyword ``persistent`` to
  `~plasmapy.plasma.grids.AbstractGrid` (and child class) methods
  `~plasmapy.plasma.grids.AbstractGrid.nearest_neighbor_interpolator` and
  ``volume_averaged_interpolator``.  This keyword
  allows the interpolators to assume the last grid setup and contents if input
  arguments have not changed. (`#981 <https://github.com/plasmapy/plasmapy/pull/981>`__)
- Add methods `~plasmapy.plasma.grids.AbstractGrid.on_grid` and
  `~plasmapy.plasma.grids.AbstractGrid.vector_intersects` to
  `~plasmapy.plasma.grids.AbstractGrid`. (`#981 <https://github.com/plasmapy/plasmapy/pull/981>`__)
- The `~plasmapy.particles.particle_class.Particle` class now contains an
  attribute named ``symbol`` that is intended to replace ``particle``. The
  ``symbol`` attribute has been added as a property to
  `~plasmapy.particles.particle_class.AbstractParticle`,
  `~plasmapy.particles.particle_class.CustomParticle`, and
  `~plasmapy.particles.particle_class.DimensionlessParticle`. (`#984 <https://github.com/plasmapy/plasmapy/pull/984>`__)
- Added new ``can_be_zero`` check parameter to
  `~plasmapy.utils.decorators.checks.CheckValues` and its dependents (
  `~plasmapy.utils.decorators.checks.check_values`,
  `~plasmapy.utils.decorators.validators.ValidateQuantities`,
  `~plasmapy.utils.decorators.validators.validate_quantities`). (`#999 <https://github.com/plasmapy/plasmapy/pull/999>`__)
- Both `plasmapy.particles.particle_class.CustomParticle` and `plasmapy.particles.particle_class.DimensionlessParticle`
  now allow users to define a custom symbol via the ``symbol`` keyword argument, which
  can then be accessed by the ``symbol`` attribute in each of these classes. (`#1015 <https://github.com/plasmapy/plasmapy/pull/1015>`__)
- The greater than (``>``) operator can now be used between
  `~plasmapy.particles.particle_class.Particle` and/or `~plasmapy.particles.particle_collections.ParticleList`
  instances to get the nuclear reaction energy. (`#1017 <https://github.com/plasmapy/plasmapy/pull/1017>`__)
- Create `plasmapy.particles.particle_collections.ParticleList` as a list-like collection for
  instances of `plasmapy.particles.particle_class.Particle` and
  `plasmapy.particles.particle_class.CustomParticle`.  Adding `~plasmapy.particles.particle_class.Particle`
  and/or `~plasmapy.particles.particle_class.CustomParticle` instances will now create a
  `~plasmapy.particles.particle_collections.ParticleList`. (`#1017 <https://github.com/plasmapy/plasmapy/pull/1017>`__)
- Added method `~plasmapy.plasma.grids.AbstractGrid.require_quantities` to
  `~plasmapy.plasma.grids.AbstractGrid` that verifies a list of quantities is present
  on the grid.  Method is also incorporated into
  ``plasmapy.diagnostics.proton_radiography.SyntheticProtonRadiograph``. (`#1027 <https://github.com/plasmapy/plasmapy/pull/1027>`__)
- Added the
  ``add_wire_mesh()`` method to ``plasmapy.diagnostics.proton_radiography.SyntheticProtonRadiograph``
  to allow the creation of synthetic proton radiographs that include a wire mesh
  reference grid. (`#1049 <https://github.com/plasmapy/plasmapy/pull/1049>`__)
- Created a function, `~plasmapy.formulary.mathematics.rot_a_to_b`, that calculates
  the rotation matrix that will rotate one 3D vector onto another. (`#1054 <https://github.com/plasmapy/plasmapy/pull/1054>`__)
- Made `~plasmapy.plasma.grids.AbstractGrid.is_uniform` a properly-documented
  public attribute of `~plasmapy.plasma.grids.AbstractGrid`. (`#1072 <https://github.com/plasmapy/plasmapy/pull/1072>`__)


Bug Fixes
---------

- Fixed a minus sign bug in the Particle Tracker simulation that caused the
  E×B drift to go in the incorrect direction. (`#953 <https://github.com/plasmapy/plasmapy/pull/953>`__)
- Bugfix :meth:`plasmapy.analysis.fit_functions.Linear.root_solve` to handle the case
  where the slope is zero and no finite roots exist. (`#959 <https://github.com/plasmapy/plasmapy/pull/959>`__)
- Fixed a bug that prevented nested iterations of a single
  `~plasmapy.particles.ionization_state.IonizationState` or
  `~plasmapy.particles.ionization_state_collection.IonizationStateCollection` instance. (`#1025 <https://github.com/plasmapy/plasmapy/pull/1025>`__)
- Fixed a bug in :file:`grids.py` for non-uniform grids that arose when ``xarray`` upgraded
  to ``v0.17.0`` (`#1027 <https://github.com/plasmapy/plasmapy/pull/1027>`__)
- In ``plasmapy.diagnostics.proton_radiography.SyntheticProtonRadiograph``,
  adaptive ``dt`` now calculates the cyclotron period using the provided particle
  charge and mass (previously assumed protons). (`#1035 <https://github.com/plasmapy/plasmapy/pull/1035>`__)
- In ``plasmapy.diagnostics.proton_radiography.SyntheticProtonRadiograph``,
  the adaptive timestep algorithm now works when particles are provided using
  ``plasmapy.diagnostics.proton_radiography.SyntheticProtonRadiograph.load_particles``. (`#1035 <https://github.com/plasmapy/plasmapy/pull/1035>`__)
- In ``plasmapy.diagnostics.proton_radiography.SyntheticProtonRadiograph``, removed
  highly deflected particles so the call of
  ``plasmapy.diagnostics.proton_radiography.SyntheticProtonRadiograph.max_deflection``
  does not raise an exception. (`#1035 <https://github.com/plasmapy/plasmapy/pull/1035>`__)


Improved Documentation
----------------------

- Add narrative documentation on ionization state functionality. (`#796 <https://github.com/plasmapy/plasmapy/pull/796>`__)
- Added description to ``plasmapy.formulary.parameters.Hall_parameter``
  signature and equation in docstrings. (`#934 <https://github.com/plasmapy/plasmapy/pull/934>`__)
- Updated documentation for the `plasmapy.particles` and `plasmapy.utils` subpackages. (`#942 <https://github.com/plasmapy/plasmapy/pull/942>`__)
- Improves documentation of :file:`plasmapy/formulary/quantum.py` by cleaning up docstrings of contained functionality. (`#951 <https://github.com/plasmapy/plasmapy/pull/951>`__)
- Update all docstrings associated with computing the Coulomb logarithm and the
  possible methods of calculation. (`#962 <https://github.com/plasmapy/plasmapy/pull/962>`__)
- Add two Jupyter notebooks for functionality contained in `plasmapy.plasma.grids`:
  :file:`grids_cartesian.ipynb` and :file:`grids_nonuniform.ipynb`. (`#963 <https://github.com/plasmapy/plasmapy/pull/963>`__)
- Added the ExB drift notebook, which demonstrates the analytical solution for the
  drift and the implementation of the corresponding formulary drift functions,
  `~plasmapy.formulary.drifts.force_drift` and `~plasmapy.formulary.drifts.ExB_drift`. (`#971 <https://github.com/plasmapy/plasmapy/pull/971>`__)
- Describe what constitutes a valid representation of a particle in the docstring
  for the `plasmapy.particles.particle_class.ParticleLike` typing construct. (`#985 <https://github.com/plasmapy/plasmapy/pull/985>`__)
- Put the docstring for `plasmapy.particles.particle_class.Particle.is_category` into
  ``numpydoc`` format. (`#1039 <https://github.com/plasmapy/plasmapy/pull/1039>`__)
- Adds formulas (which were missing) to the docstrings of
  ``plasmapy.formulary.dimensionless.quantum_theta`` and
  `~plasmapy.formulary.dimensionless.beta`. (`#1041 <https://github.com/plasmapy/plasmapy/pull/1041>`__)
- Add live rendering of changelog entries on documentation builds, based on
  `sphinx-changelog <https://github.com/OpenAstronomy/sphinx-changelog>`_. (`#1052 <https://github.com/plasmapy/plasmapy/pull/1052>`__)
- Created an example notebook demonstrating how the
  ``plasmapy.diagnostics.proton_radiography.SyntheticProtonRadiograph`` class can be
  used to generate synthetic proton radiographs with arbitrary source profiles.  Add
  code documentation links to all proton radiograph notebooks. (`#1054 <https://github.com/plasmapy/plasmapy/pull/1054>`__)
- Update formatting and broken `sphinx.ext.intersphinx` links in `plasmapy.formulary` docstrings. (`#1058 <https://github.com/plasmapy/plasmapy/pull/1058>`__)
- Make minor fixes in `plasmapy.particles` docstrings. (`#1064 <https://github.com/plasmapy/plasmapy/pull/1064>`__)
- Organize the layout of the example Jupyter notebooks on the Read the Docs
  example page. (`#1066 <https://github.com/plasmapy/plasmapy/pull/1066>`__)
- Fix formatting and broken `sphinx.ext.intersphinx` links in docstrings in
  various places in the code base. Improve installation instructions in the docs;
  the subpackage stability matrix, and funding acknowledgments. (`#1076 <https://github.com/plasmapy/plasmapy/pull/1076>`__)


Trivial/Internal Changes
------------------------

- Removed ``colorama`` as a dependency. (`#920 <https://github.com/plasmapy/plasmapy/pull/920>`__)
- Moved remaining CI from CircleCI to GitHub Actions. (`#996 <https://github.com/plasmapy/plasmapy/pull/996>`__)
- Add notebook CI through ``nbqa``. (`#997 <https://github.com/plasmapy/plasmapy/pull/997>`__)
- Remove ``lambda`` expressions from `plasmapy.particles` and `plasmapy.utils`. (`#1013 <https://github.com/plasmapy/plasmapy/pull/1013>`__)
- Add unicode particle aliases for electrons (``"β-"``, ``"β⁻"``), muons
  (``"μ-"``, ``"μ⁻"``), anti-muons (``"μ+"``, ``"μ⁺"``), tau particles
  (``"τ"``, ``"τ-"``, ``"τ⁻"``), anti-tau particles (``"τ+"``, ``"τ⁺"``)
  electron neutrinos (``"ν_e"``), muon neutrinos (``"ν_μ"``), tau neutrinos
  (``"ν_τ"``), and alpha particles (``"α"``). (`#1036 <https://github.com/plasmapy/plasmapy/pull/1036>`__)
- A set containing all valid particle categories may now be accessed via
  ``plasmapy.particles.particle_class.Particle.is_category.valid_categories``. (`#1039 <https://github.com/plasmapy/plasmapy/pull/1039>`__)
- Properly handled warnings in :file:`test_proton_radiography.py` (`#1050 <https://github.com/plasmapy/plasmapy/pull/1050>`__)
