Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: update wavelengths #155

Merged
merged 5 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions news/wavelength.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
**Added:**

* <news item>

**Changed:**

* Increased the number of significant figures for wavelength and separated values for Ka1 and Ka2.

**Deprecated:**

* <news item>

**Removed:**

* <news item>

**Fixed:**

* <news item>

**Security:**

* <news item>
34 changes: 24 additions & 10 deletions src/diffpy/labpdfproc/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,20 @@
from diffpy.utils.diffraction_objects import ANGLEQUANTITIES, QQUANTITIES, XQUANTITIES
from diffpy.utils.tools import check_and_build_global_config, compute_mud, get_package_info, get_user_info

WAVELENGTHS = {"Mo": 0.71073, "Ag": 0.59, "Cu": 1.5406}
# Reference values are taken from https://x-server.gmca.aps.anl.gov/cgi/www_dbli.exe?x0hdb=waves
# Ka1Ka2 values are calculated as: (Ka1 * 2 + Ka2) / 3
# For CuKa1Ka2: (1.54056 * 2 + 1.544398) / 3 = 1.54184
WAVELENGTHS = {
"Mo": 0.71073,
"MoKa1": 0.70930,
"MoKa1Ka2": 0.71073,
"Ag": 0.56087,
"AgKa1": 0.55941,
"AgKa1Ka2": 0.56087,
"Cu": 1.54184,
"CuKa1": 1.54056,
"CuKa1Ka2": 1.54184,
}
known_sources = [key for key in WAVELENGTHS.keys()]

# Exclude wavelength from metadata to prevent duplication,
Expand Down Expand Up @@ -137,17 +150,18 @@ def set_wavelength(args):
raise ValueError(
"No valid wavelength. Please rerun specifying a known anode_type or a positive wavelength."
)
if not args.wavelength and args.anode_type and args.anode_type not in WAVELENGTHS:
raise ValueError(
f"Anode type not recognized. Please rerun specifying an anode_type from {*known_sources, }."
)

if args.wavelength:
delattr(args, "anode_type")
elif args.anode_type:
elif not args.wavelength and args.anode_type:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this code seems somewhat convoluted. Is this really the simplest way to do it?

matched_anode_type = next((key for key in WAVELENGTHS if key.lower() == args.anode_type.lower()), None)
if matched_anode_type is None:
raise ValueError(
f"Anode type not recognized. Please rerun specifying an anode_type from {*known_sources, }."
)
args.anode_type = matched_anode_type
args.wavelength = WAVELENGTHS[args.anode_type]
else:
elif not args.wavelength:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if the default should be MoKa1. I am not sure which is the most commonly used. Also, it would be good if it could be loaded from a config file. In this way, if it is lab diffractometer, the correct one could be in the config file and loaded by default, but in a different lab, they could update the config file accordingly.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah that makes sense. Is Ka1 more commonly used in general? If so should we have Mo = MoKa1 instead?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be a question for @till-schertenleib or probably Pascal. But we should use the one that is most common.

args.wavelength = WAVELENGTHS["Mo"]
else:
delattr(args, "anode_type")
return args


Expand Down
19 changes: 18 additions & 1 deletion tests/test_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,26 @@ def test_set_output_directory_bad(user_filesystem):
@pytest.mark.parametrize(
"inputs, expected",
[
# C1: nothing passed in, expect default is Mo
([], {"wavelength": 0.71073, "anode_type": "Mo"}),
(["--anode-type", "Ag"], {"wavelength": 0.59, "anode_type": "Ag"}),
# C2: only a valid anode type was entered (case independent),
# expect to match the corresponding wavelength and preserve the correct case anode type
(["--anode-type", "Mo"], {"wavelength": 0.71073, "anode_type": "Mo"}),
(["--anode-type", "MoKa1"], {"wavelength": 0.70930, "anode_type": "MoKa1"}),
(["--anode-type", "MoKa1Ka2"], {"wavelength": 0.71073, "anode_type": "MoKa1Ka2"}),
(["--anode-type", "Ag"], {"wavelength": 0.56087, "anode_type": "Ag"}),
(["--anode-type", "AgKa1"], {"wavelength": 0.55941, "anode_type": "AgKa1"}),
(["--anode-type", "AgKa1Ka2"], {"wavelength": 0.56087, "anode_type": "AgKa1Ka2"}),
(["--anode-type", "Cu"], {"wavelength": 1.54184, "anode_type": "Cu"}),
(["--anode-type", "CuKa1"], {"wavelength": 1.54056, "anode_type": "CuKa1"}),
(["--anode-type", "CuKa1Ka2"], {"wavelength": 1.54184, "anode_type": "CuKa1Ka2"}),
(["--anode-type", "moKa1Ka2"], {"wavelength": 0.71073, "anode_type": "MoKa1Ka2"}),
(["--anode-type", "ag"], {"wavelength": 0.56087, "anode_type": "Ag"}),
(["--anode-type", "cuka1"], {"wavelength": 1.54056, "anode_type": "CuKa1"}),
# C3: only a valid wavelength was entered, expect to include the wavelength only and anode type is None
(["--wavelength", "0.25"], {"wavelength": 0.25, "anode_type": None}),
# C4: both valid anode type and wavelength were entered,
# expect to remove the anode type and preserve wavelength only
(["--wavelength", "0.25", "--anode-type", "Ag"], {"wavelength": 0.25, "anode_type": None}),
],
)
Expand Down
Loading