Changeset 607


Ignore:
Timestamp:
May 9, 2012 8:55:25 AM (11 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

Location:
trunk
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/G2importphase.py

    r584 r607  
    2727    #    return True
    2828
    29     def Reader(self,filename,filepointer, ParentFrame=None):
     29    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
    3030        try:
    3131            self.Phase = G2IO.ReadPDBPhase(filename)
     
    5454        return False
    5555
    56     def Reader(self,filename,filepointer, ParentFrame=None):
     56    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
    5757        try:
    5858            self.Phase = G2IO.ReadEXPPhase(ParentFrame, filename)
  • trunk/G2importphase_CIF.py

    r584 r607  
    4141                return False # found something else
    4242        return True
    43     def Reader(self,filename,filepointer, ParentFrame=None):
     43    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
    4444        returnstat = False
    4545        cellitems = (
  • trunk/G2importphase_GPX.py

    r584 r607  
    2727            return False
    2828        return True
    29     def Reader(self,filename,filepointer, ParentFrame=None):
     29    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
    3030        try:
    3131            phasenames = G2str.GetPhaseNames(filename)
  • trunk/G2importsfact.py

    r584 r607  
    3838        return True
    3939
    40     def Reader(self,filename,filepointer, ParentFrame=None):
     40    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
    4141        try:
    4242            for S in filepointer:
  • trunk/G2importsfact_CIF.py

    r584 r607  
    1111import sys
    1212import numpy as np
     13import os.path
    1314import GSASIIIO as G2IO
    1415import CifFile as cif # PyCifRW from James Hester
     
    4243                return False # found something else
    4344        return True
    44     def Reader(self,filename,filepointer, ParentFrame=None):
     45    def Reader(self,filename,filepointer, ParentFrame=None, **kwarg):
    4546        hklitems = ('_refln_index_h','_refln_index_k','_refln_index_l')
    4647        cellitems = (
     
    5253            '_chemical_formula_sum'
    5354            )
     55        rdbuffer = kwarg.get('buffer')
     56        cf = None
    5457        try:
    55             self.ShowBusy() # this can take a while
    56             ciffile = 'file:'+urllib.pathname2url(filename)
    57             cf = cif.ReadCif(ciffile)
    58             self.DoneBusy()
     58            if self.repeat and rdbuffer is not None:
     59                cf = rdbuffer.get('lastcif')
     60                print 'no-parse'
     61            if cf is None:
     62                print 'parse'
     63                self.ShowBusy() # this can take a while
     64                ciffile = 'file:'+urllib.pathname2url(filename)
     65                cf = cif.ReadCif(ciffile)
     66                self.DoneBusy()
    5967            # scan blocks for reflections
    6068            blklist = []
     
    104112                    sg = cf[blknm].get("_symmetry_space_group_name_H-M")
    105113                    if sg: choice[-1] += ', (' + sg.strip() + ')'
    106                 selblk = self.BlockSelector(
    107                     choice,
    108                     ParentFrame=ParentFrame,
    109                     title='Select a dataset from one the CIF data_ blocks below',
    110                     size=(600,100),
    111                     header='Dataset Selector')
     114                choice.append('Import all of the above')
     115                if self.repeat: # we were called to repeat the read
     116                    selblk = self.repeatcount
     117                    self.repeatcount += 1
     118                    if self.repeatcount >= len(blklist): self.repeat = False
     119                else:
     120                    selblk = self.BlockSelector(
     121                        choice,
     122                        ParentFrame=ParentFrame,
     123                        title='Select a dataset from one the CIF data_ blocks below',
     124                        size=(600,100),
     125                        header='Dataset Selector')
    112126            if selblk is None:
    113127                return False # no block selected or available
    114             else:
    115                 blknm = blklist[selblk]
    116                 blk = cf[blklist[selblk]]
    117                 # read in reflections
    118                 refloop = blk.GetLoop('_refln_index_h')
    119                 itemkeys = {}
    120                 # prepare an index to the CIF reflection loop
    121                 for i,key in enumerate(refloop.keys()):
    122                     itemkeys[key.lower()] = i
    123                 if '_refln_f_squared_calc' in itemkeys:
    124                     FcalcPresent = True
    125                 elif '_refln_f_calc' in itemkeys:
    126                     FcalcPresent = True
    127                 else:
    128                     FcalcPresent = False
    129                 for item in refloop:
    130                     HKL = []
    131                     for i in hklitems: # ('_refln_index_h','_refln_index_k','_refln_index_l')
    132                         num = itemkeys.get(i)
     128            if selblk >= len(blklist): # all blocks selected
     129                selblk = 0
     130                self.repeat = True
     131                if rdbuffer is not None:
     132                    rdbuffer['lastcif'] = cf # save the parsed cif for the next loop
     133                self.repeatcount = 1
     134            blknm = blklist[selblk]
     135            blk = cf[blklist[selblk]]
     136            self.objname = os.path.basename(filename)+':'+str(blknm)
     137            # read in reflections
     138            refloop = blk.GetLoop('_refln_index_h')
     139            itemkeys = {}
     140            # prepare an index to the CIF reflection loop
     141            for i,key in enumerate(refloop.keys()):
     142                itemkeys[key.lower()] = i
     143            if '_refln_f_squared_calc' in itemkeys:
     144                FcalcPresent = True
     145            elif '_refln_f_calc' in itemkeys:
     146                FcalcPresent = True
     147            else:
     148                FcalcPresent = False
     149            for item in refloop:
     150                HKL = []
     151                for i in hklitems: # ('_refln_index_h','_refln_index_k','_refln_index_l')
     152                    num = itemkeys.get(i)
     153                    try:
     154                        HKL.append(int(item[num]))
     155                    except:
     156                        HKL.append('.')
     157                ref = [HKL,0.,0.,0,0,0,0]  # HKL. Fo**2, sig(Fo**2), Fc, Fcp, Fcpp & phase
     158                # get F or F**2 and sigma
     159                if '_refln_f_squared_meas' in itemkeys:
     160                    try:
     161                        ref[1] = float(item[itemkeys['_refln_f_squared_meas']])
     162                    except:
     163                        pass
     164                    if  '_refln_f_squared_sigma' in itemkeys:
    133165                        try:
    134                             HKL.append(int(item[num]))
     166                            ref[2] = float(item[itemkeys['_refln_f_squared_sigma']])
    135167                        except:
    136                             HKL.append('.')
    137                     ref = [HKL,0.,0.,0,0,0,0]  # HKL. Fo**2, sig(Fo**2), Fc, Fcp, Fcpp & phase
    138                     # get F or F**2 and sigma
    139                     if '_refln_f_squared_meas' in itemkeys:
     168                            pass                           
     169                elif '_refln_f_meas' in itemkeys:
     170                    try:
     171                        ref[1] = float(item[itemkeys['_refln_f_meas']])**2
     172                    except:
     173                        pass                               
     174                    if  '_refln_f_sigma' in itemkeys:
    140175                        try:
    141                             ref[1] = float(item[itemkeys['_refln_f_squared_meas']])
    142                         except:
    143                             pass
    144                         if  '_refln_f_squared_sigma' in itemkeys:
    145                             try:
    146                                 ref[2] = float(item[itemkeys['_refln_f_squared_sigma']])
    147                             except:
    148                                 pass                           
    149                     elif '_refln_f_meas' in itemkeys:
    150                         try:
    151                             ref[1] = float(item[itemkeys['_refln_f_meas']])**2
     176                            ref[2] = 2.*sqrt(ref[1])*float(item[itemkeys['_refln_f_sigma']])
    152177                        except:
    153178                            pass                               
    154                         if  '_refln_f_sigma' in itemkeys:
    155                             try:
    156                                 ref[2] = 2.*sqrt(ref[1])*float(item[itemkeys['_refln_f_sigma']])
    157                             except:
    158                                 pass                               
    159                     if '_refln_f_squared_calc' in itemkeys:
    160                         try:
    161                             ref[3] = float(item[itemkeys['_refln_f_squared_calc']])
    162                         except:
    163                             pass                               
    164                     elif '_refln_f_calc' in itemkeys:
    165                         try:
    166                             ref[3] = float(item[itemkeys['_refln_f_calc']])**2
    167                         except:
    168                             pass                               
    169                     if '_refln_phase_calc' in itemkeys:
    170                         try:
    171                             ref[6] = float(item[itemkeys['_refln_phase_calc']])
    172                         except:
    173                             pass                               
    174  
    175                     self.RefList.append(ref)
    176                 self.UpdateControls(Type='Fosq',FcalcPresent=FcalcPresent) # set Fobs type & if Fcalc values are loaded
    177                 if blk.get('_diffrn_radiation_probe'):
    178                     if blk['_diffrn_radiation_probe'] == 'neutron':
    179                         type = 'SNC'
    180                 else:
    181                     type = 'SXC'
    182                 if blk.get('_diffrn_radiation_wavelength'):
    183                     wave = blk['_diffrn_radiation_wavelength']
    184                 else:
    185                     wave = None
    186                 self.UpdateParameters(Type=type,Wave=wave) # histogram type
    187                 return True
     179                if '_refln_f_squared_calc' in itemkeys:
     180                    try:
     181                        ref[3] = float(item[itemkeys['_refln_f_squared_calc']])
     182                    except:
     183                        pass                               
     184                elif '_refln_f_calc' in itemkeys:
     185                    try:
     186                        ref[3] = float(item[itemkeys['_refln_f_calc']])**2
     187                    except:
     188                        pass                               
     189                if '_refln_phase_calc' in itemkeys:
     190                    try:
     191                        ref[6] = float(item[itemkeys['_refln_phase_calc']])
     192                    except:
     193                        pass                               
     194
     195                self.RefList.append(ref)
     196            self.UpdateControls(Type='Fosq',FcalcPresent=FcalcPresent) # set Fobs type & if Fcalc values are loaded
     197            if blk.get('_diffrn_radiation_probe'):
     198                if blk['_diffrn_radiation_probe'] == 'neutron':
     199                    type = 'SNC'
     200            else:
     201                type = 'SXC'
     202            if blk.get('_diffrn_radiation_wavelength'):
     203                wave = blk['_diffrn_radiation_wavelength']
     204            else:
     205                wave = None
     206            self.UpdateParameters(Type=type,Wave=wave) # histogram type
     207            return True
    188208        except Exception as detail:
    189209            print self.formatName+' read error:'+str(detail) # for testing
  • 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)
  • trunk/GSASIIIO.py

    r584 r607  
    12911291        self.warnings = ''
    12921292        self.errors = ''
     1293        # used for readers that will use multiple passes to read
     1294        # more than one data block
     1295        self.repeat = False
     1296        self.repeatcount = 0
    12931297        #print 'created',self.__class__
    12941298
     
    13191323        wx.EndBusyCursor()
    13201324       
    1321 #    def Reader(self, filename, filepointer, ParentFrame=None):
     1325#    def Reader(self, filename, filepointer, ParentFrame=None, **unused):
    13221326#        '''This method must be supplied in the child class
    13231327#        it will read the file
     
    14571461            print "Unsupported Stract Fact type in ImportStructFactor.UpdateControls"
    14581462            raise Exception,"Unsupported Stract Fact type in ImportStructFactor.UpdateControls"
     1463
     1464######################################################################
     1465class ImportPowderData(ImportBaseclass):
     1466    '''Defines a base class for the reading of files with powder data
     1467    '''
     1468    # define some default instrument parameter files
     1469    # just like GSAS, sigh
     1470    Iparm_CuKa12 = { # Default Inst. parms for CuKa lab data
     1471        'INS   HTYPE ':'PXC ',
     1472        'INS  1 ICONS':'  1.540500  1.544300       0.0         0       0.7    0       0.5   ',
     1473        'INS  1PRCF1 ':'    3    8      0.01                                                ',
     1474        'INS  1PRCF11':'   2.000000E+00  -2.000000E+00   5.000000E+00   0.000000E+00        ',
     1475        'INS  1PRCF12':'   0.000000E+00   0.000000E+00   0.150000E-01   0.150000E-01        ',
     1476        }
     1477    Iparm_Sync06 = { # Default Inst. parms for 0.6A synchrotron data
     1478        'INS   HTYPE ':'PXC ',
     1479        'INS  1 ICONS':'  0.600000  0.000000       0.0         0      0.99    0       0.5   ',
     1480        'INS  1PRCF1 ':'    3    8      0.01                                                ',
     1481        'INS  1PRCF11':'   1.000000E+00  -1.000000E+00   0.300000E+00   0.000000E+00        ',
     1482        'INS  1PRCF12':'   0.000000E+00   0.000000E+00   0.100000E-01   0.100000E-01        ',
     1483        }
     1484    def __init__(self,
     1485                 formatName,
     1486                 longFormatName=None,
     1487                 extensionlist=[],
     1488                 strictExtension=False,
     1489                 ):
     1490        ImportBaseclass.__init__(self,formatName,
     1491                                            longFormatName,
     1492                                            extensionlist,
     1493                                            strictExtension)
     1494        self.powderentry = ['',None,None] #  (filename,Pos,Bank)
     1495        self.powderdata = [] # Powder dataset
     1496        '''A powder data set is a list with items [x,y,w,yc,yb,yd]:
     1497                np.array(x), # x-axis values
     1498                np.array(y), # powder pattern intensities
     1499                np.array(w), # 1/sig(intensity)^2 values (weights)
     1500                np.array(yc), # calc. intensities (zero)
     1501                np.array(yb), # calc. background (zero)
     1502                np.array(yd), # obs-calc profiles
     1503        '''                           
     1504        self.comments = []
     1505        self.idstring = ''
     1506        self.Sample = G2pdG.SetDefaultSample()
  • trunk/GSASIIgrid.py

    r600 r607  
    135135    it correctly. BHT
    136136    '''
    137     def __init__(self,frame,title='',helpType=None):
     137    def __init__(self,frame,title='',helpType=None,morehelpitems=[]):
    138138        wx.Menu.__init__(self,title)
    139         self.helpType = helpType
     139        self.HelpById = {}
    140140        self.frame = frame
    141141        # add a help item only when helpType is specified
     
    143143            helpobj = self.Append(text='Help on '+helpType,
    144144                id=wx.ID_ANY, kind=wx.ITEM_NORMAL)
    145             frame.Bind(wx.EVT_MENU, self.OnHelp, helpobj)
     145            frame.Bind(wx.EVT_MENU, self.OnHelpById, helpobj)
     146            self.HelpById[helpobj.GetId()] = helpType
    146147        self.Append(help='', id=wx.ID_ABOUT, kind=wx.ITEM_NORMAL,
    147148            text='&About GSAS-II')
    148149        frame.Bind(wx.EVT_MENU, self.OnHelpAbout, id=wx.ID_ABOUT)
    149 
    150     def OnHelp(self,event):
     150        for lbl,indx in morehelpitems:
     151            helpobj = self.Append(text=lbl,
     152                id=wx.ID_ANY, kind=wx.ITEM_NORMAL)
     153            frame.Bind(wx.EVT_MENU, self.OnHelpById, helpobj)
     154            self.HelpById[helpobj.GetId()] = indx
     155
     156    def OnHelpById(self,event):
    151157        '''Called when Help on... is pressed in a menu. Brings up
    152158        a web page for documentation.
    153159        '''
    154         ShowHelp(self.helpType,self.frame)
     160        helpType = self.HelpById.get(event.GetId())
     161        if helpType is None:
     162            print 'Error: help lookup failed!',event.GetEventObject()
     163            print 'id=',event.GetId()
     164        else:
     165            ShowHelp(helpType,self.frame)
    155166
    156167    def OnHelpAbout(self, event):
Note: See TracChangeset for help on using the changeset viewer.