Skip to content

Commit ad0009d

Browse files
committed
Restructure morph inputs
1 parent f5fc9ac commit ad0009d

File tree

3 files changed

+130
-23
lines changed

3 files changed

+130
-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: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,85 @@ def custom_formatwarning(msg, *args, **kwargs):
3434
warnings.formatwarning = custom_formatwarning
3535

3636

37+
def get_morph_inputs(
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+
squeeze_poly_deg = -1
67+
squeeze_in = None
68+
if squeeze is not None:
69+
squeeze_in = {}
70+
# handle list/tuple input
71+
if len(squeeze) > 1 and squeeze[0] == "[" and squeeze[-1] == "]":
72+
squeeze = squeeze[1:-1]
73+
elif len(squeeze) > 1 and squeeze[0] == "(" and squeeze[-1] == ")":
74+
squeeze = squeeze[1:-1]
75+
squeeze_coeffs = squeeze.strip().split(",")
76+
idx = 0
77+
for _, coeff in enumerate(squeeze_coeffs):
78+
if coeff.strip() != "":
79+
try:
80+
squeeze_in.update({f"a{idx}": float(coeff)})
81+
idx += 1
82+
except ValueError:
83+
# user has already been warned
84+
pass
85+
squeeze_poly_deg = len(squeeze_in.keys())
86+
87+
scale_in = scale
88+
if squeeze_poly_deg < 1:
89+
stretch_in = stretch
90+
else:
91+
stretch_in = None
92+
if smear_pdf is None:
93+
smear_in = smear
94+
else:
95+
smear_in = smear_pdf
96+
morph_inputs = {
97+
"scale": scale_in,
98+
"stretch": stretch_in,
99+
"smear": smear_in,
100+
}
101+
102+
if squeeze_poly_deg < 0:
103+
hshift_in = hshift
104+
else:
105+
hshift_in = None
106+
vshift_in = vshift
107+
morph_inputs.update({"hshift": hshift_in, "vshift": vshift_in})
108+
109+
if squeeze_in is not None:
110+
for idx, _ in enumerate(squeeze_in):
111+
morph_inputs.update({f"squeeze a{idx}": squeeze_in[f"a{idx}"]})
112+
113+
return morph_inputs
114+
115+
37116
def single_morph_output(
38117
morph_inputs,
39118
morph_results,

src/diffpy/morph/morphapp.py

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

727727
# Input morph parameters
728-
morph_inputs = {
729-
"scale": scale_in,
730-
"stretch": stretch_in,
731-
"smear": smear_in,
732-
}
733-
morph_inputs.update({"hshift": hshift_in, "vshift": vshift_in})
734-
# More complex input morph parameters are only displayed conditionally
735-
if opts.squeeze is not None:
736-
squeeze_dict = squeeze_dict_in.copy()
737-
for idx, _ in enumerate(squeeze_dict):
738-
morph_inputs.update({f"squeeze a{idx}": squeeze_dict[f"a{idx}"]})
728+
morph_inputs = io.get_morph_inputs(
729+
opts.scale,
730+
opts.stretch,
731+
opts.smear_pdf,
732+
opts.smear,
733+
opts.hshift,
734+
opts.vshift,
735+
opts.squeeze,
736+
)
737+
# Special python morph inputs (for single morph only)
739738
if pymorphs is not None:
740739
if "funcxy" in pymorphs:
741740
for funcxy_param in pymorphs["funcxy"][1].keys():
@@ -953,12 +952,15 @@ def multiple_targets(parser, opts, pargs, stdout_flag=True, python_wrap=False):
953952
for key in morph_results.keys():
954953
target_file_names.append(key)
955954

956-
morph_inputs = {
957-
"scale": opts.scale,
958-
"stretch": opts.stretch,
959-
"smear": opts.smear_pdf,
960-
}
961-
morph_inputs.update({"hshift": opts.hshift, "vshift": opts.vshift})
955+
morph_inputs = io.get_morph_inputs(
956+
opts.scale,
957+
opts.stretch,
958+
opts.smear_pdf,
959+
opts.smear,
960+
opts.hshift,
961+
opts.vshift,
962+
opts.squeeze,
963+
)
962964

963965
try:
964966
# Print summary of morphs to terminal and to file (if requested)
@@ -1136,12 +1138,15 @@ def multiple_morphs(parser, opts, pargs, stdout_flag=True, python_wrap=False):
11361138
for key in morph_results.keys():
11371139
morph_file_names.append(key)
11381140

1139-
morph_inputs = {
1140-
"scale": opts.scale,
1141-
"stretch": opts.stretch,
1142-
"smear": opts.smear_pdf,
1143-
}
1144-
morph_inputs.update({"hshift": opts.hshift, "vshift": opts.vshift})
1141+
morph_inputs = io.get_morph_inputs(
1142+
opts.scale,
1143+
opts.stretch,
1144+
opts.smear_pdf,
1145+
opts.smear,
1146+
opts.hshift,
1147+
opts.vshift,
1148+
opts.squeeze,
1149+
)
11451150

11461151
try:
11471152
# Print summary of morphs to terminal and to file (if requested)

0 commit comments

Comments
 (0)