Changeset 1237


Ignore:
Timestamp:
Mar 5, 2014 2:14:48 PM (8 years ago)
Author:
vondreele
Message:

Allow changes to limits when in SASD Models
"fix" matplotlib warning message when log plot is hit with a mouse button event
There is still an underlying problem.
Mods to SASD Model to have scaled errors on data for fitting purposes - uses wtFactor
Start on size distribution fitting

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIplot.py

    r1232 r1237  
    522522                        G2frame.G2plotNB.status.SetStatusText('TOF =%9.3f d =%9.5f q = %9.5f Intensity =%9.2f'%(xpos,dsp,q,ypos),1)
    523523                if G2frame.itemPicked:
    524                     Page.canvas.SetToolTipString('%9.3f'%(xpos))
     524                    Page.canvas.SetToolTipString('%9.5f'%(xpos))
    525525                if G2frame.PickId:
    526526                    found = []
     
    539539            except TypeError:
    540540                G2frame.G2plotNB.status.SetStatusText('Select '+plottype+' powder pattern first',1)
     541               
     542    def OnPress(event): #ugh - this removes a matplotlib error for mouse clicks in log plots                 
     543        olderr = np.seterr(invalid='ignore')
    541544                                                   
    542545    def OnPick(event):
     
    553556        PickId = G2frame.PickId
    554557        pick = event.artist
    555         mouse = event.mouseevent       
     558        mouse = event.mouseevent
    556559        xpos = pick.get_xdata()
    557560        ypos = pick.get_ydata()
     
    593596            else:                                                   #picked a limit line
    594597                G2frame.itemPicked = pick
     598        elif G2frame.PatternTree.GetItemText(PickId) == 'Models':
     599            if ind.all() != [0]:                                    #picked a data point
     600                LimitId = G2gd.GetPatternTreeItemId(G2frame,PatternId, 'Limits')
     601                data = G2frame.PatternTree.GetItemPyData(LimitId)
     602                if mouse.button==1:
     603                    data[1][0] = min(xy[0],data[1][1])
     604                if mouse.button==3:
     605                    data[1][1] = max(xy[0],data[1][0])
     606                G2frame.PatternTree.SetItemPyData(LimitId,data)
     607                wx.CallAfter(PlotPatterns,G2frame,plotType=plottype)
     608            else:                                                   #picked a limit line
     609                G2frame.itemPicked = pick
    595610        elif G2frame.PatternTree.GetItemText(PickId) == 'Reflection Lists' or \
    596611            'PWDR' in G2frame.PatternTree.GetItemText(PickId):
     
    629644                if id > 1 and data[id][0] > data[id][1]:
    630645                        data[id].reverse()
    631                 data[1][0] = max(data[0][0],data[1][0])
    632                 data[1][1] = min(data[0][1],data[1][1])
     646                data[1][0] = min(max(data[0][0],data[1][0]),data[1][1])
     647                data[1][1] = max(min(data[0][1],data[1][1]),data[1][0])
    633648                G2frame.PatternTree.SetItemPyData(LimitId,data)
    634649                if G2frame.PatternTree.GetItemText(G2frame.PickId) == 'Limits':
     
    646661                G2frame.PatternTree.SetItemPyData(PeakId,data)
    647662                G2pdG.UpdatePeakGrid(G2frame,data)
     663        elif G2frame.PatternTree.GetItemText(PickId) in ['Models',] and xpos:
     664            lines = []
     665            for line in G2frame.Lines:
     666                lines.append(line.get_xdata()[0])
     667            try:
     668                lineNo = lines.index(G2frame.itemPicked.get_xdata()[0])
     669            except ValueError:
     670                lineNo = -1
     671            if  lineNo in [0,1]:
     672                LimitId = G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Limits')
     673                data = G2frame.PatternTree.GetItemPyData(LimitId)
     674                data[1][lineNo] = xpos
     675                data[1][0] = min(max(data[0][0],data[1][0]),data[1][1])
     676                data[1][1] = max(min(data[0][1],data[1][1]),data[1][0])
     677                G2frame.PatternTree.SetItemPyData(LimitId,data)       
    648678        elif (G2frame.PatternTree.GetItemText(PickId) == 'Reflection Lists' or \
    649679            'PWDR' in G2frame.PatternTree.GetItemText(PickId)) and xpos:
     
    678708        Page.canvas.mpl_connect('pick_event', OnPick)
    679709        Page.canvas.mpl_connect('button_release_event', OnRelease)
     710        Page.canvas.mpl_connect('button_press_event',OnPress)
    680711    Page.SetFocus()
    681712    G2frame.G2plotNB.status.DestroyChildren()
     
    701732                    'd: offset down','l: offset left','r: offset right','u: offset up','o: reset offset',
    702733                    'q: toggle S(q) plot','s: toggle single plot','+: no selection')
    703     Page.keyPress = OnPlotKeyPress
    704    
     734
     735    Page.keyPress = OnPlotKeyPress   
    705736    PickId = G2frame.PickId
    706737    PatternId = G2frame.PatternId
     
    869900                        Plot.set_yscale("log",nonposy='mask')
    870901                        if G2frame.ErrorBars:
    871                             Plot.errorbar(X,Y,yerr=np.sqrt(1./xye[2]),ecolor=colors[N%6],picker=3.,clip_on=False)
     902                            Plot.errorbar(X,Y,yerr=np.sqrt(1./(Pattern[0]['wtFactor']*xye[2])),
     903                                ecolor=colors[N%6],picker=3.,clip_on=False)
    872904                        else:
    873905                            Plot.plot(X,Y,colors[N%6]+'+',picker=3.,clip_on=False)
     
    9831015    else:
    9841016        Page.canvas.draw()
     1017    olderr = np.seterr(invalid='warn') #ugh - this removes a matplotlib error for mouse clicks in log plots                 
    9851018#    G2frame.Pwdr = True
    9861019   
  • trunk/GSASIIpwdGUI.py

    r1233 r1237  
    695695    for i in range(len(data)-2):
    696696        rowLabels.append('exclude')
    697     Types = 2*[wg.GRID_VALUE_FLOAT+':10,3',]
     697    Types = 2*[wg.GRID_VALUE_FLOAT+':12,5',]
    698698    G2frame.LimitsTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
    699699    G2frame.dataFrame.SetLabel('Limits')
     
    24362436        data['Size']['logBins'] = True
    24372437    if 'MinMaxDiam' in data['Size']:
    2438         data['Size']['MinDiam'] = 50
    2439         data['Size']['MaxDiam'] = 10000
     2438        data['Size']['MinDiam'] = 50.
     2439        data['Size']['MaxDiam'] = 10000.
    24402440        del data['Size']['MinMaxDiam']
    24412441    #end patches
     
    24482448        print 'fit model for '+data['Current']
    24492449        if data['Current'] == 'Size dist.':
    2450             G2sasd.SizeDistribution(Profile,Limits,Substances,Sample,data)
     2450            G2sasd.SizeDistribution(Profile,ProfDict,Limits,Substances,Sample,data)
    24512451       
    24522452    def OnSelectFit(event):
     
    24662466    def OnCheckBox(event):
    24672467        Obj = event.GetEventObject()
    2468         itemKey,ind = Indx[Obj.GetId()]
    2469         data[itemKey][ind] = Obj.GetValue()
     2468        item,ind = Indx[Obj.GetId()]
     2469        item[ind] = Obj.GetValue()
    24702470       
    24712471    def OnIntVal(event):
     
    25182518        binSizer.Add(maxdiam,0,WACV)
    25192519        logbins = wx.CheckBox(G2frame.dataDisplay,label='Log bins?')
    2520         Indx[logbins.GetId()] = ['Size','logBins']
     2520        Indx[logbins.GetId()] = [data['Size'],'logBins']
    25212521        logbins.SetValue(data['Size']['logBins'])
    25222522        logbins.Bind(wx.EVT_CHECKBOX, OnCheckBox)
     
    25262526        partSizer = wx.BoxSizer(wx.HORIZONTAL)
    25272527        partSizer.Add(wx.StaticText(G2frame.dataDisplay,label='Particle description: '),0,WACV)
    2528         shapes = {'Spheroid':' Aspect ratio: ','Cylinder Diam.':' Diameter ','Cylinder AR':' Aspect ratio: ',
     2528        shapes = {'Spheroid':' Aspect ratio: ','Cylinder':' Diameter ','Cylinder AR':' Aspect ratio: ',
    25292529            'Unified sphere':'','Unified rod':' Diameter: ','Unified rod AR':' Aspect ratio: ',
    25302530            'Unified disk':' Thickness: '}
     
    25742574        return unifSizer
    25752575       
     2576    def OnEsdScale(event):
     2577        try:
     2578            value = float(esdScale.GetValue())
     2579            if value <= 0.:
     2580                raise ValueError
     2581        except ValueError:
     2582            value = 1./np.sqrt(ProfDict['wtFactor'])
     2583        ProfDict['wtFactor'] = 1./value**2
     2584        esdScale.SetValue('%.3f'%(value))
     2585        G2plt.PlotPatterns(G2frame,plotType='SASD',newPlot=True)
     2586       
    25762587    Sample = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Sample Parameters'))
    25772588    Limits = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Limits'))
    25782589    Inst = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Instrument Parameters'))
    25792590    Substances = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.PatternId, 'Substances'))
    2580     Profile = G2frame.PatternTree.GetItemPyData(G2frame.PatternId)[1]
     2591    ProfDict,Profile = G2frame.PatternTree.GetItemPyData(G2frame.PatternId)[:2]
    25812592
    25822593    if G2frame.dataDisplay:
     
    25982609    fitSel.Bind(wx.EVT_COMBOBOX,OnSelectFit)       
    25992610    topSizer.Add(fitSel,0,WACV)
     2611    topSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Error multiplier: '),0,WACV)
     2612    esdScale = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(1./np.sqrt(ProfDict['wtFactor'])),style=wx.TE_PROCESS_ENTER)
     2613    esdScale.Bind(wx.EVT_TEXT_ENTER,OnEsdScale)       
     2614    esdScale.Bind(wx.EVT_KILL_FOCUS,OnEsdScale)
     2615    topSizer.Add(esdScale,0,WACV)
    26002616    mainSizer.Add(topSizer)
    26012617    G2gd.HorizontalLine(mainSizer,G2frame.dataDisplay)
  • trunk/GSASIIsasd.py

    r1234 r1237  
    5757   
    5858###############################################################################
    59 #### Particle form factors
     59#### Particle form factors & volumes as class definitions
    6060###############################################################################
    6161
    6262class SASDParticles(object):
    63     def __init__(self,Q,name=None,parms=None,parNames=None):
    64         self.Q = Q
     63    def __init__(self,name=None,parNames=None):
    6564        self.name = name
    66         self.Parms = parms
    6765        self.ParmNames = parmNames
    6866       
     
    7674       
    7775class Sphere(SASDParticles):
    78     def __init__(self,Q,name=None,parms=None,parmNames=None):
    79         self.Q = Q
     76    def __init__(self,name=None,parmNames=None):
    8077        self.Name = name
    8178        if self.Name == None:
    8279            self.Name = 'Sphere'
    83         self.Parms = parms
    84         if self.Parms == None:
    85             self.Parms = [50.0,]
    8680        self.ParmNames = parmNames
    8781        if self.ParmNames == None:
    8882            self.ParmNames = ['Radius',]
    8983       
    90     def FormFactor(self):
     84    def FormFactor(self,Q,Parms):
    9185        ''' Compute hard sphere form factor - can use numpy arrays
    9286        param float:Q Q value array (usually in A-1)
     
    9488        returns float: form factors as array as needed
    9589        '''
    96         QR = self.Q*self.Parms[0]
     90        QR = Q*Parms[0]
    9791        return (3./(QR**3))*(np.sin(QR)-(QR*np.cos(QR)))
    9892       
    99     def Volume(self):
     93    def Volume(self,Parms):
    10094        ''' Compute volume of sphere
    10195        - numpy array friendly
     
    10397        returns float: volume
    10498        '''
    105         return (4./3.)*np.pi*self.Parms[0]**3
    106        
    107        
    108    
     99        return (4./3.)*np.pi*Parms[0]**3
     100       
     101class Spheroid(SASDParticles):
     102    def __init__(self,name=None,parmNames=None):
     103        self.Name = name
     104        if self.Name == None:
     105            self.Name = 'Spheroid'
     106        self.ParmNames = parmNames
     107        if self.ParmNames == None:
     108            self.ParmNames = ['Radius','Aspect ratio']
     109   
     110    def FormFactor(self,Q,Parms):
     111        ''' Compute form factor of cylindrically symmetric ellipsoid (spheroid)
     112        - can use numpy arrays for R & AR; will return corresponding numpy array
     113        param float:Q Q value array (usually in A-1)
     114        param float R: radius along 2 axes of spheroid
     115        param float AR: aspect ratio so 3rd axis = R*AR
     116        returns float: form factors as array as needed
     117        '''
     118        R,AR = Parms
     119        NP = 50
     120        if 0.99 < AR < 1.01:
     121            return SphereFF(Q,R,0)
     122        else:
     123            cth = np.linspace(0,1.,NP)
     124            Rct = R*np.sqrt(1.+(AR**2-1.)*cth**2)
     125            return np.sqrt(np.sum(SphereFF(Q[:,np.newaxis],Rct,0)**2,axis=1)/NP)
     126       
     127    def Volume(self,Parms):
     128        ''' Compute volume of cylindrically symmetric ellipsoid (spheroid)
     129        - numpy array friendly
     130        param float R: radius along 2 axes of spheroid
     131        param float AR: aspect ratio so radius of 3rd axis = R*AR
     132        returns float: volume
     133        '''
     134        R,AR = Parms
     135        return AR*(4./3.)*np.pi*R**3
     136       
     137###############################################################################
     138#### Particle form factors
     139###############################################################################
    109140
    110141def SphereFF(Q,R,dummy=0):
     
    274305###############################################################################
    275306
    276 def SizeDistribution(Profile,Limits,Substances,Sample,data):
     307def SizeDistribution(Profile,ProfDict,Limits,Substances,Sample,data):
     308    if data['Size']['logBins']:
     309        Bins = np.logspace(np.log10(data['Size']['MinDiam']),np.log10(data['Size']['MaxDiam']),
     310            data['Size']['Nbins']+1,True)
     311    else:
     312        Bins = np.linspace(data['Size']['MinDiam'],data['Size']['MaxDiam'],
     313            data['Size']['Nbins']+1,True)
     314    Dbins = np.diff(Bins)
     315    BinMag = Dbins*np.ones_like(Dbins)
     316    print np.sum(BinMag)
     317       
    277318    print data['Size']
    278319#    print Limits
Note: See TracChangeset for help on using the changeset viewer.