From fd8ca3b70376125bd230b6805d2f84decbffd256 Mon Sep 17 00:00:00 2001 From: yucongalicechen Date: Tue, 6 May 2025 14:43:33 -0400 Subject: [PATCH 1/2] add getmud module with compute_diameter function, and CLI in main --- news/getmud.rst | 24 +++++++++++++ src/diffpy/labpdfproc/getmud.py | 39 +++++++++++++++++++++ src/diffpy/labpdfproc/labpdfprocapp.py | 47 ++++++++++++++++++++++++++ tests/test_getmud.py | 24 +++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 news/getmud.rst create mode 100644 src/diffpy/labpdfproc/getmud.py create mode 100644 tests/test_getmud.py diff --git a/news/getmud.rst b/news/getmud.rst new file mode 100644 index 0000000..88b8c28 --- /dev/null +++ b/news/getmud.rst @@ -0,0 +1,24 @@ +**Added:** + +* New ``getmuD`` module with the ``compute_diameter`` function to calculate capillary diameter. +* CLI now supports ``compute_diameter`` function for target muD via a subcommand. + +**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..a5f345d --- /dev/null +++ b/src/diffpy/labpdfproc/getmud.py @@ -0,0 +1,39 @@ +from diffpy.utils.tools import compute_mu_using_xraydb + + +def compute_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. + """ + mu = compute_mu_using_xraydb( + sample_composition, + xray_energy, + sample_mass_density, + packing_fraction, + ) + return mud / mu diff --git a/src/diffpy/labpdfproc/labpdfprocapp.py b/src/diffpy/labpdfproc/labpdfprocapp.py index 9acfaaa..afb0101 100644 --- a/src/diffpy/labpdfproc/labpdfprocapp.py +++ b/src/diffpy/labpdfproc/labpdfprocapp.py @@ -4,6 +4,7 @@ from gooey import Gooey, GooeyParser from diffpy.labpdfproc.functions import CVE_METHODS, apply_corr, compute_cve +from diffpy.labpdfproc.getmud import compute_diameter from diffpy.labpdfproc.tools import ( known_sources, load_metadata, @@ -207,7 +208,43 @@ def _add_mud_selection_group(p, is_gui=False): return p +def _add_subparsers(p): + """Add subcommands for getmud module.""" + subparsers = p.add_subparsers(dest="subcommand") + get_d_parser = subparsers.add_parser( + "get-diameter", help="Compute capillary diameter." + ) + get_d_parser.add_argument( + "mud", type=float, help="The target muD of the sample." + ) + get_d_parser.add_argument( + "composition", + help="The chemical formula of the material (e.g., ZrO2).", + ) + get_d_parser.add_argument( + "energy", type=float, help="The X-ray energy in keV." + ) + get_d_parser.add_argument( + "mass_density", + type=float, + help="The sample mass density in g/cm^3.", + default=None, + ) + get_d_parser.set_defaults(func=compute_diameter) + return p + + def get_args(override_cli_inputs=None): + """Parse CLI arguments for main processing or subcommand mode.""" + # User enters one of the subcommands + cli_args = override_cli_inputs or sys.argv[1:] + p = ArgumentParser() + p = _add_subparsers(p) + subcommands = ["get-diameter"] + if cli_args and cli_args[0] in subcommands: + return p.parse_args(override_cli_inputs) + + # User does not enter subcommands p = ArgumentParser() p = _add_mud_selection_group(p, is_gui=False) for arg in _define_arguments(): @@ -238,6 +275,16 @@ def main(): if len(sys.argv) == 1 or "--gui" in sys.argv else get_args() ) + if getattr(args, "subcommand", None) == "get-diameter": + diameter = args.func( + mud=args.mud, + sample_composition=args.composition, + xray_energy=args.energy, + sample_mass_density=args.mass_density, + ) + print(f"Capillary Diameter: {diameter:.2f} mm") + return + args = preprocessing_args(args) for filepath in args.input_paths: diff --git a/tests/test_getmud.py b/tests/test_getmud.py new file mode 100644 index 0000000..1494861 --- /dev/null +++ b/tests/test_getmud.py @@ -0,0 +1,24 @@ +import pytest + +from diffpy.labpdfproc.getmud import compute_diameter + + +@pytest.mark.parametrize( + "inputs, expected_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 = compute_diameter(**inputs) + assert actual_diameter == pytest.approx( + expected_diameter, rel=0.01, abs=0.1 + ) From 5fb2d48f519c1befc052a2b13fe31607f58a8221 Mon Sep 17 00:00:00 2001 From: yucongalicechen Date: Thu, 8 May 2025 18:29:41 -0400 Subject: [PATCH 2/2] reformat get_diameter function and restore main module (remove subcommand) --- news/getmud.rst | 3 +- src/diffpy/labpdfproc/getmud.py | 5 ++- src/diffpy/labpdfproc/labpdfprocapp.py | 47 -------------------------- tests/test_getmud.py | 8 +++-- 4 files changed, 8 insertions(+), 55 deletions(-) diff --git a/news/getmud.rst b/news/getmud.rst index 88b8c28..d1de864 100644 --- a/news/getmud.rst +++ b/news/getmud.rst @@ -1,7 +1,6 @@ **Added:** -* New ``getmuD`` module with the ``compute_diameter`` function to calculate capillary diameter. -* CLI now supports ``compute_diameter`` function for target muD via a subcommand. +* New ``getmuD`` module with ``get_diameter`` function to calculate capillary diameter. **Changed:** diff --git a/src/diffpy/labpdfproc/getmud.py b/src/diffpy/labpdfproc/getmud.py index a5f345d..3d82b70 100644 --- a/src/diffpy/labpdfproc/getmud.py +++ b/src/diffpy/labpdfproc/getmud.py @@ -1,7 +1,7 @@ from diffpy.utils.tools import compute_mu_using_xraydb -def compute_diameter( +def get_diameter( mud, sample_composition, xray_energy, @@ -30,10 +30,9 @@ def compute_diameter( diameter : float Computed capillary diameter in mm. """ - mu = compute_mu_using_xraydb( + return mud / compute_mu_using_xraydb( sample_composition, xray_energy, sample_mass_density, packing_fraction, ) - return mud / mu diff --git a/src/diffpy/labpdfproc/labpdfprocapp.py b/src/diffpy/labpdfproc/labpdfprocapp.py index afb0101..9acfaaa 100644 --- a/src/diffpy/labpdfproc/labpdfprocapp.py +++ b/src/diffpy/labpdfproc/labpdfprocapp.py @@ -4,7 +4,6 @@ from gooey import Gooey, GooeyParser from diffpy.labpdfproc.functions import CVE_METHODS, apply_corr, compute_cve -from diffpy.labpdfproc.getmud import compute_diameter from diffpy.labpdfproc.tools import ( known_sources, load_metadata, @@ -208,43 +207,7 @@ def _add_mud_selection_group(p, is_gui=False): return p -def _add_subparsers(p): - """Add subcommands for getmud module.""" - subparsers = p.add_subparsers(dest="subcommand") - get_d_parser = subparsers.add_parser( - "get-diameter", help="Compute capillary diameter." - ) - get_d_parser.add_argument( - "mud", type=float, help="The target muD of the sample." - ) - get_d_parser.add_argument( - "composition", - help="The chemical formula of the material (e.g., ZrO2).", - ) - get_d_parser.add_argument( - "energy", type=float, help="The X-ray energy in keV." - ) - get_d_parser.add_argument( - "mass_density", - type=float, - help="The sample mass density in g/cm^3.", - default=None, - ) - get_d_parser.set_defaults(func=compute_diameter) - return p - - def get_args(override_cli_inputs=None): - """Parse CLI arguments for main processing or subcommand mode.""" - # User enters one of the subcommands - cli_args = override_cli_inputs or sys.argv[1:] - p = ArgumentParser() - p = _add_subparsers(p) - subcommands = ["get-diameter"] - if cli_args and cli_args[0] in subcommands: - return p.parse_args(override_cli_inputs) - - # User does not enter subcommands p = ArgumentParser() p = _add_mud_selection_group(p, is_gui=False) for arg in _define_arguments(): @@ -275,16 +238,6 @@ def main(): if len(sys.argv) == 1 or "--gui" in sys.argv else get_args() ) - if getattr(args, "subcommand", None) == "get-diameter": - diameter = args.func( - mud=args.mud, - sample_composition=args.composition, - xray_energy=args.energy, - sample_mass_density=args.mass_density, - ) - print(f"Capillary Diameter: {diameter:.2f} mm") - return - args = preprocessing_args(args) for filepath in args.input_paths: diff --git a/tests/test_getmud.py b/tests/test_getmud.py index 1494861..3dd2edd 100644 --- a/tests/test_getmud.py +++ b/tests/test_getmud.py @@ -1,12 +1,14 @@ import pytest -from diffpy.labpdfproc.getmud import compute_diameter +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", @@ -18,7 +20,7 @@ ], ) def test_compute_diameter(inputs, expected_diameter): - actual_diameter = compute_diameter(**inputs) + actual_diameter = get_diameter(**inputs) assert actual_diameter == pytest.approx( expected_diameter, rel=0.01, abs=0.1 )