Skip to content

Commit 867b436

Browse files
authored
Merge pull request #831 from HEXRD/remove-wppf-parameters-class
Remove WPPF Parameters class
2 parents 4801d6a + a9221aa commit 867b436

File tree

7 files changed

+237
-618
lines changed

7 files changed

+237
-618
lines changed

hexrd/wppf/LeBailCalibration.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
calc_Iobs_pvpink
1313
from hexrd.wppf.spectrum import Spectrum
1414
from hexrd.wppf import wppfsupport, LeBail
15-
from hexrd.wppf.parameters import Parameters
16-
from lmfit import Parameters as Parameters_lmfit
1715
from hexrd.wppf.phase import Phases_LeBail, Material_LeBail
1816
from hexrd.imageutil import snip1d, snip1d_quad
1917
from hexrd.material import Material
@@ -773,16 +771,16 @@ def params(self, param_info):
773771

774772
if(param_info is not None):
775773
pl = wppfsupport._generate_default_parameters_LeBail(
776-
self.phases, self.peakshape, ptype="lmfit")
774+
self.phases, self.peakshape)
777775
self.lebail_param_list = [p for p in pl]
778-
if(isinstance(param_info, Parameters_lmfit)):
776+
if isinstance(param_info, lmfit.Parameters):
779777
"""
780778
directly passing the parameter class
781779
"""
782780
self._params = param_info
783781
params = param_info
784782
else:
785-
params = Parameters_lmfit()
783+
params = lmfit.Parameters()
786784

787785
if(isinstance(param_info, dict)):
788786
"""
@@ -814,7 +812,7 @@ def params(self, param_info):
814812
else:
815813

816814
params = wppfsupport._generate_default_parameters_LeBail(
817-
self.phases, self.peakshape, ptype="lmfit")
815+
self.phases, self.peakshape)
818816
self.lebail_param_list = [p for p in params]
819817
wppfsupport._add_detector_geometry(params, self.instrument)
820818
if "chebyshev" in self.bkgmethod.keys():
@@ -1157,7 +1155,7 @@ def params(self, params):
11571155
set the local value of the parameters to the
11581156
global values from the calibrator class
11591157
"""
1160-
if isinstance(params, Parameters_lmfit):
1158+
if isinstance(params, lmfit.Parameters):
11611159
if hasattr(self, '_params'):
11621160
for p in params:
11631161
if (p in self.lebail_param_list) or (self.name in p):
@@ -1170,7 +1168,7 @@ def params(self, params):
11701168
xn, wn = roots_legendre(16)
11711169
self.xn = xn[8:]
11721170
self.wn = wn[8:]
1173-
self._params = Parameters_lmfit()
1171+
self._params = lmfit.Parameters()
11741172
for p in params:
11751173
if (p in self.lebail_param_list) or (self.name in p):
11761174
self._params.add(name=p,

hexrd/wppf/RietveldHEDM.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ def params(self, param_info):
407407

408408
if(param_info is not None):
409409
pl = wppfsupport._generate_default_parameters_Rietveld(
410-
self.phases, self.peakshape, ptype="lmfit")
410+
self.phases, self.peakshape)
411411
self.rietveld_param_list = [p for p in pl]
412412
if(isinstance(param_info, Parameters_lmfit)):
413413
"""

hexrd/wppf/WPPF.py

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
)
3434
from hexrd.wppf import wppfsupport
3535
from hexrd.wppf.spectrum import Spectrum
36-
from hexrd.wppf.parameters import Parameters
3736
from hexrd.wppf.phase import (
3837
Phases_LeBail,
3938
Phases_Rietveld,
@@ -104,6 +103,7 @@ def __init__(
104103
intensity_init=None,
105104
peakshape="pvfcj",
106105
amorphous_model=None,
106+
reset_background_params=True,
107107
):
108108

109109
self.peakshape = peakshape
@@ -134,6 +134,12 @@ def __init__(
134134
self.Rwplist = np.empty([0])
135135
self.gofFlist = np.empty([0])
136136

137+
if reset_background_params:
138+
# Reset background parameters to their initial values
139+
self.reset_background_params()
140+
else:
141+
self._update_bkg(self.params)
142+
137143
def __str__(self):
138144
resstr = "<LeBail Fit class>\nParameters of \
139145
the model are as follows:\n"
@@ -654,16 +660,16 @@ class too
654660

655661
return errvec
656662

657-
def initialize_lmfit_parameters(self):
658-
659-
params = lmfit.Parameters()
660-
661-
for p in self.params:
662-
par = self.params[p]
663-
if par.vary:
664-
params.add(p, value=par.value, min=par.lb, max=par.ub)
663+
def reset_background_params(self):
664+
# Reset background parameters to their initial values
665+
if "chebyshev" not in self.bkgmethod:
666+
return
665667

666-
return params
668+
params = self.params
669+
for i in range(len(self.bkg_coef)):
670+
name = f'bkg_{i}'
671+
if name in params:
672+
params[name].value = self.bkg_coef[i]
667673

668674
def update_parameters(self):
669675

@@ -704,10 +710,7 @@ def Refine(self):
704710
>> @DETAILS: this routine performs the least squares refinement for all
705711
variables which are allowed to be varied.
706712
"""
707-
708-
params = self.initialize_lmfit_parameters()
709-
710-
if len(params) > 0:
713+
if self.num_vary > 0:
711714
fdict = {
712715
"ftol": 1e-6,
713716
"xtol": 1e-6,
@@ -717,7 +720,7 @@ def Refine(self):
717720
"method": "trf",
718721
"jac": "2-point",
719722
}
720-
fitter = lmfit.Minimizer(self.calcRwp, params)
723+
fitter = lmfit.Minimizer(self.calcRwp, self.params)
721724

