Skip to content

Commit fd8ca3b

Browse files
add getmud module with compute_diameter function, and CLI in main
1 parent 53ee55d commit fd8ca3b

File tree

4 files changed

+134
-0
lines changed

4 files changed

+134
-0
lines changed

news/getmud.rst

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
**Added:**
2+
3+
* New ``getmuD`` module with the ``compute_diameter`` function to calculate capillary diameter.
4+
* CLI now supports ``compute_diameter`` function for target muD via a subcommand.
5+
6+
**Changed:**
7+
8+
* <news item>
9+
10+
**Deprecated:**
11+
12+
* <news item>
13+
14+
**Removed:**
15+
16+
* <news item>
17+
18+
**Fixed:**
19+
20+
* <news item>
21+
22+
**Security:**
23+
24+
* <news item>

src/diffpy/labpdfproc/getmud.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from diffpy.utils.tools import compute_mu_using_xraydb
2+
3+
4+
def compute_diameter(
5+
mud,
6+
sample_composition,
7+
xray_energy,
8+
sample_mass_density=None,
9+
packing_fraction=None,
10+
):
11+
"""
12+
Compute capillary diameter (mm) from muD, sample composition, energy,
13+
and either sample mass density or packing fraction.
14+
15+
Parameters
16+
----------
17+
mud : float
18+
The given muD of the sample.
19+
sample_composition : str
20+
The chemical formula of the material (e.g. "ZrO2").
21+
xray_energy : float
22+
The energy of the incident x-rays in keV.
23+
sample_mass_density : float, optional
24+
The mass density of the packed sample in g/cm^3.
25+
packing_fraction : float, optional
26+
The packing fraction of the sample (0–1).
27+
28+
Returns
29+
-------
30+
diameter : float
31+
Computed capillary diameter in mm.
32+
"""
33+
mu = compute_mu_using_xraydb(
34+
sample_composition,
35+
xray_energy,
36+
sample_mass_density,
37+
packing_fraction,
38+
)
39+
return mud / mu

src/diffpy/labpdfproc/labpdfprocapp.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from gooey import Gooey, GooeyParser
55

66
from diffpy.labpdfproc.functions import CVE_METHODS, apply_corr, compute_cve
7+
from diffpy.labpdfproc.getmud import compute_diameter
78
from diffpy.labpdfproc.tools import (
89
known_sources,
910
load_metadata,
@@ -207,7 +208,43 @@ def _add_mud_selection_group(p, is_gui=False):
207208
return p
208209

209210

211+
def _add_subparsers(p):
212+
"""Add subcommands for getmud module."""
213+
subparsers = p.add_subparsers(dest="subcommand")
214+
get_d_parser = subparsers.add_parser(
215+
"get-diameter", help="Compute capillary diameter."
216+
)
217+
get_d_parser.add_argument(
218+
"mud", type=float, help="The target muD of the sample."
219+
)
220+
get_d_parser.add_argument(
221+
"composition",
222+
help="The chemical formula of the material (e.g., ZrO2).",
223+
)
224+
get_d_parser.add_argument(
225+
"energy", type=float, help="The X-ray energy in keV."
226+
)
227+
get_d_parser.add_argument(
228+
"mass_density",
229+
type=float,
230+
help="The sample mass density in g/cm^3.",
231+
default=None,
232+
)
233+
get_d_parser.set_defaults(func=compute_diameter)
234+
return p
235+
236+
210237
def get_args(override_cli_inputs=None):
238+
"""Parse CLI arguments for main processing or subcommand mode."""
239+
# User enters one of the subcommands
240+
cli_args = override_cli_inputs or sys.argv[1:]
241+
p = ArgumentParser()
242+
p = _add_subparsers(p)
243+
subcommands = ["get-diameter"]
244+
if cli_args and cli_args[0] in subcommands:
245+
return p.parse_args(override_cli_inputs)
246+
247+
# User does not enter subcommands
211248
p = ArgumentParser()
212249
p = _add_mud_selection_group(p, is_gui=False)
213250
for arg in _define_arguments():
@@ -238,6 +275,16 @@ def main():
238275
if len(sys.argv) == 1 or "--gui" in sys.argv
239276
else get_args()
240277
)
278+
if getattr(args, "subcommand", None) == "get-diameter":
279+
diameter = args.func(
280+
mud=args.mud,
281+
sample_composition=args.composition,
282+
xray_energy=args.energy,
283+
sample_mass_density=args.mass_density,
284+
)
285+
print(f"Capillary Diameter: {diameter:.2f} mm")
286+
return
287+
241288
args = preprocessing_args(args)
242289

243290
for filepath in args.input_paths:

tests/test_getmud.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import pytest
2+
3+
from diffpy.labpdfproc.getmud import compute_diameter
4+
5+
6+
@pytest.mark.parametrize(
7+
"inputs, expected_diameter",
8+
[
9+
(
10+
{
11+
"mud": 2.0,
12+
"sample_composition": "ZrO2",
13+
"xray_energy": 17.45,
14+
"sample_mass_density": 1.20,
15+
},
16+
1.3439,
17+
),
18+
],
19+
)
20+
def test_compute_diameter(inputs, expected_diameter):
21+
actual_diameter = compute_diameter(**inputs)
22+
assert actual_diameter == pytest.approx(
23+
expected_diameter, rel=0.01, abs=0.1
24+
)

0 commit comments

Comments
 (0)