Changeset 5084
- Timestamp:
- Nov 14, 2021 11:20:38 AM (6 months ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIpwd.py
r5075 r5084 1355 1355 instrument parameters to be refined. When peakInstPrmMode=False, the instrument 1356 1356 parameters are not used and cannot be refined. 1357 The default is peakFitMode=True. 1357 The default is peakFitMode=True. This is changed only in 1358 :func:`setPeakInstPrmMode`, which is called only from :mod:`GSASIIscriptable`. 1358 1359 ''' 1359 1360 … … 1363 1364 unless the individual parameter is refined. If normal=False, 1364 1365 peak widths are used as supplied for each peak. 1366 At present this is called only in G2scriptable. 1365 1367 1366 1368 Note that normal=True unless this routine is called. Also, … … 1374 1376 1375 1377 def getPeakProfile(dataType,parmDict,xdata,fixback,varyList,bakType): 1376 '''Computes the profile for a powder pattern for single peak fitting 1378 '''Computes the profiles from multiple peaks for individual peak fitting 1379 for powder patterns. 1377 1380 NB: not used for Rietveld refinement 1378 1381 ''' … … 1964 1967 InstPrint(Inst,sigDict) 1965 1968 return True 1966 1967 def DoPeakFit(FitPgm,Peaks,Background,Limits,Inst,Inst2,data,fixback=None,prevVaryList=[],oneCycle=False,controls=None,wtFactor=1.0,dlg=None ):1969 1970 def DoPeakFit(FitPgm,Peaks,Background,Limits,Inst,Inst2,data,fixback=None,prevVaryList=[],oneCycle=False,controls=None,wtFactor=1.0,dlg=None,noFit=False): 1968 1971 '''Called to perform a peak fit, refining the selected items in the peak 1969 1972 table as well as selected items in the background. … … 1992 1995 :param wx.Dialog dlg: A dialog box that is updated with progress from the fit. 1993 1996 Defaults to None, which means no updates are done. 1997 :param bool noFit: When noFit is True, a refinement is not performed. Default 1998 is False. 1999 1994 2000 ''' 1995 2001 def GetBackgroundParms(parmList,Background): … … 2233 2239 2234 2240 def devPeakProfile(values,xdata,ydata,fixback, weights,dataType,parmdict,varylist,bakType,dlg): 2241 '''Computes a matrix where each row is the derivative of the calc-obs 2242 values (see :func:`errPeakProfile`) with respect to each parameter 2243 in backVary,insVary,peakVary. Used for peak fitting. 2244 ''' 2235 2245 parmdict.update(zip(varylist,values)) 2236 2246 return np.sqrt(weights)*getPeakProfileDerv(dataType,parmdict,xdata,fixback,varylist,bakType) 2237 2247 2238 def errPeakProfile(values,xdata,ydata,fixback,weights,dataType,parmdict,varylist,bakType,dlg): 2248 def errPeakProfile(values,xdata,ydata,fixback,weights,dataType,parmdict,varylist,bakType,dlg): 2249 '''Computes a vector with the weighted calc-obs values differences 2250 for peak fitting 2251 ''' 2239 2252 parmdict.update(zip(varylist,values)) 2240 2253 M = np.sqrt(weights)*(getPeakProfile(dataType,parmdict,xdata,fixback,varylist,bakType)-ydata) … … 2247 2260 return M 2248 2261 2249 # beginning of DoPeakFit2262 #---- beginning of DoPeakFit ---------------------------------------------- 2250 2263 if controls: 2251 2264 Ftol = controls['min dM/M'] … … 2282 2295 raise Exception('Instrumental profile terms cannot be varied '+ 2283 2296 'after setPeakInstPrmMode(False) is used') 2284 while True:2297 while not noFit: 2285 2298 begin = time.time() 2286 2299 values = np.array(Dict2Values(parmDict, varyList)) … … 2318 2331 break 2319 2332 if dlg: dlg.Destroy() 2320 sigDict = dict(zip(varyList,sig))2321 2333 yb[xBeg:xFin] = getBackground('',parmDict,bakType,dataType,x[xBeg:xFin],fixback[xBeg:xFin])[0] 2322 2334 yc[xBeg:xFin] = getPeakProfile(dataType,parmDict,x[xBeg:xFin],fixback[xBeg:xFin],varyList,bakType) 2323 2335 yd[xBeg:xFin] = y[xBeg:xFin]-yc[xBeg:xFin] 2336 if noFit: 2337 return 2338 sigDict = dict(zip(varyList,sig)) 2324 2339 GetBackgroundParms(parmDict,Background) 2325 2340 if bakVary: BackgroundPrint(Background,sigDict) -
trunk/GSASIIpwdGUI.py
r5048 r5084 791 791 if not G2frame.GSASprojectfile: #force a save of the gpx file so SaveState can write in the same directory 792 792 G2frame.OnFileSaveas(event) 793 wx.CallAfter(OnPeakFit,'LSQ') 793 FitPgm = 'LSQ' 794 # if data.get('FitPgm',0) == 1: 795 # FitPgm = 'LaueFringe' 796 wx.CallAfter(OnPeakFit,FitPgm) 794 797 795 798 def OnOneCycle(event): … … 797 800 reflGrid.HideCellEditControl() 798 801 reflGrid.DisableCellEditControl() 799 wx.CallAfter(OnPeakFit,'LSQ',oneCycle=True) 802 FitPgm = 'LSQ' 803 # if data.get('FitPgm',0) == 1: 804 # FitPgm = 'LaueFringe' 805 wx.CallAfter(OnPeakFit,FitPgm,oneCycle=True) 800 806 801 807 def OnSeqPeakFit(event): … … 825 831 oneCycle = False 826 832 FitPgm = 'LSQ' 833 # if data.get('FitPgm',0) == 1: 834 # FitPgm = 'LaueFringe' 827 835 prevVaryList = [] 828 836 peaks = None … … 878 886 G2plt.PlotPatterns(G2frame,plotType='PWDR') 879 887 880 def OnPeakFit(FitPgm,oneCycle=False ):888 def OnPeakFit(FitPgm,oneCycle=False,noFit=False): 881 889 SaveState() 882 890 controls = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,G2frame.root, 'Controls')) … … 896 904 wtFactor = Pattern[0]['wtFactor'] 897 905 bxye = GetFileBackground(G2frame,data,background,scale=False) 898 dlg = wx.ProgressDialog('Residual','Peak fit Rwp = ',101.0, 906 #====================================================================== 907 # print('Debug: reload G2pwd') # TODO: remove me 908 # import imp 909 # imp.reload(G2pwd) 910 # # TODO: remove ^^^^ 911 #====================================================================== 912 if noFit: 913 results = G2pwd.DoPeakFit(FitPgm,peaks['peaks'],background,limits,inst,inst2,data,bxye,[],oneCycle,controls,wtFactor,noFit=True) 914 G2plt.PlotPatterns(G2frame,plotType='PWDR') 915 return 916 dlg = wx.ProgressDialog('Residual','Peak fit Rwp = ',101.0, 917 parent=G2frame, 899 918 style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_REMAINING_TIME|wx.PD_CAN_ABORT) 900 919 screenSize = wx.ClientDisplayRect() … … 902 921 if 50 < Size[0] < 500: # sanity check on size, since this fails w/Win & wx3.0 903 922 dlg.SetSize((int(Size[0]*1.2),Size[1])) # increase size a bit along x 904 dlg. SetPosition(wx.Point(screenSize[2]-Size[0]-305,screenSize[1]+5))923 dlg.CenterOnParent() 905 924 try: 906 925 results = G2pwd.DoPeakFit(FitPgm,peaks['peaks'],background,limits,inst,inst2,data,bxye,[],oneCycle,controls,wtFactor,dlg) … … 908 927 text = 'Peak fit: Rwp=%.2f%% Nobs= %d Nparm= %d Npeaks= %d'%(results[3]['Rwp'],results[1][2]['fjac'].shape[1],len(results[0]),len(peaks['peaks'])) 909 928 finally: 910 # dlg.Destroy() 911 print ('finished') 929 dlg.Destroy() 912 930 newpeaks = copy.copy(peaks) 913 931 G2frame.GPXtree.SetItemPyData(G2gd.GetGPXtreeItemId(G2frame,PatternId, 'Peak List'),newpeaks) … … 1065 1083 for row in range(reflGrid.GetNumberRows()): data['peaks'][row][c]=False 1066 1084 wx.CallAfter(UpdatePeakGrid,G2frame,data) 1067 1085 1086 def updateMe(*args): 1087 'Redraw the peak listings after the mode changes' 1088 wx.CallAfter(UpdatePeakGrid,G2frame,data) 1089 1090 def RefreshPeakGrid(event): 1091 'recompute & plot the peaks any time a value in the table is edited' 1092 FitPgm = 'LSQ' 1093 # if data.get('FitPgm',0) == 1: 1094 # FitPgm = 'LaueFringe' 1095 OnPeakFit(FitPgm,noFit=True) 1096 1068 1097 #====================================================================== 1069 1098 # beginning of UpdatePeakGrid init 1070 1099 #====================================================================== 1100 # data['FitPgm'] = data.get('FitPgm',0) 1071 1101 G2frame.GetStatusBar().SetStatusText('Global refine: select refine column & press Y or N',1) 1072 1102 G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.PeakMenu) … … 1100 1130 Inst = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,PatternId, 'Instrument Parameters'))[0] 1101 1131 for i in range(len(data['peaks'])): rowLabels.append(str(i+1)) 1132 # if data.get('FitPgm',0) == 1: 1133 # colLabels = ['position','refine','intensity','refine','cells','refine'] 1134 # Types = [wg.GRID_VALUE_FLOAT+':10,4',wg.GRID_VALUE_BOOL, 1135 # wg.GRID_VALUE_FLOAT+':10,3',wg.GRID_VALUE_BOOL, 1136 # wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_BOOL] 1137 # # TODO: note gamma values can still be set as refined 1138 # elif 'C' in Inst['Type'][0]: 1102 1139 if 'C' in Inst['Type'][0]: 1103 1140 colLabels = ['position','refine','intensity','refine','sigma','refine','gamma','refine'] … … 1142 1179 reflGrid.SetTable(G2frame.PeakTable, True) 1143 1180 setBackgroundColors() 1144 # reflGrid.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshPeakGrid)1181 reflGrid.Bind(wg.EVT_GRID_CELL_CHANGED, RefreshPeakGrid) 1145 1182 reflGrid.Bind(wx.EVT_KEY_DOWN, KeyEditPeakGrid) 1146 1183 # reflGrid.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, onCellListSClick) … … 1152 1189 G2frame.reflGrid = reflGrid 1153 1190 topSizer = wx.BoxSizer(wx.HORIZONTAL) 1154 topSizer.Add((-1,-1),1,wx.EXPAND)1155 1191 topSizer.Add(wx.StaticText(G2frame.dataWindow,label='List of peaks to fit individually'),0,WACV) 1156 1192 topSizer.Add((-1,-1),1,wx.EXPAND) 1157 1193 topSizer.Add(G2G.HelpButton(G2frame.dataWindow,helpIndex=G2frame.dataWindow.helpKey)) 1158 1194 mainSizer.Add(topSizer,0,wx.EXPAND) 1159 mainSizer.Add(reflGrid) 1195 G2G.HorizontalLine(mainSizer,G2frame.dataWindow) 1196 # if 'C' in Inst['Type'][0]: 1197 # topSizer = wx.BoxSizer(wx.HORIZONTAL) 1198 # topSizer.Add(wx.StaticText(G2frame.dataWindow,label=' Fitting mode: '),0,WACV) 1199 # pkType = G2G.G2ChoiceButton(G2frame.dataWindow,('Powder diffraction','Laue fringes'), 1200 # indLoc=data,indKey='FitPgm', 1201 # onChoice=updateMe) 1202 # topSizer.Add(pkType) 1203 # mainSizer.Add(topSizer) 1204 mainSizer.Add(reflGrid,0,wx.ALL,10) 1160 1205 G2frame.dataWindow.SetSizer(mainSizer) 1161 1206 G2frame.dataWindow.SetDataSize() … … 1717 1762 mainSizer = wx.BoxSizer(wx.VERTICAL) 1718 1763 topSizer = wx.BoxSizer(wx.HORIZONTAL) 1719 topSizer.Add((-1,-1),1,wx.EXPAND)1720 1764 topSizer.Add(wx.StaticText(G2frame.dataWindow,label='Background used in refinement'),0,WACV) 1721 1765 # add help button to bring up help web page - at right side of window … … 1723 1767 topSizer.Add(G2G.HelpButton(G2frame.dataWindow,helpIndex=G2frame.dataWindow.helpKey)) 1724 1768 mainSizer.Add(topSizer,0,wx.EXPAND) 1769 G2G.HorizontalLine(mainSizer,G2frame.dataWindow) 1725 1770 mainSizer.Add(BackSizer()) 1726 1771 mainSizer.Add((0,5),0) … … 1807 1852 mainSizer = wx.BoxSizer(wx.VERTICAL) 1808 1853 topSizer = wx.BoxSizer(wx.HORIZONTAL) 1809 topSizer.Add((-1,-1),1,wx.EXPAND)1810 1854 topSizer.Add(wx.StaticText(G2frame.dataWindow,label=' Data range to be used in fits'),0,WACV) 1811 1855 # add help button to bring up help web page - at right side of window … … 1813 1857 topSizer.Add(G2G.HelpButton(G2frame.dataWindow,helpIndex=G2frame.dataWindow.helpKey)) 1814 1858 mainSizer.Add(topSizer,0,wx.EXPAND) 1859 G2G.HorizontalLine(mainSizer,G2frame.dataWindow) 1815 1860 mainSizer.Add((5,5)) 1816 1861 mainSizer.Add(LimitSizer()) … … 2955 3000 mainSizer = wx.BoxSizer(wx.VERTICAL) 2956 3001 topSizer = wx.BoxSizer(wx.HORIZONTAL) 2957 topSizer.Add((-1,-1),1,wx.EXPAND)2958 3002 topSizer.Add(wx.StaticText(G2frame.dataWindow,label=' Sample and Experimental Parameters')) 2959 3003 # add help button to bring up help web page - at right side of window … … 2961 3005 topSizer.Add(G2G.HelpButton(G2frame.dataWindow,helpIndex=G2frame.dataWindow.helpKey)) 2962 3006 mainSizer.Add(topSizer,0,wx.EXPAND) 3007 G2G.HorizontalLine(mainSizer,G2frame.dataWindow) 2963 3008 nameSizer = wx.BoxSizer(wx.HORIZONTAL) 2964 3009 nameSizer.Add(wx.StaticText(G2frame.dataWindow,wx.ID_ANY,' Instrument Name '),0,WACV) … … 4428 4473 mainSizer = wx.BoxSizer(wx.VERTICAL) 4429 4474 topSizer = wx.BoxSizer(wx.HORIZONTAL) 4430 topSizer.Add((-1,-1),1,wx.EXPAND)4431 4475 topSizer.Add(wx.StaticText(parent=G2frame.dataWindow,label='Indexing controls'),0,WACV) 4432 4476 # add help button to bring up help web page - at right side of window … … 4434 4478 topSizer.Add(G2G.HelpButton(G2frame.dataWindow,helpIndex=G2frame.dataWindow.helpKey)) 4435 4479 mainSizer.Add(topSizer,0,wx.EXPAND) 4480 G2G.HorizontalLine(mainSizer,G2frame.dataWindow) 4436 4481 mainSizer.Add((5,5),0) 4437 4482 littleSizer = wx.FlexGridSizer(0,5,5,5)
Note: See TracChangeset
for help on using the changeset viewer.