def test_exclude_neutrals_from_average_ion(): """ Test that the `IonizationState.average_ion` method returns a |CustomParticle| that does not include neutrals in the averaging when the ``include_neutrals`` keyword is `False`. """ base_particle = Particle("He-4") ionization_state_without_neutrals = IonizationState(base_particle, [0, 0.2, 0.8]) expected_average_ion = ionization_state_without_neutrals.average_ion() ionization_state_with_neutrals = IonizationState(base_particle, [0.50, 0.1, 0.4]) actual_average_ion = ionization_state_with_neutrals.average_ion( include_neutrals=False ) assert actual_average_ion == expected_average_ion
def test_weighted_mean_ion(base_particle, ionic_fractions, physical_property): """ Test that `IonizationState.average_ion` gives a |CustomParticle| instance with the expected mass or charge when calculating the weighted mean. """ ionization_state = IonizationState(base_particle, ionic_fractions) ions = ionic_levels(base_particle) physical_quantity = getattr(ions, physical_property) expected_mean_quantity = np.average(physical_quantity, weights=ionic_fractions) mean_ion = ionization_state.average_ion() actual_mean_quantity = getattr(mean_ion, physical_property) assert_quantity_allclose(actual_mean_quantity, expected_mean_quantity)
def test_comparison_to_equivalent_particle_list(physical_property, use_rms): """ Test that `IonizationState.average_ion` gives consistent results with `ParticleList.average_particle` when the ratios of different particles is the same between the `IonizationState` and the `ParticleList`. """ particles = ParticleList(2 * ["He-4 0+"] + 3 * ["He-4 1+"] + 5 * ["He-4 2+"]) ionization_state = IonizationState("He-4", [0.2, 0.3, 0.5]) kwargs = {f"use_rms_{physical_property}": True} expected_average_particle = particles.average_particle(**kwargs) expected_average_quantity = getattr(expected_average_particle, physical_property) actual_average_particle = ionization_state.average_ion(**kwargs) actual_average_quantity = getattr(actual_average_particle, physical_property) assert_quantity_allclose(actual_average_quantity, expected_average_quantity)
def test_weighted_rms_ion(base_particle, ionic_fractions, physical_property): """ Test that `IonizationState.average_ion` gives a |CustomParticle| instances with the expected mass or charge when calculating the weighted root mean square. """ ionization_state = IonizationState(base_particle, ionic_fractions) ions = ionic_levels(base_particle) physical_quantity = getattr(ions, physical_property) expected_rms_quantity = np.sqrt( np.average(physical_quantity**2, weights=ionic_fractions)) kwargs = {f"use_rms_{physical_property}": True} rms_ion = ionization_state.average_ion(**kwargs) actual_rms_quantity = getattr(rms_ion, physical_property) assert_quantity_allclose(actual_rms_quantity, expected_rms_quantity)