Changeset 614


Ignore:
Timestamp:
May 11, 2012 12:03:59 PM (11 years ago)
Author:
toby
Message:

import GSAS powder data tested; import routines moved to imports

Location:
trunk
Files:
8 added
6 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r612 r614  
    1111
    1212import os
    13 import os.path as ospath
     13#import os.path as ospath
    1414import sys
    1515import math
     
    3636        try:
    3737            print "trying a system-wide PyOpenGl install"
    38             easy_install.main(['-f',ospath.split(__file__)[0],package])
     38            easy_install.main(['-f',os.path.split(__file__)[0],package])
    3939            return
    4040        except:
     
    4242        try:
    4343            print "trying a user level PyOpenGl install"
    44             easy_install.main(['-f',ospath.split(__file__)[0],'--user',package])
     44            easy_install.main(['-f',os.path.split(__file__)[0],'--user',package])
    4545            return
    4646        except:
     
    202202        '''import all the import readers matching the prefix
    203203        '''
    204         path2GSAS2 = os.path.dirname(os.path.realpath(__file__)) # location of this file
     204        #path2GSAS2 = os.path.dirname(os.path.realpath(__file__)) # location of this file
     205        #pathlist = sys.path[:]
     206        #if path2GSAS2 not in pathlist: pathlist.append(path2GSAS2)
     207        path2GSAS2 = os.path.join(
     208            os.path.dirname(os.path.realpath(__file__)), # location of this file
     209            'imports')
    205210        pathlist = sys.path[:]
    206211        if path2GSAS2 not in pathlist: pathlist.append(path2GSAS2)
     212
    207213        filelist = []
    208214        for path in pathlist:
    209215            for filename in glob.iglob(os.path.join(
    210216                path,
    211                 "G2import"+prefix+"*.py")):
     217                "G2"+prefix+"*.py")):
    212218                filelist.append(filename)   
    213                 #print 'found',filename
     219                print 'debug: found',filename
    214220        filelist = sorted(list(set(filelist))) # remove duplicates
    215221        for filename in filelist:
     
    313319            msg = ''
    314320            try:
    315                 fp = open(filename,'r')
     321                fp = open(filename,'Ur')
    316322                self.lastimport = filename
    317323                # try the file first with Readers that specify the
     
    329335                            repeat = False
    330336                            fp.seek(0)  # rewind
    331                             rd.objname = ospath.basename(filename)
     337                            rd.objname = os.path.basename(filename)
    332338                            flag = rd.Reader(filename,fp,self,
    333339                                             buffer=rdbuffer,
     
    486492            self.Bind(wx.EVT_MENU, self.OnImportPowder, id=item.GetId())
    487493           
    488     def GetPowderIparm(self,rd, prevIparm):
     494    def ReadPowderIparm(self,instfile,bank,databanks,rd):
     495        '''Read a GSAS (old) instrument parameter file'''
     496        if not os.path.exists(instfile): # no such file
     497            return {}
     498        try:
     499            fp = open(instfile,'Ur')
     500            Iparm = {}
     501            for S in fp:
     502                Iparm[S[:12]] = S[12:-1]
     503        except IOError:
     504            print('Error reading file:'+str(instfile))
     505        finally:       
     506            fp.close()
     507
     508        try:
     509            ibanks = int(Iparm.get('INS   BANK  ').strip())
     510        except:
     511            ibanks = 1
     512        if ibanks == 1: # there is only one bank here, return it
     513            rd.instbank = 1
     514            return Iparm
     515        if ibanks != databanks:
     516            # number of banks in data and prm file not not agree, need a
     517            # choice from a human here
     518            choices = []
     519            for i in range(1,1+len(ibanks)):
     520                choices.append('Bank '+str(i))
     521            bank = rd.BlockSelector(
     522                choices, self,
     523                title='Select an instrument parameter block for '+
     524                rd.powderentry[0]+' block '+str(bank)+
     525                '\nCancel: Use default settings',
     526                header='Block Selector')
     527        if bank is None: return {}
     528        # pull out requested bank # bank from the data, and change the bank to 1
     529        IparmS = {}
     530        for key in Iparm:
     531            if key[4:6] == "  ":
     532                IparmS[key] = Iparm[key]
     533            elif int(key[4:6].strip()) == bank:
     534                IparmS[key[:4]+' 1'+key[6:]] = Iparm[key]
     535        rd.instbank = bank
     536        return IparmS
     537                       
     538    def GetPowderIparm(self,rd, prevIparm, lastIparmfile, lastdatafile):
    489539        '''Open and read an instrument parameter file for a data file
    490         for now, just set defaults
     540        for now, just use old GSAS type files, but someday allow other options.
     541        Then update SetPowderInstParms to work with that input
    491542        '''
     543        # stuff we might need from the reader
     544        filename = rd.powderentry[0]
     545        bank = rd.powderentry[2]
     546        numbanks = rd.numbanks
     547        # is there an instrument parameter file defined for the current data set?
     548        if rd.instparm or lastdatafile == filename:
     549            if rd.instparm:
     550                instfile = os.path.join(os.path.split(filename)[0],
     551                                    rd.instparm)
     552            else:
     553                # for multiple reads of one data file, reuse the inst parm file
     554                instfile = lastIparmfile
     555            if os.path.exists(instfile):
     556                print 'debug: try read',instfile
     557                Iparm = self.ReadPowderIparm(instfile,bank,numbanks,rd)
     558                if Iparm:
     559                    print 'debug: success'
     560                    rd.instfile = instfile
     561                    rd.instmsg = instfile + ' bank ' + str(rd.instbank)
     562                    return Iparm
     563            else:
     564                self.ErrorDialog('Open Error',
     565                                 'Error opening file '+str(instfile)
     566                                 +' requested by file '+ filename)
     567        # is there an instrument parameter file matching the current file
     568        # with extension .inst or .prm? If so read it
     569        basename = os.path.splitext(filename)[0]
     570        for ext in '.inst','.prm':
     571            instfile = basename + ext
     572            Iparm = self.ReadPowderIparm(instfile,bank,numbanks,rd)
     573            if Iparm:
     574                print 'debug: success'
     575                rd.instfile = instfile
     576                rd.instmsg = instfile + ' bank ' + str(rd.instbank)
     577                return Iparm
     578            else:
     579                print 'debug open/read failed',instfile
     580                pass # fail silently
     581       
     582        while True: # loop until we get a file that works or we get a cancel
     583            instfile = ''
     584            dlg = wx.FileDialog(self,
     585                                'Choose an instrument file or press Cancel to select a default setting',
     586                                '.', '',
     587                                'GSAS iparm file (*.prm)|*.prm|All files(*.*)|*.*',
     588                                wx.OPEN|wx.CHANGE_DIR)
     589            if os.path.exists(lastIparmfile):
     590                dlg.SetFilename(lastIparmfile)
     591            if dlg.ShowModal() == wx.ID_OK:
     592                instfile = dlg.GetPath()
     593            dlg.Destroy()
     594            if not instfile: break
     595            Iparm = self.ReadPowderIparm(instfile,bank,numbanks,rd)
     596            if Iparm:
     597                print 'debug: success with',instfile
     598                rd.instfile = instfile
     599                rd.instmsg = instfile + ' bank ' + str(rd.instbank)
     600                return Iparm
     601            else:
     602                self.ErrorDialog('Read Error',
     603                                 'Error opening/reading file '+str(instfile))
     604       
     605        # still no success: offer the user a last choice
    492606        dlg = wx.MessageDialog(self,
    493607'''Is this laboratory Cu Ka1/Ka2 data?
     
    501615            dlg.Destroy()
    502616        if result == wx.ID_YES:
     617            rd.instfile = ''
     618            rd.instmsg = 'default: CuKa12'
    503619            return rd.Iparm_CuKa12
    504620        else:
     621            rd.instfile = ''
     622            rd.instmsg =  'default: 0.6A synchrotron'
    505623            return rd.Iparm_Sync06
    506624
     
    539657
    540658    def OnImportPowder(self,event):
     659        '''reads powder data using a variety of formats
     660        reads an instrument parameter file for each dataset
     661        '''
    541662        reqrdr = self.ImportMenuId.get(event.GetId())  # look up which format was requested
    542663        rdlist = self.OnImportGeneric(reqrdr,
     
    546667        self.CheckNotebook()
    547668        Iparm = None
     669        lastIparmfile = ''
     670        lastdatafile = ''
    548671        for rd in rdlist:
    549             Iparm = self.GetPowderIparm(rd, Iparm)
     672            # get instrument parameters for each dataset
     673            Iparm = self.GetPowderIparm(rd, Iparm, lastIparmfile, lastdatafile)
     674            lastIparmfile = rd.instfile
     675            lastdatafile = rd.powderentry[0]
    550676            print 'Read powder data '+str(
    551677                rd.idstring)+' from file '+str(
    552                 self.lastimport)
     678                self.lastimport) + ' with parameters from '+str(
     679                rd.instmsg)
     680            # data are read, now store them in the tree
    553681            Id = self.PatternTree.AppendItem(
    554682                parent=self.root,
     
    683811        self.oldFocus = None
    684812        self.GSASprojectfile = ''
    685         self.dirname = ospath.expanduser('~')       #start in the users home directory by default; may be meaningless
     813        self.dirname = os.path.expanduser('~')       #start in the users home directory by default; may be meaningless
    686814        self.undofile = ''
    687815        self.TreeItemDelete = False
     
    691819        self.refDelt = .01
    692820        self.Weight = False
    693         self.IparmName = ''
     821        self.IparmName = ''  # to be removed when SelectPowderData & GetInstrumentFile is
    694822        self.IfPlot = False
    695823        self.PatternId = 0
     
    723851        if len(arg) > 1:
    724852            self.GSASprojectfile = arg[1]
    725             self.dirname = ospath.dirname(arg[1])
     853            self.dirname = os.path.dirname(arg[1])
    726854            if self.dirname: os.chdir(self.dirname)
    727855            G2IO.ProjFileOpen(self)
     
    792920                        for Item in Data:
    793921                            vals = Item[2].split()          #split up the BANK record
    794                             Id = self.PatternTree.AppendItem(parent=self.root,text='PWDR '+ospath.basename(Item[0])+': '+vals[0]+vals[1])
     922                            Id = self.PatternTree.AppendItem(parent=self.root,text='PWDR '+os.path.basename(Item[0])+': '+vals[0]+vals[1])
    795923                            data = G2IO.GetPowderData(filename,Item[1],Item[2],DataType)
    796924                            self.PatternTree.SetItemPyData(Id,[Item,data])
     
    862990                self.powderfile = dlg.GetPath()
    863991                comments,peaks = G2IO.GetPowderPeaks(self.powderfile)
    864                 Id = self.PatternTree.AppendItem(parent=self.root,text='PKS '+ospath.basename(self.powderfile))
     992                Id = self.PatternTree.AppendItem(parent=self.root,text='PKS '+os.path.basename(self.powderfile))
    865993                data = ['PKS',Cuka,0.0]
    866994                names = ['Type','Lam','Zero']
     
    8941022                    Comments,Data,Npix,Image = G2IO.GetImageData(self,imagefile)
    8951023                    if Comments:
    896                         Id = self.PatternTree.AppendItem(parent=self.root,text='IMG '+ospath.basename(imagefile))
     1024                        Id = self.PatternTree.AppendItem(parent=self.root,text='IMG '+os.path.basename(imagefile))
    8971025                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)
    8981026                        Imax = np.amax(Image)
     
    9601088                    names = ['Type','Lam']
    9611089                    HKLref,HKLmin,HKLmax,FoMax,ifFc = G2IO.GetHKLData(filename)
    962                     Id = self.PatternTree.AppendItem(parent=self.root,text='HKLF '+ospath.basename(filename))
     1090                    Id = self.PatternTree.AppendItem(parent=self.root,text='HKLF '+os.path.basename(filename))
    9631091                    self.PatternTree.SetItemPyData(Id,HKLref)
    9641092                    Sub = self.PatternTree.AppendItem(Id,text='Instrument Parameters')
  • trunk/GSASIIIO.py

    r609 r614  
    4444    return file
    4545   
     46# to be removed
    4647def SelectPowderData(G2frame, filename):
    4748    """Selects banks of data from a filename of any GSAS powder data format
     
    150151    return FoundData,Iparm,Comments,Temperature
    151152
     153# to be removed
    152154def GetInstrumentFile(G2frame,filename):
    153155    import os.path as op
     
    166168    return filename
    167169
     170# to be removed
    168171def GetInstrumentData(IparmName):
    169172    file = open(IparmName, 'Ur')
     
    305308    return HKLref,HKLmin,HKLmax,FoMax,ifFc
    306309
     310# to be removed
    307311def GetPowderData(filename,Pos,Bank,DataType):
    308312    '''Reads one BANK of data from GSAS raw powder data file
     
    336340    return []
    337341
     342# to be removed
    338343def GetFXYEdata(filename,Pos,Bank,DataType):
    339344    File = open(filename,'Ur')
     
    361366    return [np.array(x),np.array(y),np.array(w),np.zeros(N),np.zeros(N),np.zeros(N)]
    362367   
     368# to be removed
    363369def GetXYEdata(filename,Pos,Bank,DataType):
    364370    File = open(filename,'Ur')
     
    387393   
    388394   
     395# to be removed
    389396def GetFXYdata(filename,Pos,Bank,DataType):
    390397    File = open(filename,'Ur')
     
    412419    return [np.array(x),np.array(y),np.array(w),np.zeros(N),np.zeros(N),np.zeros(N)]
    413420   
     421# to be removed
    414422def GetESDdata(filename,Pos,Bank,DataType):
    415423    File = open(filename,'Ur')
     
    445453    return [np.array(x),np.array(y),np.array(w),np.zeros(N),np.zeros(N),np.zeros(N)]
    446454
     455# to be removed
    447456def GetSTDdata(filename,Pos,Bank,DataType):
    448457    File = open(filename,'Ur')
     
    13171326            return None
    13181327
     1328    def MultipleBlockSelector(self, ChoiceList, ParentFrame=None,
     1329                      title='Select a block',
     1330                      size=None, header='Block Selector'):
     1331        ''' Provide a wx dialog to select a block of data if the file contains more
     1332        than one set of data and one must be selected.
     1333        Returns a list of the selected blocks
     1334        '''
     1335        dlg = wx.MultiChoiceDialog(
     1336            ParentFrame,
     1337            title, header,
     1338            ChoiceList+['Select all'],
     1339            wx.CHOICEDLG_STYLE
     1340            )
     1341        if size: dlg.SetSize(size)
     1342        if dlg.ShowModal() == wx.ID_OK:
     1343            sel = dlg.GetSelections()
     1344            dlg.Destroy()
     1345        else:
     1346            dlg.Destroy()
     1347            return []
     1348        selected = []
     1349        if len(ChoiceList) in sel:
     1350            return range(len(ChoiceList))
     1351        else:
     1352            return sel
     1353        return selected
     1354
    13191355    def ShowBusy(self):
    13201356        wx.BeginBusyCursor()
     
    15051541        self.idstring = ''
    15061542        self.Sample = G2pdG.SetDefaultSample()
     1543        self.instparm = None # name hint
     1544        self.instfile = '' # full path name to instrument parameter file
     1545        self.instbank = '' # inst parm bank number
     1546        self.instmsg = ''  # a label that gets printed to show
     1547                           # where instrument parameters are from
     1548        self.numbanks = 1
Note: See TracChangeset for help on using the changeset viewer.