Changeset 1199


Ignore:
Timestamp:
Jan 16, 2014 3:55:36 PM (9 years ago)
Author:
vondreele
Message:

1st import of small angle data, create SASD data from image.
Work on proper plotting of SASD data
work on image GUI stuff for small angle data

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r1191 r1199  
    216216        self.ImportPowderReaderlist = []
    217217        self._init_Import_routines('pwd',self.ImportPowderReaderlist,'Powder_Data')
     218        self.ImportSmallAngleReaderlist = []
     219        self._init_Import_routines('sad',self.ImportSmallAngleReaderlist,'SmallAngle_Data')
    218220        self.ImportMenuId = {}
    219221
     
    256258                            readerlist.append(reader)
    257259            except AttributeError:
    258                 print 'Import_'+errprefix+': Attribute Error'+str(filename)
     260                print 'Import_'+errprefix+': Attribute Error '+str(filename)
    259261                pass
    260262            except ImportError:
    261                 print 'Import_'+errprefix+': Error importing file'+str(filename)
     263                print 'Import_'+errprefix+': Error importing file '+str(filename)
    262264                pass
    263265            if fp: fp.close()
     
    14551457        return # success
    14561458
     1459    def _Add_ImportMenu_smallangle(self,parent):
     1460        '''configure the Small Angle Data menus accord to the readers found in _init_Imports
     1461        '''
     1462        submenu = wx.Menu()
     1463        item = parent.AppendMenu(wx.ID_ANY, 'Small Angle Data',
     1464            submenu, help='Import small angle data')
     1465        for reader in self.ImportSmallAngleReaderlist:
     1466            item = submenu.Append(wx.ID_ANY,help=reader.longFormatName,
     1467                kind=wx.ITEM_NORMAL,text='from '+reader.formatName+' file')
     1468            self.ImportMenuId[item.GetId()] = reader
     1469            self.Bind(wx.EVT_MENU, self.OnImportSmallAngle, id=item.GetId())
     1470        item = submenu.Append(wx.ID_ANY,
     1471            help='Import small angle data, use file to try to determine format',
     1472            kind=wx.ITEM_NORMAL,text='guess format from file')
     1473        self.Bind(wx.EVT_MENU, self.OnImportSmallAngle, id=item.GetId())
     1474           
     1475
     1476    def OnImportSmallAngle(self,event):
     1477        '''Called in response to an Import/Small Angle Data/... menu item
     1478        to read a small angle diffraction data set.
     1479        dict self.ImportMenuId is used to look up the specific
     1480        reader item associated with the menu item, which will be
     1481        None for the last menu item, which is the "guess" option
     1482        where all appropriate formats will be tried.
     1483
     1484        '''
     1485       
     1486        def GetSASDIparm(reader):
     1487            parm = reader.instdict
     1488            Iparm = {'Type':[parm['type'],parm['type'],0],'Lam':[parm['wave'],
     1489                parm['wave'],0],'Azimuth':[0.,0.,0]}           
     1490            return Iparm,{}
     1491           
     1492        # get a list of existing histograms
     1493        SASDlist = []
     1494        if self.PatternTree.GetCount():
     1495            item, cookie = self.PatternTree.GetFirstChild(self.root)
     1496            while item:
     1497                name = self.PatternTree.GetItemText(item)
     1498                if name.startswith('SASD ') and name not in SASDlist:
     1499                    SASDlist.append(name)
     1500                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
     1501        # look up which format was requested
     1502        reqrdr = self.ImportMenuId.get(event.GetId()) 
     1503        rdlist = self.OnImportGeneric(
     1504            reqrdr,self.ImportSmallAngleReaderlist,'Small Angle Data',multiple=True)
     1505        if len(rdlist) == 0: return
     1506        self.CheckNotebook()
     1507        Iparm = None
     1508        lastdatafile = ''
     1509        newHistList = []
     1510        for rd in rdlist:
     1511            lastdatafile = rd.smallangleentry[0]
     1512            HistName = rd.idstring
     1513            HistName = 'SASD '+HistName
     1514            # make new histogram names unique
     1515            HistName = G2obj.MakeUniqueLabel(HistName,SASDlist)
     1516            print 'Read small angle data '+str(HistName)+ \
     1517                ' from file '+str(self.lastimport)
     1518            # data are read, now store them in the tree
     1519            Id = self.PatternTree.AppendItem(parent=self.root,text=HistName)
     1520            Iparm1,Iparm2 = GetSASDIparm(rd)
     1521#            if 'T' in Iparm1['Type'][0]:
     1522#                if not rd.clockWd and rd.GSAS:
     1523#                    rd.powderdata[0] *= 100.        #put back the CW centideg correction
     1524#                cw = np.diff(rd.powderdata[0])
     1525#                rd.powderdata[0] = rd.powderdata[0][:-1]+cw/2.
     1526#                rd.powderdata[1] = rd.powderdata[1][:-1]/cw
     1527#                rd.powderdata[2] = rd.powderdata[2][:-1]*cw**2  #1/var=w at this point
     1528#                if 'Itype' in Iparm2:
     1529#                    Ibeg = np.searchsorted(rd.powderdata[0],Iparm2['Tminmax'][0])
     1530#                    Ifin = np.searchsorted(rd.powderdata[0],Iparm2['Tminmax'][1])
     1531#                    rd.powderdata[0] = rd.powderdata[0][Ibeg:Ifin]
     1532#                    YI,WYI = G2pwd.calcIncident(Iparm2,rd.powderdata[0])
     1533#                    rd.powderdata[1] = rd.powderdata[1][Ibeg:Ifin]/YI
     1534#                    var = 1./rd.powderdata[2][Ibeg:Ifin]
     1535#                    var += WYI*rd.powderdata[1]**2
     1536#                    var /= YI**2
     1537#                    rd.powderdata[2] = 1./var
     1538#                rd.powderdata[3] = np.zeros_like(rd.powderdata[0])                                       
     1539#                rd.powderdata[4] = np.zeros_like(rd.powderdata[0])                                       
     1540#                rd.powderdata[5] = np.zeros_like(rd.powderdata[0])                                       
     1541            Tmin = min(rd.smallangledata[0])
     1542            Tmax = max(rd.smallangledata[0])
     1543            valuesdict = {
     1544                'wtFactor':1.0,
     1545                'Dummy':False,
     1546                'ranId':ran.randint(0,sys.maxint),
     1547                }
     1548            rd.Sample['ranId'] = valuesdict['ranId'] # this should be removed someday
     1549            self.PatternTree.SetItemPyData(Id,[valuesdict,rd.smallangledata])
     1550            self.PatternTree.SetItemPyData(
     1551                self.PatternTree.AppendItem(Id,text='Comments'),
     1552                rd.comments)
     1553            self.PatternTree.SetItemPyData(
     1554                self.PatternTree.AppendItem(Id,text='Limits'),
     1555                [(Tmin,Tmax),[Tmin,Tmax]])
     1556            self.PatternId = G2gd.GetPatternTreeItemId(self,Id,'Limits')
     1557            self.PatternTree.SetItemPyData(
     1558                self.PatternTree.AppendItem(Id,text='Instrument Parameters'),
     1559                [Iparm1,Iparm2])
     1560            self.PatternTree.SetItemPyData(
     1561                self.PatternTree.AppendItem(Id,text='Sample Parameters'),
     1562                rd.Sample)
     1563            self.PatternTree.Expand(Id)
     1564            self.PatternTree.SelectItem(Id)
     1565            newHistList.append(HistName)
     1566           
     1567        if not newHistList: return # somehow, no new histograms
     1568        return # success
     1569
    14571570    def _init_Exports(self,menu):
    14581571        '''Find exporter routines and add them into menus
     
    16241737        self._Add_ImportMenu_powder(Import)
    16251738        self._Add_ImportMenu_Sfact(Import)
     1739        self._Add_ImportMenu_smallangle(Import)
    16261740        #======================================================================
    16271741        # Code to help develop/debug an importer, much is hard-coded below
     
    24022516        DelItemList = []
    24032517        ifPWDR = False
     2518        ifSASD = False
    24042519        ifIMG = False
    24052520        ifHKLF = False
     
    24122527                    'Restraints','Phases','Rigid bodies']:
    24132528                    if 'PWDR' in name: ifPWDR = True
     2529                    if 'SASD' in name: ifSASD = True
    24142530                    if 'IMG' in name: ifIMG = True
    24152531                    if 'HKLF' in name: ifHKLF = True
     
    24182534                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
    24192535            if ifPWDR: TextList.insert(1,'All PWDR')
     2536            if ifSASD: TextList.insert(1,'All SASD')
    24202537            if ifIMG: TextList.insert(1,'All IMG')
    24212538            if ifHKLF: TextList.insert(1,'All HKLF')
     
    24302547                    elif 'All PWDR' in DelList:
    24312548                        DelList = [item for item in TextList if item[:4] == 'PWDR']
     2549                    elif 'All SASD' in DelList:
     2550                        DelList = [item for item in TextList if item[:4] == 'SASD']
    24322551                    elif 'All IMG' in DelList:
    24332552                        DelList = [item for item in TextList if item[:3] == 'IMG']
  • trunk/GSASIIIO.py

    r1198 r1199  
    835835    Id = G2frame.PatternTree.GetItemParent(PickId)
    836836    name = G2frame.PatternTree.GetItemText(Id)
    837     name = name.replace('IMG ','PWDR ')
     837    name = name.replace('IMG ',data['type']+' ')
    838838    Comments = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id, 'Comments'))
    839     names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth']
    840     codes = [0 for i in range(12)]
     839    if 'PWDR' in name:
     840        names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth']
     841        codes = [0 for i in range(11)]
     842    elif 'SASD' in name:
     843        names = ['Type','Lam','Zero','Azimuth']
     844        codes = [0 for i in range(4)]
    841845    LRazm = data['LRazimuth']
    842846    Azms = []
     
    854858                Id = item
    855859            item, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
    856         parms = ['PXC',data['wavelength'],0.0,0.99,1.0,-0.10,0.4,0.30,1.0,0.0001,Azms[i]]    #set polarization for synchrotron radiation!
     860        if 'PWDR' in name:
     861            parms = ['PXC',data['wavelength'],0.0,0.99,1.0,-0.10,0.4,0.30,1.0,0.0001,Azms[i]]    #set polarization for synchrotron radiation!
     862        elif 'SASD' in name:   
     863            parms = ['LXC',data['wavelength'],0.0,Azms[i]]           
    857864        Y = G2frame.Integrate[0][i]
    858865        W = 1./Y                    #probably not true
     
    865872            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id, 'Comments'),Comments)                   
    866873            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Limits'),[tuple(Xminmax),Xminmax])
    867             G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Background'),[['chebyschev',1,3,1.0,0.0,0.0],
    868                             {'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]}])
     874            if 'PWDR' in name:
     875                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Background'),[['chebyschev',1,3,1.0,0.0,0.0],
     876                    {'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]}])
    869877            inst = [dict(zip(names,zip(parms,parms,codes))),{}]
    870878            for item in inst[0]:
    871879                inst[0][item] = list(inst[0][item])
    872880            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Instrument Parameters'),inst)
    873             G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Peak List'),[])
    874             G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Index Peak List'),[])
    875             G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Unit Cells List'),[])             
    876             G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Reflection Lists'),{})             
     881            if 'PWDR' in name:
     882                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Peak List'),[])
     883                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Index Peak List'),[])
     884                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Unit Cells List'),[])             
     885                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Reflection Lists'),{})             
    877886        else:
    878887            Id = G2frame.PatternTree.AppendItem(parent=G2frame.root,text=name+" Azm= %.2f"%(Azms[i]))
    879888            G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
    880889            G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Limits'),[tuple(Xminmax),Xminmax])
    881             G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0],
    882                             {'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]}])
     890            if 'PWDR' in name:
     891                G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0],
     892                    {'nDebye':0,'debyeTerms':[],'nPeaks':0,'peaksList':[]}])
    883893            inst = [dict(zip(names,zip(parms,parms,codes))),{}]
    884894            for item in inst[0]:
     
    886896            G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Instrument Parameters'),inst)
    887897            G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Sample Parameters'),Sample)
    888             G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Peak List'),[])
    889             G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Index Peak List'),[])
    890             G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Unit Cells List'),[])
    891             G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Reflection Lists'),{})
     898            if 'PWDR' in name:
     899                G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Peak List'),[])
     900                G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Index Peak List'),[])
     901                G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Unit Cells List'),[])
     902                G2frame.PatternTree.SetItemPyData(G2frame.PatternTree.AppendItem(Id,text='Reflection Lists'),{})
    892903            valuesdict = {
    893904                'wtFactor':1.0,
     
    16661677        self.instdict = {} # place items here that will be transferred to the instrument parameters
    16671678######################################################################
     1679class ImportSmallAngleData(ImportBaseclass):
     1680    '''Defines a base class for the reading of files with small angle data.
     1681    See :ref:`Writing a Import Routine<Import_Routines>`
     1682    for an explanation on how to use this class.
     1683    '''
     1684    def __init__(self,formatName,longFormatName=None,extensionlist=[],
     1685        strictExtension=False,):
     1686           
     1687        ImportBaseclass.__init__(self,formatName,longFormatName,extensionlist,
     1688            strictExtension)
     1689        self.smallangleentry = ['',None,None] #  (filename,Pos,Bank)
     1690        self.smallangledata = [] # SASD dataset
     1691        '''A small angle data set is a list with items [x,y,w,yc,yd]:
     1692                np.array(x), # x-axis values
     1693                np.array(y), # powder pattern intensities
     1694                np.array(w), # 1/sig(intensity)^2 values (weights)
     1695                np.array(yc), # calc. intensities (zero)
     1696                np.array(yd), # obs-calc profiles
     1697        '''                           
     1698        self.comments = []
     1699        self.idstring = ''
     1700        self.Sample = G2pdG.SetDefaultSample()
     1701        self.GSAS = None     # used in TOF
     1702        self.clockWd = None  # used in TOF
     1703        self.numbanks = 1
     1704        self.instdict = {} # place items here that will be transferred to the instrument parameters
     1705######################################################################
    16681706class ExportBaseclass(object):
    16691707    '''Defines a base class for the exporting of GSAS-II results
  • trunk/GSASIIgrid.py

    r1195 r1199  
    34733473    G2frame.PatternTree.SetItemPyData(item,data)
    34743474    if kind == 'PWDR':
    3475         G2plt.PlotPatterns(G2frame,newPlot=True)
     3475        G2plt.PlotPatterns(G2frame,plotType=kind,newPlot=True)
     3476    elif kind == 'SASD':
     3477        G2plt.PlotPatterns(G2frame,plotType=kind,newPlot=True)
    34763478    elif kind == 'HKLF':
    34773479        G2plt.PlotSngl(G2frame,newPlot=True)
     
    36993701            for i in G2frame.ExportPattern: i.Enable(True)
    37003702            UpdatePWHKPlot(G2frame,'PWDR',item)
     3703        elif 'SASD' in G2frame.PatternTree.GetItemText(item):
     3704            for i in G2frame.ExportPattern: i.Enable(True)
     3705            UpdatePWHKPlot(G2frame,'SASD',item)
    37013706        elif 'HKLF' in G2frame.PatternTree.GetItemText(item):
    37023707            G2frame.Sngl = item
     
    38003805        data = G2frame.PatternTree.GetItemPyData(item)[0]
    38013806        G2pdG.UpdateInstrumentGrid(G2frame,data)
    3802         G2plt.PlotPeakWidths(G2frame)
     3807        if 'P' in data['Type'][0]:          #powder data only
     3808            G2plt.PlotPeakWidths(G2frame)
    38033809    elif G2frame.PatternTree.GetItemText(item) == 'Sample Parameters':
    38043810        G2frame.PatternId = G2frame.PatternTree.GetItemParent(item)
  • trunk/GSASIIimage.py

    r1193 r1199  
    771771    tabs = np.ones_like(taz)
    772772    tam = ma.mask_or(tam.flatten(),ma.getmask(taz))
    773     tax = ma.compressed(ma.array(tax.flatten(),mask=tam))
    774     tay = ma.compressed(ma.array(tay.flatten(),mask=tam))
    775     taz = ma.compressed(ma.array(taz.flatten(),mask=tam))
    776     tad = ma.compressed(ma.array(tad.flatten(),mask=tam))
    777     tabs = ma.compressed(ma.array(tabs.flatten(),mask=tam))
     773    tax = ma.compressed(ma.array(tax.flatten(),mask=tam))   #azimuth
     774    tay = ma.compressed(ma.array(tay.flatten(),mask=tam))   #2-theta
     775    taz = ma.compressed(ma.array(taz.flatten(),mask=tam))   #intensity
     776    tad = ma.compressed(ma.array(tad.flatten(),mask=tam))   #dist**2/d0**2
     777    tabs = ma.compressed(ma.array(tabs.flatten(),mask=tam)) #ones - later used for absorption corr.
    778778    return tax,tay,taz,tad,tabs
    779779   
    780780def ImageIntegrate(image,data,masks,blkSize=128,dlg=None):
    781     'Needs a doc string'
     781    'Needs a doc string'    #for q, log(q) bins need data['binType']
    782782    import histogram2d as h2d
    783783    print 'Begin image integration'
    784     LUtth = data['IOtth']
     784    LUtth = np.array(data['IOtth'])
    785785    LRazm = np.array(data['LRazimuth'],dtype=np.float64)
    786786    numAzms = data['outAzimuths']
    787787    numChans = data['outChannels']
    788     Dtth = (LUtth[1]-LUtth[0])/numChans
    789788    Dazm = (LRazm[1]-LRazm[0])/numAzms
    790     if data['centerAzm']:
    791         LRazm += Dazm/2.
     789    LRazm += Dazm/2.
     790    if 'log(q)' in data['binType']:
     791        lutth = np.log(4.*np.pi*npsind(LUtth/2.)/data['wavelength'])
     792    elif 'q' == data['binType']:
     793        lutth = 4.*np.pi*npsind(LUtth/2.)/data['wavelength']
     794    elif '2-theta' in data['binType']:
     795        lutth = LUtth               
     796    dtth = (lutth[1]-lutth[0])/numChans
     797    muT = data['SampleAbs'][0]
     798    if 'SASD' in data['type']:
     799        muT = np.log(muT)
    792800    NST = np.zeros(shape=(numAzms,numChans),order='F',dtype=np.float32)
    793801    H0 = np.zeros(shape=(numAzms,numChans),order='F',dtype=np.float32)
     
    820828            tax = np.where(tax < LRazm[0],tax+360.,tax)
    821829            if data['SampleAbs'][1]:
    822                 muR = data['SampleAbs'][0]*(1.+npsind(tax)**2/2.)/(npcosd(tay))
    823                 tabs = G2pwd.Absorb(data['SampleShape'],muR,tay)
     830                if 'PWDR' in data['type']:
     831                    muR = muT*(1.+npsind(tax)**2/2.)/(npcosd(tay))
     832                    tabs = G2pwd.Absorb(data['SampleShape'],muR,tay)
     833                elif 'SASD' in data['type']:    #assumes flat plate sample normal to beam
     834                    tabs = G2pwd.Absorb('Fixed',muT,tay)
     835            if 'log(q)' in data['binType']:
     836                tay = np.log(4.*np.pi*npsind(tay/2.)/data['wavelength'])
     837            elif 'q' == data['binType']:
     838                tay = 4.*np.pi*npsind(tay/2.)/data['wavelength']
     839            #change 2-theta (tay) to q or log(q) here? then LUtth & Dtth need to be changed also
    824840            if any([tax.shape[0],tay.shape[0],taz.shape[0]]):
    825                 NST,H0 = h2d.histogram2d(len(tax),tax,tay,taz*tad*tabs,numAzms,numChans,LRazm,LUtth,Dazm,Dtth,NST,H0)
     841                NST,H0 = h2d.histogram2d(len(tax),tax,tay,taz*tad*tabs,numAzms,numChans,LRazm,lutth,Dazm,dtth,NST,H0)
    826842            Nup += 1
    827843            if dlg:
     
    831847    H0 = np.nan_to_num(H0)
    832848    del NST
    833     if Dtth:
    834         H2 = np.array([tth for tth in np.linspace(LUtth[0],LUtth[1],numChans+1)])
    835     else:
    836         H2 = np.array(LUtth)
     849    H2 = np.array([tth for tth in np.linspace(lutth[0],lutth[1],numChans+1)])
     850    if 'log(q)' in data['binType']:
     851        H2 = 2.*npasind(np.exp(H2)*data['wavelength']/(4.*np.pi))
     852    elif 'q' == data['binType']:
     853        H2 = 2.*npasind(H2*data['wavelength']/(4.*np.pi))   
    837854    if Dazm:       
    838855        H1 = np.array([azm for azm in np.linspace(LRazm[0],LRazm[1],numAzms+1)])
  • trunk/GSASIIimgGUI.py

    r1195 r1199  
    5656        data['SampleShape'] = 'Cylinder'
    5757        data['SampleAbs'] = [0.0,False]
     58    if 'binType' not in data:
     59        data['binType'] = '2-theta'
    5860#end patch
    5961
     
    9496                backImage = G2IO.GetImageData(G2frame,imagefile,True)*backScale
    9597                sumImage = G2frame.ImageZ+backImage
    96                 sumMin = np.min(sumImage)
    97                 sumMax = np.max(sumImage)
    98                 maskCopy['Thresholds'] = [(sumMin,sumMax),[sumMin,sumMax]]
    9998                G2frame.Integrate = G2img.ImageIntegrate(sumImage,data,maskCopy,blkSize,dlg)
    10099            else:
     
    278277        def OnDataType(event):
    279278            data['type'] = typeSel.GetValue()[:4]
     279            if 'SASD' in data['type'] and not data['SampleAbs'][0]:
     280                data['SampleAbs'][0] = 1.0  #switch from muT to trans!
    280281            wx.CallAfter(UpdateImageControls,G2frame,data,masks)
    281282   
     
    444445        rotSel.SetBackgroundColour(VERY_LIGHT_GREY)
    445446        calibSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
    446         penSel = wx.CheckBox(parent=G2frame.dataDisplay,label='Penetration?')
    447         calibSizer.Add(penSel,0,wx.ALIGN_CENTER_VERTICAL)
    448         penSel.Bind(wx.EVT_CHECKBOX, OnDetDepthRef)
    449         penSel.SetValue(data['DetDepthRef'])
    450         penVal = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%6.5f" % (data['DetDepth'])),
    451             style=wx.TE_PROCESS_ENTER)
    452         penVal.Bind(wx.EVT_TEXT_ENTER,OnDetDepth)
    453         penVal.Bind(wx.EVT_KILL_FOCUS,OnDetDepth)
    454         calibSizer.Add(penVal,0,wx.ALIGN_CENTER_VERTICAL)             
     447        if 'PWDR' in data['type']:
     448            penSel = wx.CheckBox(parent=G2frame.dataDisplay,label='Penetration?')
     449            calibSizer.Add(penSel,0,wx.ALIGN_CENTER_VERTICAL)
     450            penSel.Bind(wx.EVT_CHECKBOX, OnDetDepthRef)
     451            penSel.SetValue(data['DetDepthRef'])
     452            penVal = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%6.5f" % (data['DetDepth'])),
     453                style=wx.TE_PROCESS_ENTER)
     454            penVal.Bind(wx.EVT_TEXT_ENTER,OnDetDepth)
     455            penVal.Bind(wx.EVT_KILL_FOCUS,OnDetDepth)
     456            calibSizer.Add(penVal,0,wx.ALIGN_CENTER_VERTICAL)             
    455457       
    456458        return calibSizer
    457459   
    458460    def IntegrateSizer():
     461       
     462        def OnNewBinType(event):
     463            data['binType'] = binSel.GetValue()
    459464       
    460465        def OnIOtth(event):
     
    483488            try:
    484489                numChans = int(outChan.GetValue())
    485                 if numChans < 1:
     490                if numChans < 10:
    486491                    raise ValueError
    487492                data['outChannels'] = numChans
     
    527532            try:
    528533                value = float(samabsVal.GetValue())
    529                 if 0.00 <= value <= 2.00:
     534                minmax = [0.,2.]
     535                if 'SASD' in data['type']:
     536                    minmax = [.05,1.0]
     537                if minmax[0] <= value <= minmax[1]:
    530538                    data['SampleAbs'][0] = value
    531539                else:
     
    590598            wx.ALIGN_CENTER_VERTICAL)   
    591599        dataSizer.Add((5,0),0)
     600        binChoice = ['2-theta','q','log(q)']
     601        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Bin style: Constant'),0,
     602            wx.ALIGN_CENTER_VERTICAL)           
     603        binSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['binType'],choices=binChoice,
     604            style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
     605        binSel.Bind(wx.EVT_COMBOBOX, OnNewBinType)
     606        dataSizer.Add(binSel,0,wx.ALIGN_CENTER_VERTICAL)
    592607        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Inner/Outer 2-theta'),0,
    593             wx.ALIGN_CENTER_VERTICAL)
    594            
     608            wx.ALIGN_CENTER_VERTICAL)           
    595609        IOtth = data['IOtth']
    596610        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
     
    642656        samabs.Bind(wx.EVT_CHECKBOX, OnSamAbs)
    643657        samabs.SetValue(data['SampleAbs'][1])
    644         littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='mu/R (0.00-2.0) '),0,
    645             wx.ALIGN_CENTER_VERTICAL)
    646         samabsVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['SampleAbs'][0]),style=wx.TE_PROCESS_ENTER)
     658        if 'PWDR' in data['type']:
     659            littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='mu/R (0.00-2.0) '),0,
     660                wx.ALIGN_CENTER_VERTICAL)
     661        elif 'SASD' in data['type']:
     662            littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='transmission '),0,
     663                wx.ALIGN_CENTER_VERTICAL)
     664        samabsVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['SampleAbs'][0]),style=wx.TE_PROCESS_ENTER)           
    647665        samabsVal.Bind(wx.EVT_TEXT_ENTER,OnSamAbsVal)
    648666        samabsVal.Bind(wx.EVT_KILL_FOCUS,OnSamAbsVal)
    649667        littleSizer.Add(samabsVal,0,wx.ALIGN_CENTER_VERTICAL)
    650668        dataSizer.Add(littleSizer,0,)
    651         littleSizer = wx.BoxSizer(wx.HORIZONTAL)
    652         oblique = wx.CheckBox(parent=G2frame.dataDisplay,label='Apply detector absorption?')
    653         dataSizer.Add(oblique,0,wx.ALIGN_CENTER_VERTICAL)
    654         oblique.Bind(wx.EVT_CHECKBOX, OnOblique)
    655         oblique.SetValue(data['Oblique'][1])
    656         littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='Value (0.01-0.99)  '),0,
    657             wx.ALIGN_CENTER_VERTICAL)
    658         obliqVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['Oblique'][0]),style=wx.TE_PROCESS_ENTER)
    659         obliqVal.Bind(wx.EVT_TEXT_ENTER,OnObliqVal)
    660         obliqVal.Bind(wx.EVT_KILL_FOCUS,OnObliqVal)
    661         littleSizer.Add(obliqVal,0,wx.ALIGN_CENTER_VERTICAL)
    662         dataSizer.Add(littleSizer,0,)
     669        if 'PWDR' in data['type']:
     670            littleSizer = wx.BoxSizer(wx.HORIZONTAL)
     671            oblique = wx.CheckBox(parent=G2frame.dataDisplay,label='Apply detector absorption?')
     672            dataSizer.Add(oblique,0,wx.ALIGN_CENTER_VERTICAL)
     673            oblique.Bind(wx.EVT_CHECKBOX, OnOblique)
     674            oblique.SetValue(data['Oblique'][1])
     675            littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='Value (0.01-0.99)  '),0,
     676                wx.ALIGN_CENTER_VERTICAL)
     677            obliqVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['Oblique'][0]),style=wx.TE_PROCESS_ENTER)
     678            obliqVal.Bind(wx.EVT_TEXT_ENTER,OnObliqVal)
     679            obliqVal.Bind(wx.EVT_KILL_FOCUS,OnObliqVal)
     680            littleSizer.Add(obliqVal,0,wx.ALIGN_CENTER_VERTICAL)
     681            dataSizer.Add(littleSizer,0,)
    663682        if 'SASD' in data['type']:
    664683            littleSizer = wx.BoxSizer(wx.HORIZONTAL)
  • trunk/GSASIIplot.py

    r1190 r1199  
    390390################################################################################
    391391           
    392 def PlotPatterns(G2frame,newPlot=False):
     392def PlotPatterns(G2frame,newPlot=False,plotType='PWDR'):
    393393    '''Powder pattern plotting package - displays single or multiple powder patterns as intensity vs
    394394    2-theta, q or TOF. Can display multiple patterns as "waterfall plots" or contour plots. Log I
     
    397397    global HKL
    398398    global exclLines
     399    plottype = plotType
    399400    def OnPlotKeyPress(event):
    400401        newPlot = False
     
    488489            dlg.Destroy()
    489490           
    490         PlotPatterns(G2frame,newPlot=newPlot)
     491        PlotPatterns(G2frame,newPlot=newPlot,plotType=plottype)
    491492       
    492493    def OnMotion(event):
     
    536537
    537538            except TypeError:
    538                 G2frame.G2plotNB.status.SetStatusText('Select PWDR powder pattern first',1)
     539                G2frame.G2plotNB.status.SetStatusText('Select '+plotType+' powder pattern first',1)
    539540                                                   
    540541    def OnPick(event):
     
    565566                data.append(XY)
    566567                G2pdG.UpdatePeakGrid(G2frame,data)
    567                 PlotPatterns(G2frame)
     568                PlotPatterns(G2frame,plotType=plottype)
    568569            else:                                                   #picked a peak list line
    569570                G2frame.itemPicked = pick
     
    588589                G2frame.PatternTree.SetItemPyData(LimitId,data)
    589590                G2pdG.UpdateLimitsGrid(G2frame,data)
    590                 wx.CallAfter(PlotPatterns,G2frame)
     591                wx.CallAfter(PlotPatterns,G2frame,plotType=plottype)
    591592            else:                                                   #picked a limit line
    592593                G2frame.itemPicked = pick
     
    650651                else:       #1st row of refl ticks
    651652                    G2frame.refOffset = event.ydata
    652         PlotPatterns(G2frame)
     653        PlotPatterns(G2frame,plotType=plottype)
    653654        G2frame.itemPicked = None   
    654655
     
    706707        item, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
    707708        while item:
    708             if 'PWDR' in G2frame.PatternTree.GetItemText(item):
     709            if plotType in G2frame.PatternTree.GetItemText(item):
    709710                Pattern = G2frame.PatternTree.GetItemPyData(item)
    710711                if len(Pattern) < 3:                    # put name on end if needed
     
    770771        if Pattern[1] is None: continue # skip over uncomputed simulations
    771772        xye = ma.array(ma.getdata(Pattern[1]))
     773        Zero = Parms.get('Zero',[0.,0.])[1]
    772774        if PickId:
    773775            ifpicked = Pattern[2] == G2frame.PatternTree.GetItemText(PatternId)
     
    780782            Id = G2gd.GetPatternTreeItemId(G2frame,G2frame.root, Pattern[2])
    781783            if 'C' in Parms['Type'][0]:
    782                 X = 4*np.pi*npsind((xye[0]-Parms['Zero'][1])/2.0)/wave
     784                X = 4*np.pi*npsind((xye[0]-Zero)/2.0)/wave
    783785            else:
    784                 X = 2*np.pi*Parms['difC'][1]/(xye[0]-Parms['Zero'][1])
     786                X = 2*np.pi*Parms['difC'][1]/(xye[0]-Zero)
    785787        else:
    786             X = xye[0]-Parms['Zero'][1]
     788            X = xye[0]-Zero
    787789        if not lenX:
    788790            lenX = len(X)
     
    814816            if ifpicked:
    815817                Z = xye[3]+offset*N
    816                 W = xye[4]+offset*N
    817                 D = xye[5]-Ymax*G2frame.delOffset
     818                if 'PWDR' in plotType:  #powder background
     819                    W = xye[4]+offset*N
     820                    D = xye[5]-Ymax*G2frame.delOffset
     821                elif 'SASD' in plotType:
     822                    D = xye[4]-Ymax*G2frame.delOffset
    818823                if G2frame.logPlot:
    819                     Plot.semilogy(X,Y,colors[N%6]+'+',picker=3.,clip_on=False,nonposy='mask')
    820                     Plot.semilogy(X,Z,colors[(N+1)%6],picker=False,nonposy='mask')
    821                     Plot.semilogy(X,W,colors[(N+2)%6],picker=False,nonposy='mask')
     824                    if 'PWDR' in plotType:
     825                        Plot.semilogy(X,Y,colors[N%6]+'+',picker=3.,clip_on=False,nonposy='mask')
     826                        Plot.semilogy(X,Z,colors[(N+1)%6],picker=False,nonposy='mask')
     827                        Plot.semilogy(X,W,colors[(N+2)%6],picker=False,nonposy='mask')
     828                    elif 'SASD' in plotType:
     829                        Plot.loglog(X,Y,colors[N%6]+'+',picker=3.,clip_on=False,nonposy='mask')
     830                        Plot.loglog(X,Z,colors[(N+1)%6],picker=False,nonposy='mask')
    822831                elif G2frame.Weight:
    823832                    DY = xye[1]*np.sqrt(xye[2])
     
    830839                    Plot.axhline(0.,color=wx.BLACK)
    831840                else:
    832                     if G2frame.SubBack:
     841                    if G2frame.SubBack and 'PWDR' in plotType:
    833842                        Plot.plot(Xum,Y-W,colors[N%6]+'+',picker=3.,clip_on=False)
    834843                        Plot.plot(X,Z-W,colors[(N+1)%6],picker=False)
     
    836845                        Plot.plot(Xum,Y,colors[N%6]+'+',picker=3.,clip_on=False)
    837846                        Plot.plot(X,Z,colors[(N+1)%6],picker=False)
    838                     Plot.plot(X,W,colors[(N+2)%6],picker=False)
     847                    if 'PWDR' in plotType:
     848                        Plot.plot(X,W,colors[(N+2)%6],picker=False)
    839849                    Plot.plot(X,D,colors[(N+3)%6],picker=False)
    840850                    Plot.axhline(0.,color=wx.BLACK)
     
    858868            else:
    859869                if G2frame.logPlot:
    860                     Plot.semilogy(X,Y,colors[N%6],picker=False,nonposy='clip')
     870                    if 'PWDR' in plotType:
     871                        Plot.semilogy(X,Y,colors[N%6],picker=False,nonposy='mask')
     872                    elif 'SASD' in plotType:
     873                        Plot.loglog(X,Y,colors[N%6],picker=False,nonposy='mask')
    861874                else:
    862875                    Plot.plot(X,Y,colors[N%6],picker=False)
     876            if G2frame.logPlot:
     877                Plot.set_ylim(bottom=np.min(np.trim_zeros(Y))/2.)
    863878    if PickId and not G2frame.Contour:
    864879        Parms,Parms2 = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Instrument Parameters'))
  • trunk/GSASIIpwdGUI.py

    r1177 r1199  
    6767        'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],
    6868        'DisplaceX':[0.0,False],'DisplaceY':[0.0,False],'Diffuse':[],
    69         'Temperature':300.,'Pressure':1.0,
     69        'Temperature':300.,'Pressure':0.1,
    7070        'FreePrm1':0.,'FreePrm2':0.,'FreePrm3':0.,
    7171        'Gonio. radius':200.0,
     
    693693       
    694694def UpdateInstrumentGrid(G2frame,data):
    695     '''respond to selection of PWDR Instrument Parameters
     695    '''respond to selection of PWDR/SASD Instrument Parameters
    696696    data tree item.
    697697    '''
     
    714714            del(insVal['Polariz.'])
    715715            del(insRef['Polariz.'])
    716     else:                               #single crystal data
     716    elif 'S' in data['Type'][0]:                               #single crystal data
     717        insVal = dict(zip(keys,[data[key][1] for key in keys]))
     718        insDef = dict(zip(keys,[data[key][0] for key in keys]))
     719        insRef = {}
     720    elif 'L' in data['Type'][0]:                               #low angle data
    717721        insVal = dict(zip(keys,[data[key][1] for key in keys]))
    718722        insDef = dict(zip(keys,[data[key][0] for key in keys]))
     
    10651069                    instSizer.Add(itemRef,0,wx.ALIGN_CENTER_VERTICAL)
    10661070       
    1067     else:                       #single crystal data
     1071    elif 'S' in insVal['Type']:                       #single crystal data
    10681072        if 'C' in insVal['Type']:               #constant wavelength
    10691073            instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,u' Lam (\xc5): (%10.6f)'%(insDef['Lam'])),
     
    10731077            waveVal.Bind(wx.EVT_KILL_FOCUS,OnWaveValue)
    10741078            instSizer.Add(waveVal,0,wx.ALIGN_CENTER_VERTICAL)
     1079        else:                                   #time of flight (neutrons)
     1080            pass                                #for now
     1081    elif 'L' in insVal['Type']:
     1082        if 'C' in insVal['Type']:       
     1083            instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,u' Lam (\xc5): (%10.6f)'%(insDef['Lam'])),
     1084                0,wx.ALIGN_CENTER_VERTICAL)
     1085            waveVal = wx.TextCtrl(G2frame.dataDisplay,wx.ID_ANY,'%10.6f'%(insVal['Lam']),style=wx.TE_PROCESS_ENTER)
     1086            waveVal.Bind(wx.EVT_TEXT_ENTER,OnWaveValue)
     1087            waveVal.Bind(wx.EVT_KILL_FOCUS,OnWaveValue)
     1088            instSizer.Add(waveVal,0,wx.ALIGN_CENTER_VERTICAL)
     1089            instSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,'  Azimuth: %7.2f'%(insVal['Azimuth'])),0,wx.ALIGN_CENTER_VERTICAL)
    10751090        else:                                   #time of flight (neutrons)
    10761091            pass                                #for now
     
    10881103       
    10891104def UpdateSampleGrid(G2frame,data):
    1090     '''respond to selection of PWDR Sample Parameters
     1105    '''respond to selection of PWDR/SASD Sample Parameters
    10911106    data tree item.
    10921107    '''
     
    10951110        dataType = data['Type']
    10961111        histType = 'HKLF'
    1097         if 'PWDR' in histName:          #else HKLF - only Scale
     1112        if 'PWDR' in histName:
    10981113            histType = 'PWDR'
    10991114            if 'Debye' in dataType:
     
    11011116            else:       #Bragg-Brentano
    11021117                copyNames += ['Shift','Transparency','SurfRoughA','SurfRoughB']
     1118        elif 'SASD' in histName:
     1119            histType = 'SASD'
    11031120        if len(addNames):
    11041121         copyNames += addNames
     
    11561173   
    11571174    def OnSampleCopy(event):
    1158         histName = G2frame.PatternTree.GetItemText(G2frame.PatternId)
    1159         histType,copyNames = SetCopyNames(
    1160             histName,
     1175        histType,copyNames = SetCopyNames(histName,
    11611176            addNames=['Omega','Chi','Phi','Gonio. radius','InstrName'])
    11621177        copyDict = {}
     
    12101225
    12111226    def OnSampleFlagCopy(event):
    1212         histName = G2frame.PatternTree.GetItemText(G2frame.PatternId)
    12131227        histType,copyNames = SetCopyNames(histName)
    12141228        flagDict = {}
     
    12771291    #reload(G2gd)
    12781292    ######################################################################
     1293    histName = G2frame.PatternTree.GetItemText(G2frame.PatternId)
    12791294    if G2frame.dataDisplay:
    12801295        G2frame.dataFrame.Clear()
     
    13111326    if 'FreePrm3' not in data:
    13121327        data['FreePrm3'] = 0.
    1313     if 'SurfRoughA' not in data:
     1328    if 'SurfRoughA' not in data and 'PWDR' in histName:
    13141329        data['SurfRoughA'] = [0.,False]
    13151330        data['SurfRoughB'] = [0.,False]
     
    13191334    parms.append(['Scale','Histogram scale factor: ',[10,4]])
    13201335    parms.append(['Gonio. radius','Goniometer radius (mm): ',[10,3]])
    1321     if data['Type'] == 'Debye-Scherrer':
    1322         parms += [['DisplaceX',u'Sample X displ. perp. to beam (\xb5m): ',[10,3]],
    1323             ['DisplaceY',u'Sample Y displ. || to beam (\xb5m): ',[10,3]],
    1324             ['Absorption',u'Sample absorption (\xb5\xb7r): ',[10,4]],]
    1325     elif data['Type'] == 'Bragg-Brentano':
    1326         parms += [['Shift',u'Sample displacement(\xb5m): ',[10,4]],
    1327             ['Transparency',u'Sample transparency(1/\xb5eff, cm): ',[10,3]],
    1328             ['SurfRoughA','Surface roughness A: ',[10,4]],
    1329             ['SurfRoughB','Surface roughness B: ',[10,4]]]
     1336    if 'PWDR' in histName:
     1337        if data['Type'] == 'Debye-Scherrer':
     1338            parms += [['DisplaceX',u'Sample X displ. perp. to beam (\xb5m): ',[10,3]],
     1339                ['DisplaceY',u'Sample Y displ. || to beam (\xb5m): ',[10,3]],
     1340                ['Absorption',u'Sample absorption (\xb5\xb7r): ',[10,4]],]
     1341        elif data['Type'] == 'Bragg-Brentano':
     1342            parms += [['Shift',u'Sample displacement(\xb5m): ',[10,4]],
     1343                ['Transparency',u'Sample transparency(1/\xb5eff, cm): ',[10,3]],
     1344                ['SurfRoughA','Surface roughness A: ',[10,4]],
     1345                ['SurfRoughB','Surface roughness B: ',[10,4]]]
    13301346    parms.append(['Omega','Goniometer omega:',[10,3]])
    13311347    parms.append(['Chi','Goniometer chi:',[10,3]])
     
    13511367    mainSizer.Add((5,5),0)
    13521368
    1353     nameSizer = wx.BoxSizer(wx.HORIZONTAL)
    1354     nameSizer.Add(wx.StaticText(G2frame.dataDisplay,wx.ID_ANY,' Diffractometer type: '),
    1355                 0,wx.ALIGN_CENTER_VERTICAL)
    1356     choices = ['Debye-Scherrer','Bragg-Brentano',]
    1357     histoType = wx.ComboBox(G2frame.dataDisplay,wx.ID_ANY,value=data['Type'],choices=choices,
    1358         style=wx.CB_READONLY|wx.CB_DROPDOWN)
    1359     histoType.Bind(wx.EVT_COMBOBOX, OnHistoType)
    1360     nameSizer.Add(histoType)
    1361     mainSizer.Add(nameSizer,0,wx.EXPAND,1)
    1362     mainSizer.Add((5,5),0)
     1369    if 'PWDR' in histName:
     1370        nameSizer = wx.BoxSizer(wx.HORIZONTAL)
     1371        nameSizer.Add(wx.StaticText(G2frame.dataDisplay,wx.ID_ANY,' Diffractometer type: '),
     1372                    0,wx.ALIGN_CENTER_VERTICAL)
     1373        choices = ['Debye-Scherrer','Bragg-Brentano',]
     1374        histoType = wx.ComboBox(G2frame.dataDisplay,wx.ID_ANY,value=data['Type'],choices=choices,
     1375            style=wx.CB_READONLY|wx.CB_DROPDOWN)
     1376        histoType.Bind(wx.EVT_COMBOBOX, OnHistoType)
     1377        nameSizer.Add(histoType)
     1378        mainSizer.Add(nameSizer,0,wx.EXPAND,1)
     1379        mainSizer.Add((5,5),0)
    13631380
    13641381    parmSizer = wx.FlexGridSizer(10,2,5,0)
  • trunk/imports/G2pwd_xye.py

    r1168 r1199  
    2121import GSASIIpath
    2222GSASIIpath.SetVersionNumber("$Revision$")
     23npasind = lambda x: 180.*np.arcsin(x)/np.pi
    2324
    2425class xye_ReaderClass(G2IO.ImportPowderData):
     
    134135            traceback.print_exc(file=sys.stdout)
    135136            return False
     137
     138class qxye_ReaderClass(G2IO.ImportPowderData):
     139    'Routines to import q data from a .xye file'
     140    def __init__(self):
     141        super(self.__class__,self).__init__( # fancy way to self-reference
     142            extensionlist=('.xye','.txt','.dat'),
     143            strictExtension=False,
     144            formatName = 'q step xye',
     145            longFormatName = 'q stepped data file'
     146            )
     147
     148    # Validate the contents -- make sure we only have valid lines
     149    def ContentsValidator(self, filepointer):
     150        'Look through the file for expected types of lines in a valid q-step file'
     151        gotCcomment = False
     152        begin = True
     153        for i,S in enumerate(filepointer):
     154            if i > 1000: break
     155            if begin:
     156                if gotCcomment and S.find('*/') > -1:
     157                    begin = False
     158                    continue
     159                if S.strip().startswith('/*'):
     160                    gotCcomment = True
     161                    continue   
     162                if S[0] == '#':
     163                    continue       #ignore comments, if any
     164                elif len(S) == 1:
     165                    continue        #ignore blank lines
     166                else:
     167                    begin = False
     168                # valid line to read?
     169            vals = S.split()
     170            if len(vals) == 2 or len(vals) == 3:
     171                continue
     172            else:
     173                self.errors = 'Unexpected information in line: '+str(i+1)
     174                self.errors += '  '+str(S)
     175                return False
     176        return True # no errors encountered
     177
     178    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
     179        'Read a q-step file'
     180        x = []
     181        y = []
     182        w = []
     183        try:
     184            wave = 1.5428   #Cuka default
     185            Temperature = 300
     186            for S in self.comments:
     187                if 'Wave' in S.split('=')[0]:
     188                    try:
     189                        wave = float(S.split('=')[1])
     190                    except:
     191                        pass
     192                elif 'Temp' in S.split('=')[0]:
     193                    try:
     194                        Temperature = float(S.split('=')[1])
     195                    except:
     196                        pass
     197            self.instdict['wave'] = wave
     198            gotCcomment = False
     199            begin = True
     200            for i,S in enumerate(filepointer):
     201                self.errors = 'Error reading line: '+str(i+1)
     202                # or a block of comments delimited by /* and */
     203                # or (GSAS style) each line can begin with '#'
     204                if begin:
     205                    if gotCcomment and S.find('*/') > -1:
     206                        self.comments.append(S[:-1])
     207                        begin = False
     208                        continue
     209                    if S.strip().startswith('/*'):
     210                        self.comments.append(S[:-1])
     211                        gotCcomment = True
     212                        continue   
     213                    if S[0] == '#':
     214                        self.comments.append(S[:-1])
     215                        continue       #ignore comments, if any
     216                    elif len(S) == 1:      #blank line only CR/LF
     217                        continue
     218                    else:
     219                        begin = False
     220                # valid line to read
     221                vals = S.split()
     222                try:
     223                    x.append(2.*npasind(wave*float(vals[0])/(4.*np.pi)))
     224                    f = float(vals[1])
     225                    if f <= 0.0:
     226                        y.append(0.0)
     227                        w.append(1.0)
     228                    elif len(vals) == 3:
     229                        y.append(float(vals[1]))
     230                        w.append(1.0/float(vals[2])**2)
     231                    else:
     232                        y.append(float(vals[1]))
     233                        w.append(1.0/float(vals[1]))
     234                except ValueError:
     235                    msg = 'Error in line '+str(i+1)
     236                    print msg
     237                    break
     238            N = len(x)
     239            self.powderdata = [
     240                np.array(x), # x-axis values
     241                np.array(y), # powder pattern intensities
     242                np.array(w), # 1/sig(intensity)^2 values (weights)
     243                np.zeros(N), # calc. intensities (zero)
     244                np.zeros(N), # calc. background (zero)
     245                np.zeros(N), # obs-calc profiles
     246                ]
     247            self.powderentry[0] = filename
     248            #self.powderentry[1] = pos # bank offset (N/A here)
     249            self.powderentry[2] = 1 # xye file only has one bank
     250            self.idstring = ospath.basename(filename)
     251            # scan comments for temperature
     252            self.Sample['Temperature'] = Temperature
     253
     254            return True
     255        except Exception as detail:
     256            self.errors += '\n  '+str(detail)
     257            print self.formatName+' read error:'+str(detail) # for testing
     258            import traceback
     259            traceback.print_exc(file=sys.stdout)
     260            return False
Note: See TracChangeset for help on using the changeset viewer.