Skip to content

Commit 4d1d866

Browse files
authored
Handle IO for (CLI) morph inputs in a function (#274)
* Restructure morph inputs * Add docstring, rename function * Add the
1 parent d4b0079 commit 4d1d866

File tree

3 files changed

+141
-23
lines changed

3 files changed

+141
-23
lines changed

news/morph_inputs.rst

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
**Added:**
2+
3+
* <news item>
4+
5+
**Changed:**
6+
7+
* <news item>
8+
9+
**Deprecated:**
10+
11+
* <news item>
12+
13+
**Removed:**
14+
15+
* <news item>
16+
17+
**Fixed:**
18+
19+
* All morph inputs are now outputted for multiple morphs/targets.
20+
21+
**Security:**
22+
23+
* <news item>

src/diffpy/morph/morph_io.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,96 @@ def custom_formatwarning(msg, *args, **kwargs):
3434
warnings.formatwarning = custom_formatwarning
3535

3636

37+
def build_morph_inputs_container(
38+
scale,
39+
stretch,
40+
smear_pdf,
41+
smear,
42+
hshift,
43+
vshift,
44+
squeeze,
45+
):
46+
"""Helper function to extract input morphing parameters for CLI
47+
morphs. Python morphs are handled separately.
48+
49+
Parameters
50+
----------
51+
scale
52+
opts.scale
53+
stretch
54+
opts.stretch
55+
smear_pdf
56+
opts.smear_pdf
57+
smear
58+
opts.smear
59+
hshift
60+
opts.hshift
61+
vshift
62+
opts.vshift
63+
squeeze
64+
opts.squeeze
65+
66+
Returns
67+
-------
68+
dict
69+
The dictionary of input morphing parameters.
70+
Only one of smear and smear_pdf is included
71+
(takes smear_pdf over smear when both exist).
72+
Does not include hshift if a degree zero
73+
or above squeeze is used.
74+
Does not include stretch if a degree one
75+
or above squeeze is used.
76+
"""
77+
squeeze_poly_deg = -1
78+
squeeze_in = None
79+
if squeeze is not None:
80+
squeeze_in = {}
81+
# handle list/tuple input
82+
if len(squeeze) > 1 and squeeze[0] == "[" and squeeze[-1] == "]":
83+
squeeze = squeeze[1:-1]
84+
elif len(squeeze) > 1 and squeeze[0] == "(" and squeeze[-1] == ")":
85+
squeeze = squeeze[1:-1]
86+
squeeze_coeffs = squeeze.strip().split(",")
87+
idx = 0
88+
for _, coeff in enumerate(squeeze_coeffs):
89+
if coeff.strip() != "":
90+
try:
91+
squeeze_in.update({f"a{idx}": float(coeff)})
92+
idx += 1
93+
except ValueError:
94+
# user has already been warned
95+
pass
96+
squeeze_poly_deg = len(squeeze_in.keys())
97+
98+
scale_in = scale
99+
if squeeze_poly_deg < 1:
100+
stretch_in = stretch
101+
else:
102+
stretch_in = None
103+
if smear_pdf is None:
104+
smear_in = smear
105+
else:
106+
smear_in = smear_pdf
107+
morph_inputs = {
108+
"scale": scale_in,
109+
"stretch": stretch_in,
110+
"smear": smear_in,
111+
}
112+
113+
if squeeze_poly_deg < 0:
114+
hshift_in = hshift
115+
else:
116+
hshift_in = None
117+
vshift_in = vshift
118+
morph_inputs.update({"hshift": hshift_in, "vshift": vshift_in})
119+
120+
if squeeze_in is not None:
121+
for idx, _ in enumerate(squeeze_in):
122+
morph_inputs.update({f"squeeze a{idx}": squeeze_in[f"a{idx}"]})
123+
124+
return morph_inputs
125+
126+
37127
def single_morph_output(
38128
morph_inputs,
39129
morph_results,

src/diffpy/morph/morphapp.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -762,17 +762,16 @@ def single_morph(
762762
# if you think there requires special handling
763763

764764
# Input morph parameters
765-
morph_inputs = {
766-
"scale": scale_in,
767-
"stretch": stretch_in,
768-
"smear": smear_in,
769-
}
770-
morph_inputs.update({"hshift": hshift_in, "vshift": vshift_in})
771-
# More complex input morph parameters are only displayed conditionally
772-
if opts.squeeze is not None:
773-
squeeze_dict = squeeze_dict_in.copy()
774-
for idx, _ in enumerate(squeeze_dict):
775-
morph_inputs.update({f"squeeze a{idx}": squeeze_dict[f"a{idx}"]})
765+
morph_inputs = io.build_morph_inputs_container(
766+
opts.scale,
767+
opts.stretch,
768+
opts.smear_pdf,
769+
opts.smear,
770+
opts.hshift,
771+
opts.vshift,
772+
opts.squeeze,
773+
)
774+
# Special python morph inputs (for single morph only)
776775
if pymorphs is not None:
777776
if "funcxy" in pymorphs:
778777
for funcxy_param in pymorphs["funcxy"][1].keys():
@@ -990,12 +989,15 @@ def multiple_targets(parser, opts, pargs, stdout_flag=True, python_wrap=False):
990989
for key in morph_results.keys():
991990
target_file_names.append(key)
992991

993-
morph_inputs = {
994-
"scale": opts.scale,
995-
"stretch": opts.stretch,
996-
"smear": opts.smear_pdf,
997-
}
998-
morph_inputs.update({"hshift": opts.hshift, "vshift": opts.vshift})
992+
morph_inputs = io.build_morph_inputs_container(
993+
opts.scale,
994+
opts.stretch,
995+
opts.smear_pdf,
996+
opts.smear,
997+
opts.hshift,
998+
opts.vshift,
999+
opts.squeeze,
1000+
)
9991001

10001002
try:
10011003
# Print summary of morphs to terminal and to file (if requested)
@@ -1173,12 +1175,15 @@ def multiple_morphs(parser, opts, pargs, stdout_flag=True, python_wrap=False):
11731175
for key in morph_results.keys():
11741176
morph_file_names.append(key)
11751177

1176-
morph_inputs = {
1177-
"scale": opts.scale,
1178-
"stretch": opts.stretch,
1179-
"smear": opts.smear_pdf,
1180-
}
1181-
morph_inputs.update({"hshift": opts.hshift, "vshift": opts.vshift})
1178+
morph_inputs = io.build_morph_inputs_container(
1179+
opts.scale,
1180+
opts.stretch,
1181+
opts.smear_pdf,
1182+
opts.smear,
1183+
opts.hshift,
1184+
opts.vshift,
1185+
opts.squeeze,
1186+
)
11821187

11831188
try:
11841189
# Print summary of morphs to terminal and to file (if requested)

0 commit comments

Comments
 (0)