Repository: PlasmaPy/PlasmaPy

Issue:
Make  `particle` a required keyword to `ParticleTracker.load_particles`? 
### Feature description

Right now this method assumes that the particles being added are protons, but I wonder if that's really a good default? Maybe that keyword should be required, just to be explicit? 

```python
@particle_input
    def load_particles(
        self,
        x,
        v,
        particle: Particle = Particle("p+"), 

```

### Motivation

Avoid anyone accidentally creating particles with the wrong mass/charge 

### Implementation strategy

_No response_

### Additional context

_No response_


Discussion:
I'm in favor of this!  Having implicit particle defaults makes silent errors more likely.

Related to: #453.  
Ok sounds good, should I implement this in #2712 ? Or should this get its own PR
> Ok sounds good, should I implement this in #2712 ? Or should this get its own PR

Maybe make it it's own, small PR, since it is a potential breaking change to the interface. 

Resolving patch:
diff --git a/src/plasmapy/simulation/particle_tracker/particle_tracker.py b/src/plasmapy/simulation/particle_tracker/particle_tracker.py
--- a/src/plasmapy/simulation/particle_tracker/particle_tracker.py
+++ b/src/plasmapy/simulation/particle_tracker/particle_tracker.py
@@ -394,7 +394,7 @@ def load_particles(
         self,
         x,
         v,
-        particle: Particle = Particle("p+"),  # noqa: B008
+        particle: Particle,
     ) -> None:
         r"""
         Load arrays of particle positions and velocities.
@@ -407,9 +407,9 @@ def load_particles(
         v : `~astropy.units.Quantity`, shape (N,3)
             Velocities for N particles
 
-        particle : |particle-like|, optional
+        particle : |particle-like|
             Representation of the particle species as either a |Particle| object
-            or a string representation. The default particle is protons.
+            or a string representation.
         """
         # Raise an error if the run method has already been called.
         self._enforce_order()


Test patch:
diff --git a/tests/diagnostics/charged_particle_radiography/test_synthetic_radiography.py b/tests/diagnostics/charged_particle_radiography/test_synthetic_radiography.py
--- a/tests/diagnostics/charged_particle_radiography/test_synthetic_radiography.py
+++ b/tests/diagnostics/charged_particle_radiography/test_synthetic_radiography.py
@@ -10,6 +10,7 @@
 from plasmapy.diagnostics.charged_particle_radiography import (
     synthetic_radiography as cpr,
 )
+from plasmapy.particles.particle_class import Particle
 from plasmapy.plasma.grids import CartesianGrid
 
 
@@ -444,8 +445,9 @@ def test_load_particles() -> None:
     # Test adding unequal numbers of particles
     x = np.zeros([100, 3]) * u.m
     v = np.ones([150, 3]) * u.m / u.s
+    particle = Particle("p+")
     with pytest.raises(ValueError):
-        sim.load_particles(x, v)
+        sim.load_particles(x, v, particle)
 
     # Test creating particles with explicit keywords
     x = sim.x * u.m
@@ -453,7 +455,7 @@ def test_load_particles() -> None:
 
     # Try setting particles going the wrong direction
     with pytest.warns(RuntimeWarning):
-        sim.load_particles(x, -v)
+        sim.load_particles(x, -v, particle)
 
     # Try specifying a larger ion (not a proton or electron)
     sim.load_particles(x, v, particle="C-12 +3")
diff --git a/tests/simulation/test_particle_tracker.py b/tests/simulation/test_particle_tracker.py
--- a/tests/simulation/test_particle_tracker.py
+++ b/tests/simulation/test_particle_tracker.py
@@ -12,7 +12,7 @@
 
 from plasmapy.formulary.frequencies import gyrofrequency
 from plasmapy.formulary.lengths import gyroradius
-from plasmapy.particles import CustomParticle, Particle
+from plasmapy.particles.particle_class import CustomParticle, Particle
 from plasmapy.plasma import Plasma
 from plasmapy.plasma.grids import CartesianGrid
 from plasmapy.simulation.particle_tracker.particle_tracker import ParticleTracker
@@ -159,7 +159,9 @@ def test_particle_tracker_load_particles_shape_error(
     simulation = ParticleTracker(grid, no_particles_on_grids_instantiated)
 
     with pytest.raises(ValueError):
-        simulation.load_particles([[0, 0, 0]] * u.m, [[0, 0, 0], [0, 0, 0]] * u.m / u.s)
+        simulation.load_particles(
+            [[0, 0, 0]] * u.m, [[0, 0, 0], [0, 0, 0]] * u.m / u.s, Particle("p+")
+        )
 
 
 class TestParticleTrackerGyroradius: