Changeset 607 for trunk/GSASII.py


Ignore:
Timestamp:
May 9, 2012 8:55:25 AM (10 years ago)
Author:
toby
Message:

revise help to include tutorials on tree only; add kw args to all readers; cache cif for multiple passes; start on powder imports

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r600 r607  
    1414import sys
    1515import math
     16import copy
    1617#import cPickle
    1718import time
     
    126127        parent.Append(menu=self.Import, title='Import')
    127128        parent.Append(menu=self.Export, title='Export')
    128         parent.Append(menu=G2gd.MyHelp(self,helpType='Tutorials'),title='&Tutorials' )
    129         parent.Append(menu=G2gd.MyHelp(self,helpType='Data tree'),title='&Help' )
    130 
     129        self.HelpMenu=G2gd.MyHelp(self,
     130                                  helpType='Data tree',
     131                                  morehelpitems=[('&Tutorials','Tutorials')]
     132                                  )
     133        parent.Append(menu=self.HelpMenu,title='&Help')
     134       
    131135    def _init_coll_File_Items(self, parent):
    132136        parent.Append(help='Open a gsasii project file (*.gpx)', id=wxID_FILEOPEN,
     
    234238                if fp: fp.close()
    235239
    236     def OnImportGeneric(self,reader,readerlist,label):
     240    def OnImportGeneric(self,reader,readerlist,label,multiple=False):
    237241        '''Call the requested import reader or all of the appropriate
    238242        import readers in response to a menu item
     
    240244        self.lastimport = ''
    241245        if reader is None:
     246            multiple = False
    242247            #print "use all formats"
    243248            choices = "any file (*.*)|*.*"
     
    267272                choices += "|any file (*.*)|*.*"
    268273        # get the file
     274        if multiple:
     275            mode = style=wx.OPEN | wx.CHANGE_DIR | wx.MULTIPLE
     276        else:
     277            mode = style=wx.OPEN | wx.CHANGE_DIR
    269278        dlg = wx.FileDialog(
    270279            self, message="Choose "+label+" input file",
    271280            #defaultDir=os.getcwd(),
    272281            defaultFile="",
    273             wildcard=choices,
    274             style=wx.OPEN | wx.CHANGE_DIR
     282            wildcard=choices, style=mode
    275283            )
    276284        try:
    277285            if dlg.ShowModal() == wx.ID_OK:
    278                 file = dlg.GetPath()
     286                if multiple:
     287                    filelist = dlg.GetPaths()
     288                    if len(filelist) == 0: return []
     289                else:
     290                    filename = dlg.GetPath()
     291                    filelist = [filename,]
    279292            else: # cancel was pressed
    280                 return None
     293                return []
    281294        finally:
    282295            dlg.Destroy()
     296        rd_list = []
     297        for filename in filelist:
    283298        # set what formats are compatible with this file
    284         primaryReaders = []
    285         secondaryReaders = []
    286         for reader in readerlist:
    287             flag = reader.ExtensionValidator(file)
    288             if flag is None:
    289                 secondaryReaders.append(reader)
    290             elif flag:
    291                 primaryReaders.append(reader)
    292         if len(secondaryReaders) + len(primaryReaders) == 0:
    293             self.ErrorDialog('No Format','No matching format for file '+file)
    294             return None
    295        
    296         fp = None
    297         try:
    298             fp = open(file,'r')
    299             self.lastimport = file
    300             # try the file first with Readers that specify the
    301             # files extension and later with ones that allow it
    302             for rd in primaryReaders+secondaryReaders:
    303                 fp.seek(0)  # rewind
    304                 if not rd.ContentsValidator(fp):
    305                     continue # rejected on cursory check
    306                 try:
    307                     fp.seek(0)  # rewind
    308                     flag = rd.Reader(file,fp,self)
    309                 except:
    310                     import traceback
    311                     print traceback.format_exc()
    312                     self.ErrorDialog('Read Error',
    313                                      'Error reading file '+file
    314                                      +' with format '+ rd.formatName)
    315                     continue
    316                 if not flag: continue
    317                 return rd
    318         except:
    319             import traceback
    320             print traceback.format_exc()
    321             self.ErrorDialog('Open Error','Error on open of file '+file)
    322         finally:
    323             if fp: fp.close()
    324         return None
     299            primaryReaders = []
     300            secondaryReaders = []
     301            for reader in readerlist:
     302                flag = reader.ExtensionValidator(filename)
     303                if flag is None:
     304                    secondaryReaders.append(reader)
     305                elif flag:
     306                    primaryReaders.append(reader)
     307            if len(secondaryReaders) + len(primaryReaders) == 0:
     308                self.ErrorDialog('No Format','No matching format for file '+filename)
     309                return []
     310
     311            fp = None
     312            msg = ''
     313            try:
     314                fp = open(filename,'r')
     315                self.lastimport = filename
     316                # try the file first with Readers that specify the
     317                # files extension and later with ones that allow it
     318                flag = False
     319                for rd in primaryReaders+secondaryReaders:
     320                    try:
     321                        fp.seek(0)  # rewind
     322                        if not rd.ContentsValidator(fp): continue # rejected on cursory check
     323                        repeat = True
     324                        rdbuffer = {} # create temporary storage for file reader
     325                        block = 0
     326                        while repeat:
     327                            block += 1
     328                            repeat = False
     329                            fp.seek(0)  # rewind
     330                            rd.objname = ospath.basename(filename)
     331                            flag = rd.Reader(filename,fp,self,
     332                                             buffer=rdbuffer,
     333                                             blocknum=block)
     334                            if flag:
     335                                rd_list.append(copy.deepcopy(rd)) # success
     336                                if rd.repeat: repeat = True
     337                    except:
     338                        import traceback
     339                        print traceback.format_exc()
     340                        msg += '\nError reading file '+filename+' with format '+ rd.formatName
     341                        #self.ErrorDialog('Read Error',
     342                        #                 'Error reading file '+filename
     343                        #                 +' with format '+ rd.formatName)
     344                        continue
     345                    if flag: break # success reading
     346                else:
     347                    self.ErrorDialog('Read Error','No reader is able to read from file '+filename+msg)
     348            except:
     349                import traceback
     350                print traceback.format_exc()
     351                self.ErrorDialog('Open Error','Error on open of file '+filename)
     352            finally:
     353                if fp: fp.close()
     354        return rd_list
    325355
    326356    def _init_Import_Phase(self,parent):
     
    348378    def OnImportPhase(self,event):
    349379        # look up which format was requested
    350         reader = self.ImportMenuId.get(event.GetId())
    351         rd = self.OnImportGeneric(reader,
     380        reqrdr = self.ImportMenuId.get(event.GetId())
     381        rdlist = self.OnImportGeneric(reqrdr,
    352382                                  self.ImportPhaseReaderlist,
    353383                                  'phase')
    354         if rd is None: return
    355         dlg = wx.TextEntryDialog( # allow editing of phase name
    356             self, 'Enter the name for the new phase',
    357             'Edit phase name', rd.Phase['General']['Name'],
    358             style=wx.OK)
    359         dlg.CenterOnParent()
    360         if dlg.ShowModal() == wx.ID_OK:
    361             rd.Phase['General']['Name'] = dlg.GetValue()
    362         dlg.Destroy()
    363         PhaseName = rd.Phase['General']['Name']
    364         print 'Read phase '+str(PhaseName)+' from file '+str(self.lastimport)
     384        if len(rdlist) == 0: return
     385        # for now rdlist is only expected to have one element
     386        # but this will allow multiple phases to be imported
    365387        self.CheckNotebook()
    366         if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
    367             sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
    368         else:
    369             sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
    370         psub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
    371         self.PatternTree.SetItemPyData(psub,rd.Phase)
    372         self.PatternTree.Expand(self.root) # make sure phases are seen
    373         self.PatternTree.Expand(sub)
    374         self.PatternTree.Expand(psub)
     388        for rd in rdlist:
     389            dlg = wx.TextEntryDialog( # allow editing of phase name
     390                self, 'Enter the name for the new phase',
     391                'Edit phase name', rd.Phase['General']['Name'],
     392                style=wx.OK)
     393            dlg.CenterOnParent()
     394            if dlg.ShowModal() == wx.ID_OK:
     395                rd.Phase['General']['Name'] = dlg.GetValue()
     396            dlg.Destroy()
     397            PhaseName = rd.Phase['General']['Name']
     398            print 'Read phase '+str(PhaseName)+' from file '+str(self.lastimport)
     399            if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
     400                sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
     401            else:
     402                sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     403            psub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
     404            self.PatternTree.SetItemPyData(psub,rd.Phase)
     405            self.PatternTree.Expand(self.root) # make sure phases are seen
     406            self.PatternTree.Expand(sub)
     407            self.PatternTree.Expand(psub)
    375408        return # success
    376409       
     
    387420            submenu, help='Import Structure Factor data')
    388421        item = submenu.Append(wx.ID_ANY,
    389                               help='Import Structure Factor data based selected by extension',
    390                               kind=wx.ITEM_NORMAL,text='Import Structure Factor by extension')
     422                              help='Import Structure Factor (determine format from file extension)',
     423                              kind=wx.ITEM_NORMAL,text='Import Structure Factor (fmt from extension)')
    391424        self.Bind(wx.EVT_MENU, self.OnImportSfact, id=item.GetId())
    392425        for reader in self.ImportSfactReaderlist:
     
    399432    def OnImportSfact(self,event):
    400433        # look up which format was requested
    401         reader = self.ImportMenuId.get(event.GetId())
    402         rd = self.OnImportGeneric(reader,
     434        reqrdr = self.ImportMenuId.get(event.GetId())
     435        rdlist = self.OnImportGeneric(reqrdr,
    403436                                  self.ImportSfactReaderlist,
    404437                                  'Structure Factor')
    405         if rd is None: return
    406         HistName = ospath.basename(self.lastimport)
    407         dlg = wx.TextEntryDialog( # allow editing of Structure Factor name
    408             self, 'Enter the name for the new Structure Factor',
    409             'Edit Structure Factor name', HistName,
    410             style=wx.OK)
    411         dlg.CenterOnParent()
    412         if dlg.ShowModal() == wx.ID_OK:
    413             HistName = dlg.GetValue()
    414         dlg.Destroy()
    415         print 'Read structure factor table '+str(HistName)+' from file '+str(self.lastimport)
     438        if len(rdlist) == 0: return
    416439        self.CheckNotebook()
    417         Id = self.PatternTree.AppendItem(parent=self.root,
    418                                          text='HKLF '+HistName)
    419         self.PatternTree.SetItemPyData(Id,rd.RefList)
    420         Sub = self.PatternTree.AppendItem(Id,text='Instrument Parameters')
    421         self.PatternTree.SetItemPyData(Sub,rd.Parameters)
    422         self.PatternTree.SetItemPyData(
    423             self.PatternTree.AppendItem(Id,text='HKL Plot Controls'),
    424             rd.Controls)
     440        for rd in rdlist:
     441            HistName = rd.objname
     442            if len(rdlist) <= 2:
     443                dlg = wx.TextEntryDialog( # allow editing of Structure Factor name
     444                    self, 'Enter the name for the new Structure Factor',
     445                    'Edit Structure Factor name', HistName,
     446                    style=wx.OK)
     447                dlg.CenterOnParent()
     448                if dlg.ShowModal() == wx.ID_OK:
     449                    HistName = dlg.GetValue()
     450                dlg.Destroy()
     451            print 'Read structure factor table '+str(HistName)+' from file '+str(self.lastimport)
     452            Id = self.PatternTree.AppendItem(parent=self.root,
     453                                             text='HKLF '+HistName)
     454            self.PatternTree.SetItemPyData(Id,rd.RefList)
     455            Sub = self.PatternTree.AppendItem(Id,text='Instrument Parameters')
     456            self.PatternTree.SetItemPyData(Sub,rd.Parameters)
     457            self.PatternTree.SetItemPyData(
     458                self.PatternTree.AppendItem(Id,text='HKL Plot Controls'),
     459                rd.Controls)
     460            self.PatternTree.SelectItem(Id)
     461            self.PatternTree.Expand(Id)
     462            self.Sngl = Id
     463        return # success
     464
     465    def _init_Import_powder(self,parent):
     466        '''import all the G2importpwd*.py files that are found in the
     467        path and configure the Import Powder Data menus accordingly
     468        '''
     469        self.ImportPowderReaderlist = []
     470        self._init_Import_routines(parent,'pwd',
     471                                   self.ImportPowderReaderlist,
     472                                   'Powder_Data')
     473        submenu = wx.Menu()
     474        item = parent.AppendMenu(wx.ID_ANY, 'Import Powder Data menu',
     475            submenu, help='Import Powder data')
     476        item = submenu.Append(wx.ID_ANY,
     477                              help='Import powder data (determine format from file extension)',
     478                              kind=wx.ITEM_NORMAL,text='Import powder data (fmt from extension)')
     479        self.Bind(wx.EVT_MENU, self.OnImportPowder, id=item.GetId())
     480        for reader in self.ImportPowderReaderlist:
     481            item = submenu.Append(wx.ID_ANY,
     482                help='Import specific format powder data',
     483                kind=wx.ITEM_NORMAL,text='Import powder data from '+reader.formatName+' file ...')
     484            self.ImportMenuId[item.GetId()] = reader
     485            self.Bind(wx.EVT_MENU, self.OnImportPowder, id=item.GetId())
     486           
     487    def GetPowderIparm(self,rd, prevIparm):
     488        '''Open and read an instrument parameter file for a data file
     489        for now, just set defaults
     490        '''
     491        dlg = wx.MessageDialog(self,
     492'''Is this laboratory Cu Ka1/Ka2 data?
     493(No = 0.6A wavelength synchrotron data)
     494Change wavelength in Instrument Parameters if needed''',
     495                               'Data type?',
     496                               wx.YES_NO | wx.ICON_QUESTION)
     497        try:
     498            result = dlg.ShowModal()
     499        finally:
     500            dlg.Destroy()
     501        if result == wx.ID_YES:
     502            return rd.Iparm_CuKa12
     503        else:
     504            return rd.Iparm_Sync06
     505
     506    def SetPowderInstParms(self, Iparm):
     507        '''extracts values from instrument parameter file and creates
     508        the contents of the instrument parameter tree entry
     509        '''
     510        DataType = Iparm['INS   HTYPE '].strip()[0:3]  # take 1st 3 chars
     511        data = [DataType,]
     512        if 'C' in DataType:
     513            s = Iparm['INS  1 ICONS']
     514            v = (G2IO.sfloat(s[:10]),G2IO.sfloat(s[10:20]),G2IO.sfloat(s[20:30]),G2IO.sfloat(s[55:65]),G2IO.sfloat(s[40:50])) #get lam1, lam2, zero, pola & ratio
     515            if not v[1]:
     516                names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth']
     517                v = (v[0],v[2],v[4])
     518                codes = [0,0,0,0]
     519            else:
     520                names = ['Type','Lam1','Lam2','Zero','I(L2)/I(L1)','Polariz.','U','V','W','X','Y','SH/L','Azimuth']
     521                codes = [0,0,0,0,0,0]
     522            data.extend(v)
     523            v1 = Iparm['INS  1PRCF1 '].split()                                                 
     524            v = Iparm['INS  1PRCF11'].split()
     525            data.extend([float(v[0]),float(v[1]),float(v[2])])                  #get GU, GV & GW - always here
     526            azm = Iparm.get('INS  1DETAZM')
     527            if azm is None: #not in this Iparm file
     528                azm = 0.0
     529            else:
     530                azm = float(azm)
     531            v = Iparm['INS  1PRCF12'].split()
     532            if v1[0] == 3:
     533                data.extend([float(v[0]),float(v[1]),float(v[2])+float(v[3],azm)])  #get LX, LY, S+H/L & azimuth
     534            else:
     535                data.extend([0.0,0.0,0.002,azm])                                      #OK defaults if fxn #3 not 1st in iprm file
     536            codes.extend([0,0,0,0,0,0,0])
     537            return [tuple(data),data,codes,names]
     538
     539    def OnImportPowder(self,event):
     540        reqrdr = self.ImportMenuId.get(event.GetId())  # look up which format was requested
     541        rdlist = self.OnImportGeneric(reqrdr,
     542                                      self.ImportPowderReaderlist,
     543                                      'Powder Data',multiple=True)
     544        if len(rdlist) == 0: return
     545        self.CheckNotebook()
     546        Iparm = None
     547        for rd in rdlist:
     548            Iparm = self.GetPowderIparm(rd, Iparm)
     549            print 'Read powder data '+str(
     550                rd.idstring)+' from file '+str(
     551                self.lastimport)
     552            Id = self.PatternTree.AppendItem(
     553                parent=self.root,
     554                text='PWDR '+rd.idstring)
     555            self.PatternTree.SetItemPyData(Id,[rd.powderentry,rd.powderdata])
     556            self.PatternTree.SetItemPyData(
     557                self.PatternTree.AppendItem(Id,text='Comments'),
     558                rd.comments)
     559            Tmin = min(rd.powderdata[0])
     560            Tmax = max(rd.powderdata[0])
     561            self.PatternTree.SetItemPyData(
     562                self.PatternTree.AppendItem(Id,text='Limits'),
     563                [(Tmin,Tmax),[Tmin,Tmax]])
     564            self.PatternId = G2gd.GetPatternTreeItemId(self,Id,'Limits')
     565            self.PatternTree.SetItemPyData(
     566                self.PatternTree.AppendItem(Id,text='Background'),
     567                [['chebyschev',True,3,1.0,0.0,0.0],
     568                 {'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]}])
     569            self.PatternTree.SetItemPyData(
     570                self.PatternTree.AppendItem(Id,text='Instrument Parameters'),
     571                self.SetPowderInstParms(Iparm))
     572            self.PatternTree.SetItemPyData(
     573                self.PatternTree.AppendItem(Id,text='Sample Parameters'),
     574                rd.Sample)
     575            self.PatternTree.SetItemPyData(
     576                self.PatternTree.AppendItem(Id,text='Peak List')
     577                ,[])
     578            self.PatternTree.SetItemPyData(
     579                self.PatternTree.AppendItem(Id,text='Index Peak List'),
     580                [])
     581            self.PatternTree.SetItemPyData(
     582                self.PatternTree.AppendItem(Id,text='Unit Cells List'),
     583                [])
     584            self.PatternTree.SetItemPyData(
     585                self.PatternTree.AppendItem(Id,text='Reflection Lists'),
     586                {})
     587            self.PatternTree.Expand(Id)
    425588        self.PatternTree.SelectItem(Id)
    426         self.PatternTree.Expand(Id)
    427         self.Sngl = Id
    428589        return # success
    429590
     
    476637        self.ImportMenuId = {}
    477638        self._init_Import_Phase(self.Import)
     639        self._init_Import_powder(self.Import)
    478640        self._init_Import_Sfact(self.Import)
    479641        self._init_coll_Import_Items(self.Import)
Note: See TracChangeset for help on using the changeset viewer.