Changeset 5312 for trunk


Ignore:
Timestamp:
Jul 19, 2022 11:11:38 AM (3 years ago)
Author:
vondreele
Message:

Improvements to REFD GUI: added spinners on roughness & thickness; hese step by 1.0 and added a slider for thickness.
Makes it a lot easier to find a good starting value set.
Some additions to Cluster Analysis

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/GSASIIdataGUI.py

    r5311 r5312  
    57295729                'No Cluster Analysis possible')
    57305730            return
    5731            
    5732         print(CAmatrix.shape)
    5733          
    5734         #fill cluster analysis data matrix here
     5731        ClusterData['DataMatrix'] = CAmatrix
     5732        Ymat = SSD.pdist(CAmatrix,ClusterData['Method'])
    57355733       
    57365734        Id = GetGPXtreeItemId(self,self.root,'Cluster Analysis')
    57375735        if not Id:
    57385736            Id = self.GPXtree.AppendItem(self.root,text='Cluster Analysis')
    5739             self.GPXtree.SetItemPyData(Id,{})   #what should go in here by default?           
    5740            
    5741 
    5742        
     5737        ClustDict = {'ConDistMat':Ymat}
     5738        ClustDict.update(ClusterData)
     5739        self.GPXtree.SetItemPyData(Id,ClustDict)   #what should go in here by default?                   
     5740
     5741        self.GPXtree.SelectItem(Id)
    57435742   
    57445743    def reloadFromGPX(self,rtext=None):
     
    71487147        data['newLeBail'] = False
    71497148    if 'Cluster Data' not in data:
    7150         data['Cluster Data'] = {'Files':[],'DataMatrix':None,'Method':'euclidean','Limits':[]}
     7149        data['Cluster Data'] = {'Files':[],'Method':'euclidean','Limits':[],'DataMatrix':None,'LinkMethod':'single',
     7150            'Opt Order':False}
    71517151   
    71527152    #end patch
     
    72797279                ClusData['Files'] = names
    72807280                limits = GetCaLimits(names)
    7281                 ClusData['Limits'] = [limits,limits]
     7281                ClusData['Limits'] = [copy.copy(limits),limits]
     7282                ClusData['DataMatrix'] = None
    72827283               
    72837284            dlg.Destroy()
    72847285            G2frame.SetTitleByGPX()
    7285 
    72867286           
    72877287            wx.CallAfter(UpdateControls,G2frame,data)
     
    72997299            ClusData['DataMatrix'] = None
    73007300           
     7301        def GetYMatSize():
     7302            nData = 0
     7303            for name in ClusData['Files']:
     7304                item = GetGPXtreeItemId(G2frame,G2frame.root,name)
     7305                if 'PWDR' in name:
     7306                    x = G2frame.GPXtree.GetItemPyData(item)[1][0]
     7307                else:
     7308                    PDFControls = G2frame.GPXtree.GetItemPyData(GetGPXtreeItemId(G2frame, item,'PDF Controls'))
     7309                    x = PDFControls['G(R)'][1][0]
     7310                iBeg = np.searchsorted(x,ClusData['Limits'][1][0])
     7311                iFin = np.searchsorted(x,ClusData['Limits'][1][1])+1
     7312                nData += (iFin-iBeg)
     7313            return nData
     7314           
    73017315        def CheckLimits(invalid,value,tc):
     7316            #TODO this needs a check on ultimate size of data array; loop over names & count points?
     7317
    73027318            if ClusData['Limits'][1][1] < ClusData['Limits'][1][0]:
    73037319                ClusData['Limits'][1] = [ClusData['Limits'][1][1],ClusData['Limits'][1][0]]
    7304                 wx.CallAfter(UpdateControls,G2frame,data)
     7320            wx.CallAfter(UpdateControls,G2frame,data)
     7321           
    73057322               
    73067323        clusSizer = wx.BoxSizer(wx.VERTICAL)
     
    73207337        clusSizer.Add(dataSizer)
    73217338        if len(ClusData['Files']):
     7339            print(' Cluster analysis data array size: %d'%GetYMatSize())
    73227340            choice = ['braycurtis', 'canberra', 'chebyshev', 'cityblock', 'correlation', 'cosine',  \
    7323                 'dice', 'euclidean', 'hamming', 'jaccard', 'jensenshannon', 'kulsinski',    \
    7324                 'kulczynski1', 'mahalanobis', 'matching', 'minkowski', 'rogerstanimoto',    \
    7325                 'russellrao', 'seuclidean', 'sokalmichener', 'sokalsneath', 'sqeuclidean', 'yule']
     7341                'euclidean', 'jensenshannon', 'minkowski', 'seuclidean',  'sqeuclidean']
    73267342            methsizer = wx.BoxSizer(wx.HORIZONTAL)
    73277343            methsizer.Add(wx.StaticText(G2frame.dataWindow,label='Select cluster analysis data method: '),0,WACV)
     
    73387354                xmin=ClusData['Limits'][0][0],xmax=ClusData['Limits'][0][1],OnLeave=CheckLimits),0,WACV)
    73397355            clusSizer.Add(limitSizer)
    7340             clusSizer.Add(wx.StaticText(G2frame.dataWindow,label='(Examine any %s plot for reasonable limits) '%Type),0,WACV)
     7356            clusSizer.Add(wx.StaticText(G2frame.dataWindow,label='(Examine any %s plot for reasonable limits; any change will clear Cluster data matrix) '%Type),0,WACV)
    73417357        return clusSizer
    73427358       
     
    82118227                wx.StaticText(G2frame.dataWindow,wx.ID_ANY,'Select one phase to see its parameters'))
    82128228        elif G2frame.GPXtree.GetItemText(item) == 'Cluster Analysis':
    8213             G2frame.dataWindow.GetSizer().Add(
    8214                 wx.StaticText(G2frame.dataWindow,wx.ID_ANY,'Cluster Analysis Results:'))
     8229            data = G2frame.GPXtree.GetItemPyData(item)
     8230            G2seq.UpdateClusterAnalysis(G2frame,data)
    82158231        elif G2frame.GPXtree.GetItemText(item) == 'Restraints':
    82168232            data = G2frame.GPXtree.GetItemPyData(item)
  • TabularUnified trunk/GSASIImath.py

    r5306 r5312  
    5555   
    5656################################################################################
    57 ##### Hessian least-squares Levenberg-Marquardt routine
     57#### Hessian least-squares Levenberg-Marquardt routine
    5858################################################################################
    5959class G2NormException(Exception): pass
     
    587587   
    588588################################################################################
    589 ##### Atom manipulations
     589#### Atom manipulations
    590590################################################################################
    591591
     
    14251425    for i in centList:
    14261426        cent += Cart[i]
    1427     model['MolCent'][0] = cent/len(centList)   
     1427    model['MolCent'][0] = cent/len(centList)
     1428   
     1429###############################################################################
     1430#### Various utilities
     1431###############################################################################
    14281432   
    14291433def UpdateRBUIJ(Bmat,Cart,RBObj):
     
    23882392   
    23892393################################################################################
    2390 ##### distance, angle, planes, torsion stuff
     2394#### distance, angle, planes, torsion stuff
    23912395################################################################################
    23922396
     
    32463250   
    32473251###############################################################################
    3248 ##### Protein validation - "ERRATV2" analysis
     3252#### Protein validation - "ERRATV2" analysis
    32493253###############################################################################
    32503254
     
    34293433   
    34303434################################################################################
    3431 ##### Texture fitting stuff
     3435#### Texture fitting stuff
    34323436################################################################################
    34333437
     
    36053609   
    36063610################################################################################
    3607 ##### Fourier & charge flip stuff
     3611#### Fourier & charge flip stuff
    36083612################################################################################
    36093613
     
    45614565
    45624566################################################################################
    4563 ##### single peak fitting profile fxn stuff
     4567#### single peak fitting profile fxn stuff
    45644568################################################################################
    45654569
     
    48294833   
    48304834################################################################################
    4831 ##### MC/SA stuff
     4835#### MC/SA stuff
    48324836################################################################################
    48334837
     
    56425646    return Result,tsum,nsum,rcov
    56435647
     5648###############################################################################
     5649#### Cluster Analysis math
     5650###############################################################################
     5651import scipy.spatial.distance as SSD
     5652import scipy.cluster.hierarchy as SCH
     5653
     5654
    56445655       
    56455656################################################################################
    5646 ##### Quaternion stuff
     5657#### Quaternion stuff
    56475658################################################################################
    56485659
  • TabularUnified trunk/GSASIIplot.py

    r5307 r5312  
    24732473    def onMovePeak(event):
    24742474        selectedPeaks = list(set([row for row,col in G2frame.phaseDisplay.GetSelectedCells()] +
    2475                                 G2frame.phaseDisplay.GetSelectedRows()))
     2475            G2frame.phaseDisplay.GetSelectedRows()))
    24762476        if len(selectedPeaks) != 1:
    24772477            G2G.G2MessageBox(G2frame,'You must select one peak in the table first. # selected ='+
    2478                              str(len(selectedPeaks)),'Select one peak')
     2478                str(len(selectedPeaks)),'Select one peak')
    24792479            return
    24802480        G2frame.itemPicked = G2frame.Lines[selectedPeaks[0]+2] # 1st 2 lines are limits
     
    29672967        dlg.Destroy()
    29682968        applyLims(None) # apply limits
    2969         #GSASIIpath.IPyBreak()
    29702969       
    29712970    def onPlotFormat(event):
  • TabularUnified trunk/GSASIIpwd.py

    r5309 r5312  
    26452645    return YI,WYI
    26462646
    2647 #### Cluster Analysis routines ###################################################################
    2648 
    2649 
    26502647#### RMCutilities ################################################################################
    26512648def MakeInst(PWDdata,Name,Size,Mustrain,useSamBrd):
  • TabularUnified trunk/GSASIIpwdGUI.py

    r5311 r5312  
    69286928            data['FltBack'][1] = backref.GetValue()
    69296929           
     6930        def OnSliderMax(event):
     6931            data['slider max'] = float(slidermax.GetValue())
     6932            wx.CallAfter(UpdateREFDModelsGrid,G2frame,data)
     6933           
    69306934        def Recalculate(invalid,value,tc):
    69316935            if invalid:
     
    69516955        backref.SetValue(data['FltBack'][1])
    69526956        backref.Bind(wx.EVT_CHECKBOX, OnBackRef)
    6953         overall.Add(backref,0,WACV)       
     6957        overall.Add(backref,0,WACV)
     6958        overall.Add(wx.StaticText(G2frame.dataWindow,label=' Select slider range 0-'),0,WACV)
     6959        choice = ['1000','2000','5000','10000']
     6960        slidermax = wx.ComboBox(G2frame.dataWindow,value='%d'%data['slider max'],choices=choice,
     6961            style=wx.CB_READONLY|wx.CB_DROPDOWN)
     6962        slidermax.Bind(wx.EVT_COMBOBOX,OnSliderMax)
     6963        overall.Add(slidermax,0,WACV)
    69546964        return overall
    69556965       
     
    70007010            if invalid:
    70017011                return
     7012            if tc and tc.GetId() in Indx:  #sets slider
     7013                Indx[tc.GetId()].SetValue(value)
    70027014            G2pwd.REFDModelFxn(Profile,Inst,Limits,Substances,data)
    70037015            x,xr,y = G2pwd.makeSLDprofile(data,Substances)
    70047016            ModelPlot(data,x,xr,y)
    70057017            G2plt.PlotPatterns(G2frame,plotType='REFD')
    7006 #            wx.CallLater(100,UpdateREFDModelsGrid,G2frame,data)
     7018
     7019        def OnMoveParm(event):
     7020            Obj = event.GetEventObject()
     7021            ilay,parm,parmObj = Indx[Obj.GetId()]
     7022            move = Obj.GetValue()  # +1 or -1
     7023            Obj.SetValue(0)
     7024            data['Layers'][ilay][parm][0] += move
     7025            parmObj.SetValue(data['Layers'][ilay][parm][0])
     7026            Recalculate(False,1.0,None)
     7027           
     7028        def OnParmSlider(event):
     7029            Obj = event.GetEventObject()
     7030            ilay,parmObj = Indx[Obj.GetId()]
     7031            value = Obj.GetValue()
     7032            data['Layers'][ilay]['Thick'][0] = value
     7033            parmObj.SetValue(data['Layers'][ilay]['Thick'][0])
     7034            Recalculate(False,1.0,None)
    70077035
    70087036        Indx = {}                       
     
    70897117                    if ilay == len(data['Layers'])-1:
    70907118                        parms = ['Rough',]
     7119                    if len(parms) > 1:
     7120                        slide = wx.BoxSizer(wx.HORIZONTAL)
     7121                        slide.Add(wx.StaticText(G2frame.dataWindow,label=' Layer thickness: '),0,WACV)
     7122                        parmSldr = wx.Slider(G2frame.dataWindow,minValue=0,maxValue=data['slider max'],value=data['Layers'][ilay]['Thick'][0])
     7123                        parmSldr.Bind(wx.EVT_SLIDER,OnParmSlider)
     7124                        slide.Add(parmSldr,1,wx.EXPAND)
    70917125                    for parm in parms:
    70927126                        parmsline.Add(wx.StaticText(G2frame.dataWindow,label=' %s: '%(names[parm])),0,WACV)
    7093                         parmsline.Add(G2G.ValidatedTxtCtrl(G2frame.dataWindow,data['Layers'][ilay][parm],0,
    7094                             nDig=(10,2),OnLeave=Recalculate),0,WACV)
     7127                        parmval = G2G.ValidatedTxtCtrl(G2frame.dataWindow,data['Layers'][ilay][parm],0,nDig=(10,2),OnLeave=Recalculate)
     7128                        if parm =='Thick':
     7129                            Indx[parmval.GetId()] = parmSldr
     7130                        parmsline.Add(parmval,0,WACV)
     7131                        parmSpin = wx.SpinButton(G2frame.dataWindow,style=wx.SP_VERTICAL,size=wx.Size(25,25))
     7132                        Indx[parmSpin.GetId()] = [ilay,parm,parmval]
     7133                        parmSpin.SetValue(0)
     7134                        parmSpin.SetRange(-1,1)
     7135                        parmSpin.Bind(wx.EVT_SPIN, OnMoveParm)
     7136                        parmsline.Add(parmSpin,0,WACV)
    70957137                        varBox = wx.CheckBox(G2frame.dataWindow,label='Refine?')
    70967138                        Indx[varBox.GetId()] = [ilay,parm]
     
    70997141                        parmsline.Add(varBox,0,WACV)
    71007142                    layerSizer.Add(parmsline)
     7143                    if len(parms) > 1:
     7144                        Indx[parmSldr.GetId()] = [ilay,parmval] #parmval is always for Thick
     7145                        layerSizer.Add(slide,1,wx.EXPAND)
    71017146            if ilay < len(data['Layers'])-1:
    71027147                newlayer = wx.BoxSizer(wx.HORIZONTAL)
     
    71657210    Substances = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,G2frame.PatternId, 'Substances'))['Substances']
    71667211    ProfDict,Profile,Name = G2frame.GPXtree.GetItemPyData(G2frame.PatternId)[:3]
     7212    #patch
     7213    if 'slider max' not in data:
     7214        data['slider max'] = 2000.
    71677215    if 'ifDQ' not in ProfDict:
    71687216        ProfDict['ifDQ'] = np.any(Profile[5])
  • TabularUnified trunk/GSASIIseqGUI.py

    r5307 r5312  
    15621562#UpdateClusterAnalysis: results
    15631563###############################################################################################################
     1564
     1565def UpdateClusterAnalysis(G2frame,data):
     1566    import scipy.spatial.distance as SSD
     1567    import scipy.cluster.hierarchy as SCH
    15641568   
     1569    # import matplotlib.pyplot as plt
     1570    # plt.figure()
     1571    # Zsingle = SCH.single(data['ConDistMat'])
     1572    # SCH.dendrogram(Zsingle)
     1573    # plt.show()
     1574    # Zcomplete = SCH.complete(data['ConDistMat'])
     1575    # SCH.dendrogram(Zcomplete)
     1576    # plt.show()
     1577   
     1578    def OnLinkMethod(event):
     1579        data['LinkMethod'] = method.GetValue()
     1580       
     1581    def OnOptOrd(event):
     1582        data['Opt Order'] = not data['Opt Order']
     1583       
     1584    def OnCompute(event):
     1585        print('Do heirarchial clustering - TBD')
     1586   
     1587    Z = data['ConDistMat']
     1588    ZM = SSD.squareform(Z)
     1589    XY = np.mgrid[0:ZM.shape[0],0:ZM.shape[1]]
     1590   
     1591    G2plt.PlotXYZ(G2frame,XY,ZM,labelX='Data no.',labelY='Data No.',newPlot=False,Title=data['Method'],zrange=None,color=None,buttonHandler=None)
     1592
     1593    bigSizer = wx.BoxSizer(wx.HORIZONTAL)
     1594    mainSizer = wx.BoxSizer(wx.VERTICAL)
     1595    mainSizer.Add((5,5),0)
     1596    subSizer = wx.BoxSizer(wx.HORIZONTAL)
     1597    subSizer.Add((-1,-1),1,wx.EXPAND)
     1598    subSizer.Add(wx.StaticText(G2frame.dataWindow,label='Cluster Analysis tools: '),0,WACV)   
     1599    subSizer.Add((-1,-1),1,wx.EXPAND)
     1600    mainSizer.Add(subSizer,0,wx.EXPAND)
     1601    mainSizer.Add((5,5),0)
     1602    hierSizer = wx.BoxSizer(wx.HORIZONTAL)
     1603    hierSizer.Add(wx.StaticText(G2frame.dataWindow,label='Hierarchical clustering: Select linkage method: '),0,WACV)
     1604    choice = ['single','complete','average','weighted','centroid','median','ward',]
     1605    method = wx.ComboBox(G2frame.dataWindow,choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
     1606    method.SetValue(data['LinkMethod'])
     1607    method.Bind(wx.EVT_COMBOBOX, OnLinkMethod)
     1608    hierSizer.Add(method,0,WACV)
     1609    optOrd = wx.CheckBox(G2frame.dataWindow,label=' Optimal order? ')
     1610    optOrd.Bind(wx.EVT_CHECKBOX,OnOptOrd)
     1611    optOrd.SetValue(data['Opt Order'])
     1612    hierSizer.Add(optOrd,0,WACV)
     1613    compute = wx.Button(G2frame.dataWindow,label='Compute')
     1614    compute.Bind(wx.EVT_BUTTON,OnCompute)
     1615    hierSizer.Add(compute,0,WACV)
     1616    mainSizer.Add(hierSizer)
     1617   
     1618   
     1619   
     1620   
     1621    bigSizer.Add(mainSizer)
     1622       
     1623    bigSizer.Add(G2G.HelpButton(G2frame.dataWindow,helpIndex='Cluster Analysis'))
     1624    bigSizer.Layout()
     1625    bigSizer.FitInside(G2frame.dataWindow)
     1626    G2frame.dataWindow.SetSizer(bigSizer)
     1627    G2frame.dataWindow.SetDataSize()
     1628    G2frame.SendSizeEvent()
     1629
     1630
Note: See TracChangeset for help on using the changeset viewer.