722725
res = fitter.least_squares(**fdict)
723726
return res
@@ -743,8 +746,7 @@ def updatespectrum(self):
743746
simulated and experimental spectra
744747
"""
745748
# ???: is this supposed to return something, or is it incomplete?
746-
params = self.initialize_lmfit_parameters()
747-
errvec = self.calcRwp(params)
749+
errvec = self.calcRwp(self.params)
748750

749751
def _update_shkl(self, params):
750752
"""
@@ -1257,6 +1259,10 @@ def weights(self):
12571259
def params(self):
12581260
return self._params
12591261

1262+
@property
1263+
def num_vary(self) -> int:
1264+
return sum(x.vary for x in self.params.values())
1265+
12601266
@property
12611267
def init_bkg(self):
12621268
degree = self.bkgmethod["chebyshev"]
@@ -1291,15 +1297,15 @@ def params(self, param_info):
12911297
self.wn = wn[8:]
12921298

12931299
if param_info is not None:
1294-
if isinstance(param_info, Parameters):
1300+
if isinstance(param_info, lmfit.Parameters):
12951301
"""
12961302
directly passing the parameter class
12971303
"""
12981304
self._params = param_info
12991305
params = param_info
13001306

13011307
else:
1302-
params = Parameters()
1308+
params = lmfit.Parameters()
13031309

13041310
if isinstance(param_info, dict):
13051311
"""
@@ -1309,8 +1315,8 @@ def params(self, param_info):
13091315
params.add(
13101316
k,
13111317
value=float(v[0]),
1312-
lb=float(v[1]),
1313-
ub=float(v[2]),
1318+
min=float(v[1]),
1319+
max=float(v[2]),
13141320
vary=bool(v[3]),
13151321
)
13161322

@@ -1792,6 +1798,7 @@ def __init__(
17921798
particle_size=1.0,
17931799
phi=0.0,
17941800
amorphous_model=None,
1801+
reset_background_params=True,
17951802
):
17961803

17971804
self.bkgmethod = bkgmethod
@@ -1823,6 +1830,12 @@ def __init__(
18231830
self.Rwplist = np.empty([0])
18241831
self.gofFlist = np.empty([0])
18251832

1833+
if reset_background_params:
1834+
# Reset background parameters to their initial values
1835+
self.reset_background_params()
1836+
else:
1837+
self._update_bkg(self.params)
1838+
18261839
def __str__(self):
18271840
resstr = "<Rietveld Fit class>\nParameters of \
18281841
the model are as follows:\n"
@@ -2187,16 +2200,15 @@ def calcRwp(self, params):
21872200

21882201
return errvec
21892202

2190-
def initialize_lmfit_parameters(self):
2191-
2192-
params = lmfit.Parameters()
2193-
2194-
for p in self.params:
2195-
par = self.params[p]
2196-
if par.vary:
2197-
params.add(p, value=par.value, min=par.lb, max=par.ub)
2203+
def reset_background_params(self):
2204+
if "chebyshev" not in self.bkgmethod:
2205+
return
21982206

2199-
return params
2207+
params = self.params
2208+
for i in range(len(self.bkg_coef)):
2209+
name = f'bkg_{i}'
2210+
if name in params:
2211+
params[name].value = self.bkg_coef[i]
22002212

22012213
def update_parameters(self):
22022214

@@ -2212,10 +2224,7 @@ def Refine(self):
22122224
>> @DETAILS: this routine performs the least squares refinement for all
22132225
variables that are allowed to be varied.
22142226
"""
2215-
2216-
params = self.initialize_lmfit_parameters()
2217-
2218-
if len(params) > 0:
2227+
if self.num_vary > 0:
22192228
fdict = {
22202229
"ftol": 1e-6,
22212230
"xtol": 1e-6,
@@ -2226,7 +2235,7 @@ def Refine(self):
22262235
"jac": "2-point",
22272236
}
22282237

2229-
fitter = lmfit.Minimizer(self.calcRwp, params)
2238+
fitter = lmfit.Minimizer(self.calcRwp, self.params)
22302239

22312240
self.res = fitter.least_squares(**fdict)
22322241

@@ -2521,14 +2530,14 @@ def params(self, param_info):
25212530
self.xn = xn[8:]
25222531
self.wn = wn[8:]
25232532
if param_info is not None:
2524-
if isinstance(param_info, Parameters):
2533+
if isinstance(param_info, lmfit.Parameters):
25252534
"""
25262535
directly passing the parameter class
25272536
"""
25282537
self._params = param_info
25292538
params = param_info
25302539
else:
2531-
params = Parameters()
2540+
params = lmfit.Parameters()
25322541

25332542
if isinstance(param_info, dict):
25342543
"""
@@ -2538,8 +2547,8 @@ def params(self, param_info):
25382547
params.add(
25392548
k,
25402549
value=float(v[0]),
2541-
lb=float(v[1]),
2542-
ub=float(v[2]),
2550+
min=float(v[1]),
2551+
max=float(v[2]),
25432552
vary=bool(v[3]),
25442553
)
25452554

@@ -2586,6 +2595,10 @@ def params(self, param_info):
25862595

25872596
self._set_params_vals_to_class(params, init=True, skip_phases=True)
25882597

2598+
@property
2599+
def num_vary(self) -> int:
2600+
return sum(x.vary for x in self.params.values())
2601+
25892602
@property
25902603
def spectrum_expt(self):
25912604
vector_list = [s.y for s in self._spectrum_expt]

0 commit comments

Comments
 (0)