3333)
3434from hexrd .wppf import wppfsupport
3535from hexrd .wppf .spectrum import Spectrum
36- from hexrd .wppf .parameters import Parameters
3736from 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>\n Parameters 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>\n Parameters 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