- Timestamp:
- Oct 11, 2020 12:07:42 PM (3 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIctrlGUI.py
r4579 r4588 4055 4055 selectionsSizer.Add(varSizer,0) 4056 4056 parmSizer.Add(selectionsSizer,0) 4057 listSel = wx.RadioBox(self,wx.ID_ANY,'Parameter type:', 4058 choices=['All','Refined'], 4057 refChoices = ['All','Refined'] 4058 txt = ('"R" indicates a refined variable\n'+ 4059 '"C" indicates generated from a constraint') 4060 if fcount: 4061 refChoices += ['Frozen'] 4062 txt += '\n"F" indicates a variable that is Frozen due to exceeding min/max' 4063 4064 listSel = wx.RadioBox(self,wx.ID_ANY,'Refinement Status:', 4065 choices=refChoices, 4059 4066 majorDimension=0,style=wx.RA_SPECIFY_COLS) 4060 4067 listSel.SetStringSelection(self.listSel) … … 4071 4078 mainSizer.Add(self.varBox,1,wx.ALL|wx.EXPAND,1) 4072 4079 4073 txt = ('"R" indicates a refined variable\n'+4074 '"C" indicates generated from a constraint\n'+4075 '"F" indicates a variable that is Frozen due to exceeding min/max')4076 4080 mainSizer.Add( 4077 4081 wx.StaticText(self,label=txt),0, wx.ALL,0) … … 4091 4095 def __init__(self, parent): 4092 4096 self.parmWin = parent 4097 #patch (added Oct 2020) convert variable names for parm limits to G2VarObj 4098 G2sc.patchControls(self.parmWin.Controls) 4099 # end patch 4093 4100 wx.ListCtrl.__init__( 4094 4101 self, parent, -1, … … 4119 4126 if 'Refined' in parent.listSel and (name not in parent.fullVaryList 4120 4127 ) and (name not in parent.varyList): 4128 continue 4129 if 'Frozen' in parent.listSel and not ( 4130 name in self.parmWin.fullVaryList and 4131 name in self.parmWin.frozenList): 4121 4132 continue 4122 4133 if 'Phase' in parent.parmChoice: … … 4160 4171 def delMafter(d,name): 4161 4172 'Delete Max or Min limit once dialog is deleted' 4162 n,val = G2obj.prmLookup(name,d) # is this a wild-card?4173 key,val = G2obj.prmLookup(name,d) # is this a wild-card? 4163 4174 if val is not None: 4164 del d[ n]4175 del d[key] 4165 4176 self.OnRowSelected(None, row) 4166 4177 … … 4177 4188 'Add a Max or Min limit & redraw' 4178 4189 try: 4179 d[ name] = float(value)4190 d[G2obj.G2VarObj(name)] = float(value) 4180 4191 except: 4181 d[name] = 0.04192 pass 4182 4193 self.OnRowSelected(None, row) 4183 4194 … … 4200 4211 'Set/clear item as wildcard & delete old name(s), redraw' 4201 4212 n,val = G2obj.prmLookup(name,d) # is this a wild-card? 4213 if val is None: 4214 print('Error: Limit for parameter {} not found. Should not happen'.format(name)) 4215 return 4202 4216 if mode: # make wildcard 4203 if n == name: # confirm not wildcard already4204 d[wname] = d[name]4205 4217 for n in list(d.keys()): # delete names matching wildcard 4206 if n== wname: continue4207 if G2obj.prmLookup(n,d)[0] == wname:4218 if str(n) == wname: continue 4219 if n == wname: # respects wildcards 4208 4220 del d[n] 4221 d[G2obj.G2VarObj(wname)] = val 4209 4222 else: 4210 if n != name: 4211 d[name] = d[wname] 4212 del d[wname] 4223 del d[n] 4224 d[G2obj.G2VarObj(name)] = val 4213 4225 self.OnRowSelected(None, row) 4214 4226 4227 # start of OnRowSelected 4215 4228 if event is not None: 4216 4229 row = event.Index 4217 4230 elif row is None: 4218 print('Error: row and event should not b e None!')4231 print('Error: row and event should not both be None!') 4219 4232 return 4220 4233 name = self.varList[row] … … 4283 4296 subSizer.Add((5,-1),0,WACV) 4284 4297 wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all histograms ') 4285 wild.SetValue( n.split(':')[1] == '*')4298 wild.SetValue(str(n).split(':')[1] == '*') 4286 4299 wild.Bind(wx.EVT_CHECKBOX,SetWild) 4287 4300 wild.hist = True … … 4290 4303 subSizer.Add((5,-1),0,WACV) 4291 4304 wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all atoms ') 4292 wild.SetValue( n.split(':')[3] == '*')4305 wild.SetValue(str(n).split(':')[3] == '*') 4293 4306 wild.Bind(wx.EVT_CHECKBOX,SetWild) 4294 4307 subSizer.Add(wild,0,WACV) 4295 4308 mainSizer.Add(subSizer,0) 4296 4297 4309 # draw max value widgets 4298 4310 mainSizer.Add((-1,10),0) … … 4315 4327 subSizer.Add((5,-1),0,WACV) 4316 4328 wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all histograms ') 4317 wild.SetValue( n.split(':')[1] == '*')4329 wild.SetValue(str(n).split(':')[1] == '*') 4318 4330 wild.Bind(wx.EVT_CHECKBOX,SetWild) 4319 4331 wild.max = True … … 4323 4335 subSizer.Add((5,-1),0,WACV) 4324 4336 wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all atoms ') 4325 wild.SetValue( n.split(':')[3] == '*')4337 wild.SetValue(str(n).split(':')[3] == '*') 4326 4338 wild.Bind(wx.EVT_CHECKBOX,SetWild) 4327 4339 wild.max = True -
trunk/GSASIIdataGUI.py
r4583 r4588 5196 5196 wx.Yield() 5197 5197 if OK: 5198 dlg = wx.MessageDialog(self,'Load new result?','Refinement results',wx.OK|wx.CANCEL) 5198 lst = os.path.splitext(os.path.abspath(self.GSASprojectfile))[0] 5199 text = 'Detailed results are in ' + lst + '.lst\n' 5200 if Msg.get('Frozen'): 5201 text += '\n' + Msg['Frozen'] 5202 if Msg.get('steepestNum',0) > 0: 5203 text += '\nNote that {} histograms had extreme correlations where steepest descents dominates\n'.format(Msg['steepestNum']) 5204 if len(Msg.get('maxshift/sigma',[])) > 0: 5205 avg = np.average(Msg['maxshift/sigma']) 5206 mx = np.max(Msg['maxshift/sigma']) 5207 text += '\nBiggest Max shft/sig was {:.3f} (average across histograms {:.3f})\n'.format(mx,avg) 5208 text += '\nLoad new result?' 5209 dlg = wx.MessageDialog(self,text,'Refinement results',wx.OK|wx.CANCEL) 5199 5210 try: 5200 5211 if dlg.ShowModal() == wx.ID_OK: … … 6506 6517 6507 6518 def ClearFrozen(event): 6519 'Removes all frozen parameters by clearing the entire dict' 6508 6520 Controls['parmFrozen'] = {} 6509 6521 wx.CallAfter(UpdateControls,G2frame,data) 6510 6522 6523 # start of UpdateControls 6511 6524 if 'SVD' in data['deriv type']: 6512 6525 G2frame.GetStatusBar().SetStatusText('Hessian SVD not recommended for initial refinements; use analytic Hessian or Jacobian',1) … … 6530 6543 mainSizer.Add((5,5),0) 6531 6544 Controls = data 6532 if 'parmFrozen' not in Controls: 6533 Controls['parmFrozen'] = {} 6545 # count frozen variables (in appropriate place) 6546 for key in ('parmMinDict','parmMaxDict','parmFrozen'): 6547 if key not in Controls: Controls[key] = {} 6534 6548 parmFrozen = Controls['parmFrozen'] 6535 6549 if G2frame.testSeqRefineMode(): -
trunk/GSASIIobj.py
r4578 r4588 1187 1187 either or both may be optionally specified. Parameters limits are specified in the Controls 1188 1188 tree entry in dicts named as ``Controls['parmMaxDict']`` and ``Controls['parmMinDict']``, where 1189 the keys are named using the standard GSAS-II variable 1190 (see :func:`getVarDescr` and :func:`CompileVarDesc`) or with a variable name, where a 1191 wildcard ('*') is used for histogram number or atom number (phase number is intentionally not 1192 allowed as a wildcard as it makes little sense to group together different phases). Note 1193 that func:`prmLookup` is used to see if a name matches a wildcard. The upper or lower limit 1189 the keys are :class:`G2VarObj` objects corresponding to standard GSAS-II variable 1190 (see :func:`getVarDescr` and :func:`CompileVarDesc`) names, where a 1191 wildcard ('*') may optionally be used for histogram number or atom number 1192 (phase number is intentionally not allowed as a wildcard as it makes little sense 1193 to group the same parameter together different phases). Note 1194 that :func:`prmLookup` is used to see if a name matches a wildcard. The upper or lower limit 1194 1195 is placed into these dicts as a float value. These values can be edited using the window 1195 1196 created by the Calculate/"View LS parms" menu command or in scripting with the … … 1200 1201 When a refinement is conducted, routine :func:`GSASIIstrMain.dropOOBvars` is used to 1201 1202 find parameters that have refined to values outside their limits. If this occurs, the parameter 1202 is set to the limiting value and the variable name is added to a list of frozen variables kept in the 1203 ``Controls['parmFrozen']`` dict. In a sequential refinement, this is kept as a list in 1204 ``Controls['parmFrozen'][histogram]`` (where the key is the histogram name) or in 1203 is set to the limiting value and the variable name is added to a list of frozen variables 1204 (as a :class:`G2VarObj` objects) kept in a list in the 1205 ``Controls['parmFrozen']`` dict. In a sequential refinement, this is kept separate for 1206 each histogram as a list in 1207 ``Controls['parmFrozen'][histogram]`` (where the key is the histogram name) or as a list in 1205 1208 ``Controls['parmFrozen']['FrozenList']`` for a non-sequential fit. 1206 1209 This allows different variables … … 1211 1214 future refinements unless the the variable is removed (manually) from the list. This can also 1212 1215 be done with the Calculate/"View LS parms" menu window or ... 1216 1217 .. seealso:: 1218 :class:`G2VarObj` 1219 :func:`getVarDescr` 1220 :func:`CompileVarDesc` 1221 :func:`prmLookup` 1222 :class:`GSASIIctrlGUI.ShowLSParms` 1223 :class:`GSASIIctrlGUI.VirtualVarBox` 1224 :func:`GSASIIstrIO.SetUsedHistogramsAndPhases` 1225 :func:`GSASIIstrIO.SaveUpdatedHistogramsAndPhases` 1226 :func:`GSASIIstrIO.SetSeqResult` 1227 :func:`GSASIIstrMain.dropOOBvars` 1228 :meth:`GSASIIscriptable.G2Project.set_Controls` 1213 1229 1214 1230 *Classes and routines* … … 1452 1468 return cif.ReadCif(URLorFile) 1453 1469 1470 def TestIndexAll(): 1471 '''Test if :func:`IndexAllIds` has been called to index all phases and 1472 histograms (this is needed before :func:`G2VarObj` can be used. 1473 1474 :returns: Returns True if indexing is needed. 1475 ''' 1476 if PhaseIdLookup or AtomIdLookup or HistIdLookup: 1477 return False 1478 return True 1479 1454 1480 def IndexAllIds(Histograms,Phases): 1455 1481 '''Scan through the used phases & histograms and create an index … … 2000 2026 2001 2027 def prmLookup(name,prmDict): 2002 '''looks for a parameter in a min/max dictionary, optionally 2003 considering a wild card for histogram & atom number 2004 ''' 2005 sn = name.split(':') 2006 if sn[1] != '': sn[1] = '*' 2007 if len(sn) >= 4 and sn[3] != '': sn[3] = '*' 2008 wname = ':'.join(sn) 2009 if wname in prmDict: 2010 return wname,prmDict[wname] 2011 elif name in prmDict: 2012 return name,prmDict[name] 2028 '''Looks for a parameter in a min/max dictionary, optionally 2029 considering a wild card for histogram or atom number (use of 2030 both will never occur at the same time). 2031 2032 :param name: a GSAS-II parameter name (str, see :func:`getVarDescr` 2033 and :func:`CompileVarDesc`) or a :class:`G2VarObj` object. 2034 If this contains a wildcard (* for 2035 histogram or atom number) only the exact same name (with 2036 that wildcard) will be matched in parmDict 2037 :param dict prmDict: a min/max dictionary, (parmMinDict 2038 or parmMaxDict in Controls) where keys are :class:`G2VarObj` 2039 objects. 2040 :returns: Two values, (**matchname**, **value**), are returned where: 2041 2042 * **matchname** *(str)* is the :class:`G2VarObj` object 2043 corresponding to the actual matched name, 2044 which could contain a wildcard even if **name** does not; and 2045 * **value** *(float)* which contains the parameter limit. 2046 ''' 2047 keyLookup = {str(key):key for key in prmDict} 2048 sn = str(name).split(':') 2049 if str(name) in keyLookup: 2050 return keyLookup[str(name)],prmDict[keyLookup[str(name)]] 2051 elif sn[1] != '': 2052 sn[1] = '*' 2053 wname = ':'.join(sn) 2054 elif len(sn) >= 4 and sn[3] != '': 2055 sn[3] = '*' 2056 wname = ':'.join(sn) 2057 else: 2058 return None,None 2059 if wname in keyLookup: 2060 return keyLookup[wname],prmDict[keyLookup[wname]] 2013 2061 else: 2014 2062 return None,None … … 2046 2094 unique Id numbers or using a character string that specifies 2047 2095 variables by phase/atom/histogram number (which can change). 2048 Note that :func:`LoadID` should be used to (re)load the current Ids 2096 Note that :func:`GSASIIstrIO.GetUsedHistogramsAndPhases`, 2097 which calls :func:`IndexAllIds` (or 2098 :func:`GSASIIscriptable.G2Project.index_ids`) should be used to 2099 (re)load the current Ids 2049 2100 before creating or later using the G2VarObj object. 2050 2101 … … 2137 2188 return self.varname() 2138 2189 2190 def __hash__(self): 2191 'Allow G2VarObj to be a dict key by implementing hashing' 2192 return hash(self.varname()) 2193 2139 2194 def varname(self): 2140 2195 '''Formats the GSAS-II variable name as a "traditional" GSAS-II variable … … 2199 2254 2200 2255 def __eq__(self, other): 2201 if type(other) is type(self): 2202 return (self.phase == other.phase and 2203 self.histogram == other.histogram and 2204 self.name == other.name and 2205 self.atom == other.atom) 2206 return False 2256 '''Allow comparison of G2VarObj to other G2VarObj objects or strings. 2257 If any field is a wildcard ('*') that field matches. 2258 ''' 2259 if type(other) is str: 2260 other = G2VarObj(other) 2261 elif type(other) is not G2VarObj: 2262 raise Exception("Invalid type ({}) for G2VarObj comparison with {}" 2263 .format(type(other),other)) 2264 if self.phase != other.phase and self.phase != '*' and other.phase != '*': 2265 return False 2266 if self.histogram != other.histogram and self.histogram != '*' and other.histogram != '*': 2267 return False 2268 if self.atom != other.atom and self.atom != '*' and other.atom != '*': 2269 return False 2270 if self.name != other.name: 2271 return False 2272 return True 2207 2273 2208 2274 def _show(self): -
trunk/GSASIIpwd.py
r4571 r4588 1880 1880 :param dict controls: a dict specifying two values, Ftol = controls['min dM/M'] 1881 1881 and derivType = controls['deriv type']. If None default values are used. 1882 :param float wtFactor .weight multiplier; = 1.0 by default1882 :param float wtFactor: weight multiplier; = 1.0 by default 1883 1883 :param wx.Dialog dlg: A dialog box that is updated with progress from the fit. 1884 Defaults to None, which means no updates are done. 1884 Defaults to None, which means no updates are done. 1885 1885 ''' 1886 1886 def GetBackgroundParms(parmList,Background): -
trunk/GSASIIscriptable.py
r4578 r4588 1968 1968 return np.asarray(sumImg,dtype='int32') 1969 1969 1970 def patchControls(Controls): 1971 '''patch routine to convert variable names used in parmeter limits 1972 to G2VarObj objects 1973 ''' 1974 #patch (added Oct 2020) convert variable names for parm limits to G2VarObj 1975 for d in 'parmMaxDict','parmMinDict': 1976 for k in Controls[d]: 1977 if type(k) is str: 1978 print("Applying patch to Controls['{}']".format(d)) 1979 Controls[d] = {G2obj.G2VarObj(k):v for k,v in Controls[d].items()} 1980 break 1981 conv = False 1982 for k in Controls['parmFrozen']: 1983 for item in Controls['parmFrozen'][k]: 1984 if type(item) is str: 1985 conv = True 1986 Controls['parmFrozen'][k] = [G2obj.G2VarObj(i) for i in Controls['parmFrozen'][k]] 1987 break 1988 if conv: print("Applying patch to Controls['parmFrozen']") 1989 # end patch 1990 1970 1991 class G2ObjectWrapper(object): 1971 1992 """Base class for all GSAS-II object wrappers. … … 3051 3072 3052 3073 Automatically converts string phase, hist, or atom names into the ID required 3053 by G2VarObj.""" 3074 by G2VarObj. 3075 3076 Note that this will cause the project to be saved if not 3077 already done so. 3078 """ 3054 3079 3055 3080 if reloadIdx: 3081 self.index_ids() 3082 elif G2obj.TestIndexAll(): 3056 3083 self.index_ids() 3057 3084 … … 3361 3388 3362 3389 def set_Controls(self, control, value, variable=None): 3363 '''Set project controls 3390 '''Set project controls. 3391 3392 Note that use of this with control set to parmMin or parmMax 3393 will cause the project to be saved if not already done so. 3364 3394 3365 3395 :param str control: the item to be set. See below for allowed values. … … 3393 3423 for key in ('parmMinDict','parmMaxDict','parmFrozen'): 3394 3424 if key not in self.data['Controls']['data']: self.data['Controls']['data'][key] = {} 3425 if G2obj.TestIndexAll(): self.index_ids() 3426 patchControls(self.data['Controls']['data']) 3395 3427 if control == 'cycles': 3396 3428 self.data['Controls']['data']['max cyc'] = int(value) … … 3410 3442 self.data['Controls']['data']['Seq Data'] = histlist 3411 3443 elif control == 'parmMin' or control == 'parmMax': 3412 self.data['Controls']['data'][control+'Dict'][variable] = float(value) 3444 key = G2obj.G2VarObj(variable) 3445 self.data['Controls']['data'][control+'Dict'][key] = float(value) 3413 3446 else: 3414 3447 raise Exception('{} is an invalid control value'.format(control)) -
trunk/GSASIIstrIO.py
r4534 r4588 658 658 :param dict RigidBodies: dictionary of rigid bodies 659 659 :param dict CovData: dictionary of refined variables, varyList, & covariance matrix 660 :param list parmFrozenList: list of parameters that are frozen due to limits 661 :param bool makeBack: True if new backup of .gpx file is to be made; else use the last one made 662 660 :param list parmFrozenList: list of parameters (as str) that are frozen 661 due to limits; converted to :class:`GSASIIobj.G2VarObj` objects. 662 :param bool makeBack: True if new backup of .gpx file is to be made; else 663 use the last one made 663 664 ''' 664 665 … … 689 690 if 'parmFrozen' not in Controls: 690 691 Controls['parmFrozen'] = {} 691 Controls['parmFrozen']['FrozenList'] = parmFrozenList692 Controls['parmFrozen']['FrozenList'] = [G2obj.G2VarObj(i) for i in parmFrozenList] 692 693 try: 693 694 histogram = Histograms[datum[0]] … … 772 773 :param dict CovData: dictionary of refined variables, varyList, & covariance matrix 773 774 :param dict parmFrozen: dict with frozen parameters for all phases 775 and histograms (specified as str values) 774 776 ''' 775 777 … … 852 854 name,CovData = cPickleLoad(fp)[0] # 2nd block in file should be Covariance 853 855 name,RigidBodies = cPickleLoad(fp)[0] # 3rd block in file should be Rigid Bodies 854 name,parmFrozen = cPickleLoad(fp)[0] # 4th block in file should be frozen parameters856 name,parmFrozenDict = cPickleLoad(fp)[0] # 4th block in file should be frozen parameters 855 857 fp.close() 856 858 GPXhist = os.path.splitext(GPXfile)[0]+'.seqHist' … … 887 889 Controls = data[0][1] 888 890 Controls['Copy2Next'] = False 889 Controls['parmFrozen'] = parmFrozen 891 for key in parmFrozenDict: 892 Controls['parmFrozen'][key] = [ 893 i if type(i) is G2obj.G2VarObj 894 else G2obj.G2VarObj(i) 895 for i in parmFrozenDict[key]] 890 896 elif datum[0] in histIndex: 891 897 hist.seek(histIndex[datum[0]]) … … 930 936 pFile.write(80*'*'+'\n') 931 937 932 def ShowControls(Controls,pFile=None,SeqRef=False ):938 def ShowControls(Controls,pFile=None,SeqRef=False,preFrozenCount=0): 933 939 'Print controls information' 934 940 pFile.write(' Least squares controls:\n') … … 944 950 pFile.write(' Copy of histogram results to next: %s\n'%(Controls['Copy2Next'])) 945 951 pFile.write(' Process histograms in reverse order: %s\n'%(Controls['Reverse Seq'])) 952 if preFrozenCount: 953 pFile.write('\n Starting refinement with {} Frozen variables\n\n'.format(preFrozenCount)) 946 954 947 955 def GetPawleyConstr(SGLaue,PawleyRef,im,pawleyVary): -
trunk/GSASIIstrMain.py
r4578 r4588 54 54 :returns: 5-tuple of ifOk (bool), Rvals (dict), result, covMatrix, sig 55 55 ''' 56 #patch (added Oct 2020) convert variable names for parm limits to G2VarObj 57 import GSASIIscriptable as G2sc 58 G2sc.patchControls(Controls) 59 # end patch 56 60 # print 'current',varyList 57 61 # for item in parmDict: print item,parmDict[item] ######### show dict just before refinement … … 374 378 import pytexture as ptx 375 379 ptx.pyqlmninit() #initialize fortran arrays for spherical harmonics 376 380 msgs = {} 377 381 printFile = open(ospath.splitext(GPXfile)[0]+'.lst','w') 378 382 G2fil.G2Print ('Starting Sequential Refinement') 379 383 G2stIO.ShowBanner(printFile) 380 384 Controls = G2stIO.GetControls(GPXfile) 381 G2stIO.ShowControls(Controls,printFile,SeqRef=True) 385 preFrozenCount = 0 386 for h in Controls['parmFrozen']: 387 if h == 'FrozenList': continue 388 preFrozenCount += len(Controls['parmFrozen'][h]) 389 G2stIO.ShowControls(Controls,printFile,SeqRef=True, 390 preFrozenCount=preFrozenCount) 382 391 restraintDict = G2stIO.GetRestraints(GPXfile) 383 392 Histograms,Phases = G2stIO.GetUsedHistogramsAndPhases(GPXfile) … … 417 426 NewparmDict = {} 418 427 G2stIO.SetupSeqSavePhases(GPXfile) 428 msgs['steepestNum'] = 0 429 msgs['maxshift/sigma'] = [] 419 430 for ihst,histogram in enumerate(histNames): 420 431 if GSASIIpath.GetConfigValue('Show_timing'): t1 = time.time() … … 559 570 G2fil.G2Print (' wR = %7.2f%%, chi**2 = %12.6g, reduced chi**2 = %6.2f, last delta chi = %.4f, last shft/sig = %.4f'%( 560 571 Rvals['Rwp'],Rvals['chisq'],Rvals['GOF']**2,Rvals['DelChi2'],Rvals.get('Max shft/sig',np.nan))) 572 if Rvals.get('lamMax',0) >= 10.: 573 msgs['steepestNum'] += 1 574 if Rvals.get('Max shft/sig'): 575 msgs['maxshift/sigma'].append(Rvals['Max shft/sig']) 561 576 # add the uncertainties into the esd dictionary (sigDict) 562 577 if not IfOK: … … 636 651 import traceback 637 652 print(traceback.format_exc()) 653 postFrozenCount = 0 654 for h in Controls['parmFrozen']: 655 if h == 'FrozenList': continue 656 postFrozenCount += len(Controls['parmFrozen'][h]) 657 if postFrozenCount: 658 msgs['Frozen'] = 'Ending refinement with {} Frozen variables ({} added here)\n'.format(postFrozenCount,postFrozenCount-preFrozenCount) 659 printFile.write('\n '+msg) 638 660 printFile.close() 639 661 G2fil.G2Print (' Sequential refinement results are in file: '+ospath.splitext(GPXfile)[0]+'.lst') 640 662 G2fil.G2Print (' ***** Sequential refinement successful *****') 641 return True, 'Success'663 return True,msgs 642 664 643 665 def dropOOBvars(varyList,parmDict,sigDict,Controls,parmFrozenList):
Note: See TracChangeset
for help on using the changeset viewer.