Changeset 4036
- Timestamp:
- Jun 21, 2019 6:00:51 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIctrlGUI.py
r4031 r4036 143 143 wg = Placeholder('Grid PyGridTableBase PyGridCellEditor'.split()) 144 144 import time 145 import glob 145 146 import copy 147 import random as ran 146 148 import webbrowser # could postpone this for quicker startup 147 149 import numpy as np … … 155 157 import GSASIIlog as log 156 158 import GSASIIobj as G2obj 159 import GSASIIfiles as G2fil 160 import GSASIIscriptable as G2sc 157 161 158 162 … … 1154 1158 self.onChoice = None 1155 1159 self.SetSelection(wx.NOT_FOUND) 1156 if self.indLoc is not None and self. strLocis not None:1160 if self.indLoc is not None and self.indKey is not None: 1157 1161 try: 1158 1162 self.SetSelection(self.indLoc[self.indKey]) 1159 self.strLoc[self.strKey] = self.GetStringSelection() 1160 log.LogVarChange(self.strLoc,self.strKey) 1161 except ValueError: 1163 if self.strLoc is not None and self.strKey is not None: 1164 self.strLoc[self.strKey] = self.GetStringSelection() 1165 #log.LogVarChange(self.strLoc,self.strKey) 1166 except (KeyError,ValueError,TypeError): 1162 1167 pass 1163 1168 elif self.strLoc is not None and self.strKey is not None: … … 1167 1172 self.indLoc[self.indKey] = self.GetSelection() 1168 1173 log.LogVarChange(self.indLoc,self.indKey) 1169 except (KeyError,ValueError ):1174 except (KeyError,ValueError,TypeError): 1170 1175 pass 1171 1176 self.Bind(wx.EVT_CHOICE, self._OnChoice) … … 5620 5625 except KeyError: 5621 5626 pass 5622 5627 ################################################################################ 5628 # Autoload PWDR files 5629 ################################################################################ 5630 AutoLoadWindow = None 5631 5632 def AutoLoadFiles(G2frame,FileTyp='pwd'): 5633 def OnBrowse(event): 5634 '''Responds when the Browse button is pressed to load a file. 5635 The routine determines which button was pressed and gets the 5636 appropriate file type and loads it into the appropriate place 5637 in the dict. 5638 ''' 5639 if btn3 == event.GetEventObject(): 5640 d = wx.DirDialog(dlg, 5641 'Select directory for input files', 5642 Settings['indir'],wx.DD_DEFAULT_STYLE) 5643 d.CenterOnParent() 5644 try: 5645 if d.ShowModal() == wx.ID_OK: 5646 Settings['indir'] = d.GetPath() 5647 fInp3.SetValue(Settings['indir']) 5648 finally: 5649 d.Destroy() 5650 elif btn4 == event.GetEventObject(): 5651 extList = 'GSAS iparm file (*.prm,*.inst,*.ins,.instprm)|*.prm;*.inst;*.ins;*.instprm' 5652 d = wx.FileDialog(dlg, 5653 'Choose instrument parameter file', 5654 '', '',extList, wx.FD_OPEN) 5655 if os.path.exists(Settings['instfile']): 5656 d.SetFilename(Settings['instfile']) 5657 try: 5658 if d.ShowModal() == wx.ID_OK: 5659 Settings['instfile'] = d.GetPath() 5660 fInp4.SetValue(Settings['instfile']) 5661 finally: 5662 d.Destroy() 5663 TestInput() 5664 def onSetFmtSelection(): 5665 extSel.Clear() 5666 extSel.AppendItems(pwdrReaders[Settings['fmt']].extensionlist) 5667 Settings['extStr'] = pwdrReaders[Settings['fmt']].extensionlist[0] 5668 extSel.SetSelection(0) 5669 onSetExtSelection() 5670 def onSetExtSelection(): 5671 Settings['filter'] = os.path.splitext(Settings['filter'])[0] + Settings['extStr'] 5672 flterInp.SetValue(Settings['filter']) 5673 TestInput() 5674 def OnQuit(event): 5675 Settings['timer'].Stop() 5676 wx.CallAfter(dlg.Destroy) 5677 def TestInput(*args,**kwargs): 5678 valid = True 5679 if not os.path.exists(Settings['indir']): 5680 valid = False 5681 if not os.path.exists(Settings['instfile']): 5682 valid = False 5683 btnstart.Enable(valid) 5684 def OnStart(event): 5685 if btnstart.GetLabel() == 'Pause': 5686 Settings['timer'].Stop() 5687 btnstart.SetLabel('Continue') 5688 return 5689 else: 5690 btnstart.SetLabel('Pause') 5691 if Settings['timer'].IsRunning(): return 5692 PollTime = 1 # sec 5693 G2frame.CheckNotebook() 5694 Settings['timer'].Start(int(1000*PollTime),oneShot=False) 5695 5696 # get a list of existing histograms 5697 PWDRlist = [] 5698 if G2frame.GPXtree.GetCount(): 5699 item, cookie = G2frame.GPXtree.GetFirstChild(G2frame.root) 5700 while item: 5701 name = G2frame.GPXtree.GetItemText(item) 5702 if name.startswith('PWDR ') and name not in PWDRlist: 5703 PWDRlist.append(name) 5704 item, cookie = G2frame.GPXtree.GetNextChild(G2frame.root, cookie) 5705 Settings['PWDRlist'] = PWDRlist 5706 def RunTimerLoop(event): 5707 if GSASIIpath.GetConfigValue('debug'): 5708 import datetime 5709 print ("DBG_Timer tick at {:%d %b %Y %H:%M:%S}\n".format(datetime.datetime.now())) 5710 filelist = glob.glob(os.path.join(Settings['indir'],Settings['filter'])) 5711 if not filelist: return 5712 #if GSASIIpath.GetConfigValue('debug'): print(filelist) 5713 Id = None 5714 for f in filelist: 5715 if f in Settings['filesread']: continue 5716 Settings['filesread'].append(f) 5717 rd = pwdrReaders[Settings['fmt']] 5718 rd.ReInitialize() 5719 if not rd.ContentsValidator(f): 5720 Settings['timer'].Stop() 5721 btnstart.SetLabel('Continue') 5722 G2G.G2MessageBox(dlg,'Error in reading file {}: {}'.format( 5723 f, rd.errors)) 5724 return 5725 #if len(rd.selections) > 1: 5726 # G2fil.G2Print('Warning: Skipping file {}: multibank not yet implemented'.format(f)) 5727 # continue 5728 block = 0 5729 rdbuffer = {} 5730 repeat = True 5731 while repeat: 5732 repeat = False 5733 try: 5734 flag = rd.Reader(f,buffer=rdbuffer, blocknum=block) 5735 except: 5736 flag = False 5737 if flag: 5738 rd.readfilename = f 5739 if rd.warnings: 5740 G2fil.G2Print("Read warning by", rd.formatName, 5741 "reader:", 5742 rd.warnings) 5743 elif not block: 5744 G2fil.G2Print("{} read by Reader {}" 5745 .format(f,rd.formatName)) 5746 else: 5747 G2fil.G2Print("{} block # {} read by Reader {}" 5748 .format(f,block,rd.formatName)) 5749 block += 1 5750 repeat = rd.repeat 5751 else: 5752 G2fil.G2Print("Warning: {} Reader failed to read {}" 5753 .format(rd.formatName,filename)) 5754 Iparm1, Iparm2 = G2sc.load_iprms(Settings['instfile'],rd) 5755 if 'phoenix' in wx.version(): 5756 HistName = 'PWDR '+rd.idstring 5757 else: 5758 HistName = 'PWDR '+G2obj.StripUnicode(rd.idstring,'_') 5759 # make new histogram names unique 5760 HistName = G2obj.MakeUniqueLabel(HistName,Settings['PWDRlist']) 5761 Settings['PWDRlist'].append(HistName) 5762 # put into tree 5763 Id = G2frame.GPXtree.AppendItem(parent=G2frame.root,text=HistName) 5764 if 'T' in Iparm1['Type'][0]: 5765 if not rd.clockWd and rd.GSAS: 5766 rd.powderdata[0] *= 100. #put back the CW centideg correction 5767 cw = np.diff(rd.powderdata[0]) 5768 rd.powderdata[0] = rd.powderdata[0][:-1]+cw/2. 5769 if rd.GSAS: #NB: old GSAS wanted intensities*CW even if normalized! 5770 npts = min(len(rd.powderdata[0]),len(rd.powderdata[1]),len(cw)) 5771 rd.powderdata[1] = rd.powderdata[1][:npts]/cw[:npts] 5772 rd.powderdata[2] = rd.powderdata[2][:npts]*cw[:npts]**2 #1/var=w at this point 5773 else: #NB: from topas/fullprof type files 5774 rd.powderdata[1] = rd.powderdata[1][:-1] 5775 rd.powderdata[2] = rd.powderdata[2][:-1] 5776 if 'Itype' in Iparm2: 5777 Ibeg = np.searchsorted(rd.powderdata[0],Iparm2['Tminmax'][0]) 5778 Ifin = np.searchsorted(rd.powderdata[0],Iparm2['Tminmax'][1]) 5779 rd.powderdata[0] = rd.powderdata[0][Ibeg:Ifin] 5780 YI,WYI = G2pwd.calcIncident(Iparm2,rd.powderdata[0]) 5781 rd.powderdata[1] = rd.powderdata[1][Ibeg:Ifin]/YI 5782 var = 1./rd.powderdata[2][Ibeg:Ifin] 5783 var += WYI*rd.powderdata[1]**2 5784 var /= YI**2 5785 rd.powderdata[2] = 1./var 5786 rd.powderdata[3] = np.zeros_like(rd.powderdata[0]) 5787 rd.powderdata[4] = np.zeros_like(rd.powderdata[0]) 5788 rd.powderdata[5] = np.zeros_like(rd.powderdata[0]) 5789 Ymin = np.min(rd.powderdata[1]) 5790 Ymax = np.max(rd.powderdata[1]) 5791 valuesdict = { 5792 'wtFactor':1.0, 5793 'Dummy':False, 5794 'ranId':ran.randint(0,sys.maxsize), 5795 'Offset':[0.0,0.0],'delOffset':0.02*Ymax,'refOffset':-.1*Ymax,'refDelt':0.1*Ymax, 5796 'Yminmax':[Ymin,Ymax] 5797 } 5798 # apply user-supplied corrections to powder data 5799 if 'CorrectionCode' in Iparm1: 5800 print('Applying corrections from instprm file') 5801 corr = Iparm1['CorrectionCode'][0] 5802 try: 5803 exec(corr) 5804 print('done') 5805 except Exception as err: 5806 print(u'error: {}'.format(err)) 5807 print('with commands -------------------') 5808 print(corr) 5809 print('---------------------------------') 5810 finally: 5811 del Iparm1['CorrectionCode'] 5812 rd.Sample['ranId'] = valuesdict['ranId'] # this should be removed someday 5813 G2frame.GPXtree.SetItemPyData(Id,[valuesdict,rd.powderdata]) 5814 G2frame.GPXtree.SetItemPyData( 5815 G2frame.GPXtree.AppendItem(Id,text='Comments'), 5816 rd.comments) 5817 Tmin = min(rd.powderdata[0]) 5818 Tmax = max(rd.powderdata[0]) 5819 Tmin1 = Tmin 5820 if 'NT' in Iparm1['Type'][0] and G2lat.Pos2dsp(Iparm1,Tmin) < 0.4: 5821 Tmin1 = G2lat.Dsp2pos(Iparm1,0.4) 5822 G2frame.GPXtree.SetItemPyData( 5823 G2frame.GPXtree.AppendItem(Id,text='Limits'), 5824 rd.pwdparms.get('Limits',[(Tmin,Tmax),[Tmin1,Tmax]]) 5825 ) 5826 G2frame.PatternId = G2gd.GetGPXtreeItemId(G2frame,Id,'Limits') 5827 G2frame.GPXtree.SetItemPyData( 5828 G2frame.GPXtree.AppendItem(Id,text='Background'), 5829 rd.pwdparms.get('Background', 5830 [['chebyschev',True,3,1.0,0.0,0.0],{'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]}]) 5831 ) 5832 G2frame.GPXtree.SetItemPyData( 5833 G2frame.GPXtree.AppendItem(Id,text='Instrument Parameters'), 5834 [Iparm1,Iparm2]) 5835 G2frame.GPXtree.SetItemPyData( 5836 G2frame.GPXtree.AppendItem(Id,text='Sample Parameters'), 5837 rd.Sample) 5838 G2frame.GPXtree.SetItemPyData( 5839 G2frame.GPXtree.AppendItem(Id,text='Peak List') 5840 ,{'peaks':[],'sigDict':{}}) 5841 G2frame.GPXtree.SetItemPyData( 5842 G2frame.GPXtree.AppendItem(Id,text='Index Peak List'), 5843 [[],[]]) 5844 G2frame.GPXtree.SetItemPyData( 5845 G2frame.GPXtree.AppendItem(Id,text='Unit Cells List'), 5846 []) 5847 G2frame.GPXtree.SetItemPyData( 5848 G2frame.GPXtree.AppendItem(Id,text='Reflection Lists'), 5849 {}) 5850 # if any Control values have been set, move them into tree 5851 Controls = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,G2frame.root, 'Controls')) 5852 Controls.update(rd.Controls) 5853 # Tree entries complete 5854 # select and show last PWDR file to be read 5855 if Id: 5856 G2frame.EnablePlot = True 5857 G2frame.GPXtree.Expand(Id) 5858 G2frame.GPXtree.SelectItem(Id) 5859 5860 global AutoLoadWindow 5861 Settings = {} 5862 if AutoLoadWindow: # make sure only one window is open at a time 5863 try: 5864 AutoLoadWindow.Destroy() 5865 except: 5866 pass 5867 AutoLoadWindow = None 5868 pwdrReaders = [i for i in G2fil.LoadImportRoutines("pwd", "Powder_Data") 5869 if i.scriptable] 5870 fmtchoices = [p.longFormatName for p in pwdrReaders] 5871 Settings['fmt'] = [i for i,v in enumerate(fmtchoices) if 'fxye' in v][0] 5872 Settings['ext'] = 0 5873 Settings['extStr'] = '' 5874 Settings['filter'] = '*.*' 5875 Settings['indir'] = os.getcwd() 5876 Settings['instfile'] = '' 5877 Settings['timer'] = wx.Timer() 5878 Settings['timer'].Bind(wx.EVT_TIMER,RunTimerLoop) 5879 Settings['filesread'] = [] 5880 dlg = wx.Frame(G2frame,title='Automatic Data Loading', 5881 style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX) 5882 mnpnl = wx.Panel(dlg) 5883 mnsizer = wx.BoxSizer(wx.VERTICAL) 5884 sizer = wx.BoxSizer(wx.HORIZONTAL) 5885 sizer.Add(wx.StaticText(mnpnl, wx.ID_ANY,'Select format:')) 5886 fmtSel = G2ChoiceButton(mnpnl,fmtchoices,Settings,'fmt', 5887 onChoice=onSetFmtSelection 5888 ) 5889 sizer.Add(fmtSel,1,wx.EXPAND) 5890 mnsizer.Add(sizer,0,wx.EXPAND) 5891 5892 sizer = wx.BoxSizer(wx.HORIZONTAL) 5893 sizer.Add(wx.StaticText(mnpnl, wx.ID_ANY,'Select extension:')) 5894 extSel = G2ChoiceButton(mnpnl,[],Settings,'ext',Settings,'extStr', 5895 onChoice=onSetExtSelection 5896 ) 5897 sizer.Add(extSel,0) 5898 mnsizer.Add(sizer,0,wx.EXPAND) 5899 5900 sizer = wx.BoxSizer(wx.HORIZONTAL) 5901 sizer.Add((-1,-1),1,wx.EXPAND,1) 5902 sizer.Add(wx.StaticText(mnpnl, wx.ID_ANY,' File filter: ')) 5903 flterInp = ValidatedTxtCtrl(mnpnl,Settings,'filter') 5904 sizer.Add(flterInp) 5905 mnsizer.Add(sizer,0,wx.EXPAND,0) 5906 5907 sizer = wx.BoxSizer(wx.HORIZONTAL) 5908 sizer.Add(wx.StaticText(mnpnl, wx.ID_ANY,'Read from: '),0,wx.ALIGN_CENTER_VERTICAL) 5909 fInp3 = ValidatedTxtCtrl(mnpnl,Settings,'indir',size=(300,-1), 5910 OnLeave=TestInput) 5911 sizer.Add(fInp3,1,wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) 5912 btn3 = wx.Button(mnpnl, wx.ID_ANY, "Browse") 5913 btn3.Bind(wx.EVT_BUTTON, OnBrowse) 5914 sizer.Add(btn3,0,wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) 5915 mnsizer.Add(sizer,0,wx.EXPAND) 5916 5917 sizer = wx.BoxSizer(wx.HORIZONTAL) 5918 sizer.Add(wx.StaticText(mnpnl, wx.ID_ANY,'Instrument parameter file from: '),0,wx.ALIGN_CENTER_VERTICAL) 5919 fInp4 = ValidatedTxtCtrl(mnpnl,Settings,'instfile',size=(300,-1), 5920 OnLeave=TestInput) 5921 sizer.Add(fInp4,1,wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) 5922 btn4 = wx.Button(mnpnl, wx.ID_ANY, "Browse") 5923 btn4.Bind(wx.EVT_BUTTON, OnBrowse) 5924 sizer.Add(btn4,0,wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) 5925 mnsizer.Add(sizer,0,wx.EXPAND) 5926 5927 # buttons on bottom 5928 sizer = wx.BoxSizer(wx.HORIZONTAL) 5929 sizer.Add((-1,-1),1,wx.EXPAND) 5930 btnstart = wx.Button(mnpnl, wx.ID_ANY, "Start") 5931 btnstart.Bind(wx.EVT_BUTTON, OnStart) 5932 sizer.Add(btnstart) 5933 sizer.Add((20,-1),0,wx.EXPAND) 5934 btnclose = wx.Button(mnpnl, wx.ID_ANY, "Close") 5935 onSetFmtSelection() 5936 btnclose.Bind(wx.EVT_BUTTON, OnQuit) 5937 sizer.Add(btnclose) 5938 sizer.Add((-1,-1),1,wx.EXPAND) 5939 mnsizer.Add(sizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP,5) 5940 5941 mnpnl.SetSizer(mnsizer) 5942 mnsizer.Fit(dlg) 5943 dlg.Show() 5944 AutoLoadWindow = dlg # save window reference 5945 5946 5623 5947 if __name__ == '__main__': 5624 5948 app = wx.PySimpleApp() -
trunk/GSASIIdataGUI.py
r4032 r4036 1239 1239 item = submenu.Append(wx.ID_ANY,'Simulate a dataset','Create a powder data set entry that will be simulated') 1240 1240 self.Bind(wx.EVT_MENU, self.OnDummyPowder, id=item.GetId()) 1241 item = submenu.Append(wx.ID_ANY,'Auto Import','Import data files as found') 1242 def OnAutoImport(event): 1243 #import imp 1244 #imp.reload(G2G) 1245 G2G.AutoLoadFiles(self) 1246 self.Bind(wx.EVT_MENU, OnAutoImport, id=item.GetId()) 1247 1241 1248 item = submenu.Append(wx.ID_ANY,'Fit instr. profile from fundamental parms...','') 1242 1249 self.Bind(wx.EVT_MENU, self.OnPowderFPA, id=item.GetId())
Note: See TracChangeset
for help on using the changeset viewer.