diff --git a/news/getmud.rst b/news/getmud.rst new file mode 100644 index 0000000..d1de864 --- /dev/null +++ b/news/getmud.rst @@ -0,0 +1,23 @@ +**Added:** + +* New ``getmuD`` module with ``get_diameter`` function to calculate capillary diameter. + +**Changed:** + +* + +**Deprecated:** + +* + +**Removed:** + +* + +**Fixed:** + +* + +**Security:** + +* diff --git a/src/diffpy/labpdfproc/getmud.py b/src/diffpy/labpdfproc/getmud.py new file mode 100644 index 0000000..3d82b70 --- /dev/null +++ b/src/diffpy/labpdfproc/getmud.py @@ -0,0 +1,38 @@ +from diffpy.utils.tools import compute_mu_using_xraydb + + +def get_diameter( + mud, + sample_composition, + xray_energy, + sample_mass_density=None, + packing_fraction=None, +): + """ + Compute capillary diameter (mm) from muD, sample composition, energy, + and either sample mass density or packing fraction. + + Parameters + ---------- + mud : float + The given muD of the sample. + sample_composition : str + The chemical formula of the material (e.g. "ZrO2"). + xray_energy : float + The energy of the incident x-rays in keV. + sample_mass_density : float, optional + The mass density of the packed sample in g/cm^3. + packing_fraction : float, optional + The packing fraction of the sample (0–1). + + Returns + ------- + diameter : float + Computed capillary diameter in mm. + """ + return mud / compute_mu_using_xraydb( + sample_composition, + xray_energy, + sample_mass_density, + packing_fraction, + ) diff --git a/tests/test_getmud.py b/tests/test_getmud.py new file mode 100644 index 0000000..3dd2edd --- /dev/null +++ b/tests/test_getmud.py @@ -0,0 +1,26 @@ +import pytest + +from diffpy.labpdfproc.getmud import get_diameter + + +@pytest.mark.parametrize( + "inputs, expected_diameter", + [ + ( # C1: User specifies target mud, + # sample composition, energy, and mass density + # expect to return diameter + { + "mud": 2.0, + "sample_composition": "ZrO2", + "xray_energy": 17.45, + "sample_mass_density": 1.20, + }, + 1.3439, + ), + ], +) +def test_compute_diameter(inputs, expected_diameter): + actual_diameter = get_diameter(**inputs) + assert actual_diameter == pytest.approx( + expected_diameter, rel=0.01, abs=0.1 + )