Changeset 3056


Ignore:
Timestamp:
Sep 8, 2017 2:17:29 PM (4 years ago)
Author:
toby
Message:

expand error reporting with constraints (no fixes yet to prevent them)

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r3054 r3056  
    3737import GSASIIspc as G2spc
    3838VERY_LIGHT_GREY = wx.Colour(235,235,235)
    39 
    40 class MultiIntegerDialog(wx.Dialog):
    41     '''Input a series of integers based on prompts
    42     '''
    43     def __init__(self,parent,title,prompts,values):
    44         wx.Dialog.__init__(self,parent,-1,title,
    45             pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
    46         self.panel = wx.Panel(self)         #just a dummy - gets destroyed in Draw!
    47         self.values = values
    48         self.prompts = prompts
    49         self.Draw()
    50        
    51     def Draw(self):
    52        
    53         def OnValItem(event):
    54             event.Skip()
    55             Obj = event.GetEventObject()
    56             ind = Indx[Obj.GetId()]
    57             try:
    58                 val = int(Obj.GetValue())
    59                 if val <= 0:
    60                     raise ValueError
    61             except ValueError:
    62                 val = self.values[ind]
    63             self.values[ind] = val
    64             Obj.SetValue('%d'%(val))
    65            
    66         self.panel.Destroy()
    67         self.panel = wx.Panel(self)
    68         mainSizer = wx.BoxSizer(wx.VERTICAL)
    69         Indx = {}
    70         for ival,[prompt,value] in enumerate(zip(self.prompts,self.values)):
    71             mainSizer.Add(wx.StaticText(self.panel,-1,prompt),0,wx.ALIGN_CENTER)
    72             valItem = wx.TextCtrl(self.panel,-1,value='%d'%(value),style=wx.TE_PROCESS_ENTER)
    73             mainSizer.Add(valItem,0,wx.ALIGN_CENTER)
    74             Indx[valItem.GetId()] = ival
    75             valItem.Bind(wx.EVT_TEXT_ENTER,OnValItem)
    76             valItem.Bind(wx.EVT_KILL_FOCUS,OnValItem)
    77         OkBtn = wx.Button(self.panel,-1,"Ok")
    78         OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
    79         CancelBtn = wx.Button(self.panel,-1,'Cancel')
    80         CancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
    81         btnSizer = wx.BoxSizer(wx.HORIZONTAL)
    82         btnSizer.Add((20,20),1)
    83         btnSizer.Add(OkBtn)
    84         btnSizer.Add(CancelBtn)
    85         btnSizer.Add((20,20),1)
    86         mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
    87         self.panel.SetSizer(mainSizer)
    88         self.panel.Fit()
    89         self.Fit()
    90 
    91     def GetValues(self):
    92         return self.values
    93        
    94     def OnOk(self,event):
    95         parent = self.GetParent()
    96         parent.Raise()
    97         self.EndModal(wx.ID_OK)             
    98        
    99     def OnCancel(self,event):
    100         parent = self.GetParent()
    101         parent.Raise()
    102         self.EndModal(wx.ID_CANCEL)
    10339
    10440class ConstraintDialog(wx.Dialog):
     
    234170        AtomDict = dict([Phases[phase]['pId'],Phases[phase]['Atoms']] for phase in Phases)
    235171    except KeyError:
    236         G2frame.ErrorDialog('Constraint Error','You must run least squares at least once before setting constraints\n'+ \
    237             'We suggest you refine scale factor first')
     172        G2frame.ErrorDialog('Constraint Error','Constraints cannot be set until a cycle of least squares'+
     173                            'has been run.\nWe suggest you refine a scale factor.')
    238174        return
    239175
     
    871807
    872808        :param str name: the type of constraints to be displayed ('HAP',
    873           'Hist', 'Phase', or 'Global')
     809          'Hist', 'Phase', 'Global', 'Sym-Generated')
    874810        :param wx.Panel pageDisplay: parent panel for sizer
    875811        :returns: wx.Sizer created by method
    876812        '''
    877         #TODO: show symmetry generated constraints - no clue how to do this.
     813        if name == 'Sym-Generated':         #show symmetry generated constraints
     814            Sizer1 =  wx.BoxSizer(wx.VERTICAL)
     815            Sizer1.Add(wx.StaticText(pageDisplay,wx.ID_ANY,
     816                                    'Equivalences generated based on cell/space group input'))
     817            Sizer1.Add((-1,5))
     818            Sizer = wx.FlexGridSizer(0,2,0,0)
     819            Sizer1.Add(Sizer)
     820            for sym in G2mv.GetSymEquiv():
     821                Sizer.Add(wx.StaticText(pageDisplay,wx.ID_ANY,'EQUIV'),
     822                           0,wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER|wx.RIGHT|wx.LEFT,3)
     823                Sizer.Add(wx.StaticText(pageDisplay,wx.ID_ANY,sym))
     824                Sizer.Add((-1,-1))
     825                Sizer.Add((-1,2))
     826            return Sizer1
    878827        constSizer = wx.FlexGridSizer(0,6,0,0)
    879         maxlen = 70 # characters before wrapping a constraint
     828        maxlen = 50 # characters before wrapping a constraint
    880829        for Id,item in enumerate(data[name]):
    881830            refineflag = False
    882831            helptext = ""
    883832            eqString = ['',]
     833            problemItem = False
     834            for term in item[:-3]:
     835                if str(term[1]) in G2mv.problemVars:
     836                    problemItem = True
    884837            if item[-1] == 'h': # Hold on variable
    885838                constSizer.Add((-1,-1),0)              # blank space for edit button
     
    890843                helptext = "Prevents variable:\n"+ var + " ("+ varMean + ")\nfrom being changed"
    891844            elif isinstance(item[-1],str): # not true on original-style (2011?) constraints
    892                 constEdit = wx.Button(pageDisplay,-1,'Edit',style=wx.BU_EXACTFIT)
     845                constEdit = wx.Button(pageDisplay,wx.ID_ANY,'Edit',style=wx.BU_EXACTFIT)
    893846                constEdit.Bind(wx.EVT_BUTTON,OnConstEdit)
    894847                constSizer.Add(constEdit,0,wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER,1)            # edit button
     
    966919                data[name] = []
    967920                return constSizer
    968             constDel = wx.Button(pageDisplay,-1,'Delete',style=wx.BU_EXACTFIT)
     921            constDel = wx.Button(pageDisplay,wx.ID_ANY,'Delete',style=wx.BU_EXACTFIT)
    969922            constDel.Bind(wx.EVT_BUTTON,OnConstDel)
    970923            Indx[constDel.GetId()] = [Id,name]
     
    980933            else:
    981934                constSizer.Add((-1,-1))               
    982             constSizer.Add(wx.StaticText(pageDisplay,-1,typeString),
     935            constSizer.Add(wx.StaticText(pageDisplay,wx.ID_ANY,typeString),
    983936                           0,wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER|wx.RIGHT|wx.LEFT,3)
     937            if problemItem: eqString[-1] += ' -- Conflict: see console'
    984938            if len(eqString) > 1:
    985939                Eq = wx.BoxSizer(wx.VERTICAL)
    986940                for s in eqString:
    987                     Eq.Add(wx.StaticText(pageDisplay,-1,s),0,wx.ALIGN_CENTER_VERTICAL)
     941                    line = wx.StaticText(pageDisplay,wx.ID_ANY,s)
     942                    if problemItem: line.SetBackgroundColour(wx.YELLOW)
     943                    Eq.Add(line,0,wx.ALIGN_CENTER_VERTICAL)
     944                Eq.Add((-1,4))
    988945            else:
    989                 Eq = wx.StaticText(pageDisplay,-1,eqString[0])
     946                Eq = wx.StaticText(pageDisplay,wx.ID_ANY,eqString[0])
     947                if problemItem: Eq.SetBackgroundColour(wx.YELLOW)
    990948            constSizer.Add(Eq,1,wx.ALIGN_CENTER_VERTICAL)
    991949        return constSizer
     
    11041062            G2frame.Page = [page,'glb']
    11051063            UpdateConstraintPanel(GlobalConstr,'Global')
     1064        else:
     1065            G2frame.Page = [page,'sym']
     1066            UpdateConstraintPanel(SymConstr,'Sym-Generated')           
     1067        G2frame.dataWindow.SetDataSize()
    11061068
    11071069    def RaisePage(event):
     
    11501112    GlobalConstr = wx.ScrolledWindow(G2frame.constr)
    11511113    G2frame.constr.AddPage(GlobalConstr,'Global')
     1114    SymConstr = wx.ScrolledWindow(G2frame.constr)
     1115    G2frame.constr.AddPage(SymConstr,'Sym-Generated')
    11521116    wx.CallAfter(OnPageChanged,None)
    11531117    G2frame.constr.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, OnPageChanged)
     
    11581122        allcons += data[key]
    11591123    if not len(allcons): return
     1124    #reload(G2mv) # TODO: for testing
    11601125    G2mv.InitVars()   
    11611126    constDictList,fixedList,ignored = G2stIO.ProcessConstraints(allcons)
     1127    # generate symmetry constraints to check for conflicts
     1128    rigidbodyDict = G2frame.GPXtree.GetItemPyData(   
     1129            G2gd.GetGPXtreeItemId(G2frame,G2frame.root,'Rigid bodies'))
     1130    rbIds = rigidbodyDict.get('RBIds',{'Vector':[],'Residue':[]})
     1131    rbVary,rbDict = G2stIO.GetRigidBodyModels(rigidbodyDict,Print=False)
     1132    Natoms,atomIndx,phaseVary,phaseDict,pawleyLookup,FFtables,BLtables,MFtables,maxSSwave = G2stIO.GetPhaseData(
     1133        Phases,RestraintDict=None,rbIds=rbIds,Print=False) # generates atom symmetry constraints
    11621134    errmsg, warnmsg = G2mv.CheckConstraints('',constDictList,fixedList)
    11631135    if errmsg:
    1164         G2frame.ErrorDialog('Constraint Error','Error in constraints:\n'+errmsg,
    1165             parent=G2frame)
     1136        G2frame.ErrorDialog('Constraint Error',
     1137                            'Error in constraints:\n'+errmsg+'\nCheck console output for more information',
     1138                            parent=G2frame)
     1139        print errmsg
     1140        print G2mv.VarRemapShow([],True)
    11661141    elif warnmsg:
    11671142        print 'Unexpected contraint warning:\n',warnmsg
     
    13911366    def AddVectorRB(event):
    13921367        AtInfo = data['Vector']['AtInfo']
    1393         dlg = MultiIntegerDialog(G2frame,'New Rigid Body',['No. atoms','No. translations'],[1,1])
     1368        dlg = G2G.MultiIntegerDialog(G2frame,'New Rigid Body',['No. atoms','No. translations'],[1,1])
    13941369        if dlg.ShowModal() == wx.ID_OK:
    13951370            nAtoms,nTrans = dlg.GetValues()
  • trunk/GSASIIctrlGUI.py

    r3049 r3056  
    25812581    sizer.Fit(dlg)
    25822582    dlg.ShowModal()
     2583
     2584################################################################################
     2585class MultiIntegerDialog(wx.Dialog):
     2586    '''Input a series of integers based on prompts
     2587    '''
     2588    def __init__(self,parent,title,prompts,values):
     2589        wx.Dialog.__init__(self,parent,-1,title,
     2590            pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
     2591        self.panel = wx.Panel(self)         #just a dummy - gets destroyed in Draw!
     2592        self.values = values
     2593        self.prompts = prompts
     2594        self.Draw()
     2595       
     2596    def Draw(self):
     2597       
     2598        def OnValItem(event):
     2599            event.Skip()
     2600            Obj = event.GetEventObject()
     2601            ind = Indx[Obj.GetId()]
     2602            try:
     2603                val = int(Obj.GetValue())
     2604                if val <= 0:
     2605                    raise ValueError
     2606            except ValueError:
     2607                val = self.values[ind]
     2608            self.values[ind] = val
     2609            Obj.SetValue('%d'%(val))
     2610           
     2611        self.panel.Destroy()
     2612        self.panel = wx.Panel(self)
     2613        mainSizer = wx.BoxSizer(wx.VERTICAL)
     2614        Indx = {}
     2615        for ival,[prompt,value] in enumerate(zip(self.prompts,self.values)):
     2616            mainSizer.Add(wx.StaticText(self.panel,-1,prompt),0,wx.ALIGN_CENTER)
     2617            valItem = wx.TextCtrl(self.panel,-1,value='%d'%(value),style=wx.TE_PROCESS_ENTER)
     2618            mainSizer.Add(valItem,0,wx.ALIGN_CENTER)
     2619            Indx[valItem.GetId()] = ival
     2620            valItem.Bind(wx.EVT_TEXT_ENTER,OnValItem)
     2621            valItem.Bind(wx.EVT_KILL_FOCUS,OnValItem)
     2622        OkBtn = wx.Button(self.panel,-1,"Ok")
     2623        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
     2624        CancelBtn = wx.Button(self.panel,-1,'Cancel')
     2625        CancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
     2626        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     2627        btnSizer.Add((20,20),1)
     2628        btnSizer.Add(OkBtn)
     2629        btnSizer.Add(CancelBtn)
     2630        btnSizer.Add((20,20),1)
     2631        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
     2632        self.panel.SetSizer(mainSizer)
     2633        self.panel.Fit()
     2634        self.Fit()
     2635
     2636    def GetValues(self):
     2637        return self.values
     2638       
     2639    def OnOk(self,event):
     2640        parent = self.GetParent()
     2641        parent.Raise()
     2642        self.EndModal(wx.ID_OK)             
     2643       
     2644    def OnCancel(self,event):
     2645        parent = self.GetParent()
     2646        parent.Raise()
     2647        self.EndModal(wx.ID_CANCEL)
    25832648
    25842649################################################################################
  • trunk/GSASIImapvars.py

    r3046 r3056  
    202202     to parameter equations.  The dict key is an ascii string, but the
    203203     dict value is a float.  Unlikely to be used externally.
     204
     205symGenList:
     206     a list of boolean values that will be True to indicate that a constraint
     207     (only equivalences) is generated by symmetry (or Pawley overlap)
     208     
     209problemVars:
     210     a list containing variables that show up in constraints producing errors
    204211
    205212*Routines*
     
    227234fixedVarList = [] # List of variables that should not be refined
    228235symGenList = [] # Flag if constraint is generated by symmetry
     236problemVars = [] # variables causing errors
    229237
    230238# prefix for parameter names
     
    329337    errmsg = ''
    330338    warnmsg = ''
     339    global problemVars
     340    problemVars = []
    331341    fixVlist = []
    332342    # process fixed variables (holds)
     
    358368                    if v in indepVarList:
    359369                        errmsg += '\nVariable '+v+' is used to set values in a constraint before its value is set in another constraint\n'
     370                        if v not in problemVars: problemVars.append(v)
    360371                    if m == 0: zeromult = True
    361372                    if v in varyList:
     
    389400        s = ''
    390401        for var in sorted(set(multdepVarList)):
     402            if v not in problemVars: problemVars.append(v)
    391403            if s != "": s+= ", "
    392404            s += str(var)           
     
    399411        s = ''
    400412        for var in sorted(inboth):
     413            if var not in problemVars: problemVars.append(var)
    401414            if s != "": s+= ", "
    402415            s += str(var)
     
    422435                if var in fixVlist:
    423436                    errmsg += '\nParameter '+var+" is Fixed and used in a constraint:\n\t"
     437                    if var not in problemVars: problemVars.append(var)
    424438                    errmsg += _FormatConstraint(constrDict[rel],fixedList[rel])+"\n"
    425439            if varied > 0 and varied != len(VarKeys(constrDict[rel])):
     
    921935        for v in fixedVarList:
    922936            s += '    ' + v + '\n'
    923     s += 'Variable mapping relations:\n'
     937    s += 'User-supplied variable mapping relations:\n'
    924938    symout = ''
    925939    global dependentParmList,arrayList,invarrayList,indParmList,fixedDict,symGenList
     
    929943        for i,mv in enumerate(mapvars):
    930944            if multarr is None:
    931                 s1 = '  ' + str(mv) + ' is equivalent to parameter(s): '
     945#                s1 = '  ' + str(mv) + ' is equivalent to parameter(s): '
     946                if len(varlist) == 1:
     947                    s1 = '   ' + str(mv) + ' is equivalent to '
     948                else:
     949                    s1 = '   ' + str(mv) + ' is equivalent to parameters: '
    932950                j = 0
    933951                for v,m in zip(varlist,invmultarr):
     
    968986            s += '\n'
    969987    return s
     988
     989def GetSymEquiv():
     990    '''Return the automatically generated (equivalence) relationships.
     991
     992    :returns: a list of strings containing the details of the contraint relationships
     993    '''
     994    symout = []
     995    global dependentParmList,arrayList,invarrayList,indParmList,fixedDict,symGenList
     996
     997    for varlist,mapvars,multarr,invmultarr,symFlag in zip(
     998        dependentParmList,indParmList,arrayList,invarrayList,symGenList):
     999        for i,mv in enumerate(mapvars):
     1000            if not symFlag: continue
     1001            if multarr is None:
     1002                s1 = str(mv) + ' = '
     1003                j = 0
     1004                for v,m in zip(varlist,invmultarr):
     1005                    if debug: print 'v,m[0]: ',v,m[0]
     1006                    if len(s1.split('\n')[-1]) > 75: s1 += '\n        '
     1007                    if j > 0: s1 += ' =  '
     1008                    j += 1
     1009                    s1 += str(v)
     1010                    if m != 1:
     1011                        s1 += " / " + str(m[0])
     1012                    symout.append(s1)
     1013                continue
     1014            else:
     1015                s = '  %s = ' % mv
     1016                j = 0
     1017                for m,v in zip(multarr[i,:],varlist):
     1018                    if m == 0: continue
     1019                    if j > 0: s += ' + '
     1020                    j += 1
     1021                    s += '(%s * %s)' % (m,v)
     1022                print 'unexpected sym op=',s
     1023    return symout
    9701024
    9711025def Dict2Deriv(varyList,derivDict,dMdv):
Note: See TracChangeset for help on using the changeset viewer.