Changeset 4036


Ignore:
Timestamp:
Jun 21, 2019 6:00:51 PM (2 years ago)
Author:
toby
Message:

add PWDR autoload

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIctrlGUI.py

    r4031 r4036  
    143143        wg = Placeholder('Grid PyGridTableBase PyGridCellEditor'.split())
    144144import time
     145import glob
    145146import copy
     147import random as ran
    146148import webbrowser     # could postpone this for quicker startup
    147149import numpy as np
     
    155157import GSASIIlog as log
    156158import GSASIIobj as G2obj
     159import GSASIIfiles as G2fil
     160import GSASIIscriptable as G2sc
    157161
    158162
     
    11541158        self.onChoice = None
    11551159        self.SetSelection(wx.NOT_FOUND)
    1156         if self.indLoc is not None and self.strLoc is not None:
     1160        if self.indLoc is not None and self.indKey is not None:
    11571161            try:
    11581162                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):
    11621167                pass
    11631168        elif self.strLoc is not None and self.strKey is not None:
     
    11671172                    self.indLoc[self.indKey] = self.GetSelection()
    11681173                    log.LogVarChange(self.indLoc,self.indKey)
    1169             except (KeyError,ValueError):
     1174            except (KeyError,ValueError,TypeError):
    11701175                pass
    11711176        self.Bind(wx.EVT_CHOICE, self._OnChoice)
     
    56205625        except KeyError:
    56215626            pass
    5622            
     5627################################################################################
     5628# Autoload PWDR files
     5629################################################################################
     5630AutoLoadWindow = None
     5631
     5632def 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
    56235947if __name__ == '__main__':
    56245948    app = wx.PySimpleApp()
  • trunk/GSASIIdataGUI.py

    r4032 r4036  
    12391239        item = submenu.Append(wx.ID_ANY,'Simulate a dataset','Create a powder data set entry that will be simulated')
    12401240        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       
    12411248        item = submenu.Append(wx.ID_ANY,'Fit instr. profile from fundamental parms...','')
    12421249        self.Bind(wx.EVT_MENU, self.OnPowderFPA, id=item.GetId())
Note: See TracChangeset for help on using the changeset viewer.