Changeset 4822


Ignore:
Timestamp:
Feb 20, 2021 9:43:32 AM (8 months ago)
Author:
toby
Message:

Warn if param limits on constrained vars

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r4812 r4822  
    353353        return self.data
    354354       
    355 ################################################################################
    356 #####  Constraints
    357 ################################################################################           
     355#####  Constraints ################################################################################           
    358356def UpdateConstraints(G2frame,data):
    359357    '''Called when Constraints tree item is selected.
     
    655653        return constDictList,phaseDict,fixedList
    656654           
    657     def ConstraintsCheck(data,newcons=[]):
     655    def ConstraintsCheck(data,newcons=[],reqVaryList=None):
    658656        '''Load constraints & check them for errors. Since error checking
    659657        can cause changes in constraints in case of repairable conflicts
     
    661659        This could probably be done more effectively, but only reloading when
    662660        needed, but the reload should be quick.
     661       
     662        When reqVaryList is included (see WarnConstraintLimit) then
     663        parameters with limits are checked against constraints and a
     664        warning is shown.
    663665        '''
    664666        constDictList,phaseDict,fixedList = ConstraintsLoad(data,newcons)
     
    669671        # reload constraints in case any were merged in MoveConfEquiv
    670672        ConstraintsLoad(data,newcons)
     673        impossible = []
     674        if reqVaryList:
     675            Controls = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,G2frame.root, 'Controls'))
     676            for key in ('parmMinDict','parmMaxDict','parmFrozen'):
     677                if key not in Controls: Controls[key] = {}
     678            varyList = reqVaryList[:]
     679            try:
     680                G2mv.GenerateConstraints(varyList,constDictList,fixedList,phaseDict)
     681                G2mv.Map2Dict(phaseDict,varyList)
     682                # check for limits on dependent vars
     683                consVars = [i for i in reqVaryList if i not in varyList]
     684                impossible = set(
     685                    [str(i) for i in Controls['parmMinDict'] if i in consVars] +
     686                    [str(i) for i in Controls['parmMaxDict'] if i in consVars])
     687            except G2mv.ConstraintException:
     688                pass
     689        if impossible:
     690            msg = ''
     691            for i in sorted(impossible):
     692                if msg: msg += ', '
     693                msg += i
     694            msg =  ' &'.join(msg.rsplit(',',1))
     695            msg = ('Note: limits on variable(s) '+msg+
     696            ' will be ignored because they are constrained.')
     697            G2G.G2MessageBox(G2frame,msg,'Limits ignored for constrained vars')
    671698        return res
    672699
     
    695722            print ('Unexpected contraint warning:\n'+warnmsg)
    696723        return True
     724
     725    def WarnConstraintLimit():
     726        '''Check if constraints reference variables with limits.
     727        Displays a warning message, but does nothing
     728        '''
     729       
     730        try:
     731            parmDict,reqVaryList = G2frame.MakeLSParmDict()
     732            errmsg,warnmsg = ConstraintsCheck(data,[],reqVaryList)
     733        except:
     734            print('Error retrieving parameters')           
     735
    697736
    698737    def CheckChangedConstraint():
     
    884923                    data[constrDictEnt] += newcons
    885924        dlg.Destroy()
     925        WarnConstraintLimit()
    886926        wx.CallAfter(OnPageChanged,None)
    887927                       
     
    9831023                if CheckAddedConstraint(newcons):
    9841024                    data[constrDictEnt] += newcons
     1025        WarnConstraintLimit()
    9851026        wx.CallAfter(OnPageChanged,None)
    9861027                       
     
    13061347    def SetStatusLine(text):
    13071348        G2frame.GetStatusBar().SetStatusText(text,1)
    1308 
    1309     # UpdateConstraints execution starts here
     1349       
     1350    def OnShowISODISTORT(event):
     1351        ShowIsoDistortCalc(G2frame)
     1352
     1353    #### UpdateConstraints execution starts here ##############################
    13101354    if not data:
    13111355        data.update({'Hist':[],'HAP':[],'Phase':[],'Global':[]})       #empty dict - fill it
    13121356    if 'Global' not in data:                                            #patch
    13131357        data['Global'] = []
    1314     # DEBUG code ########################################
     1358    # DEBUG code #=====================================
    13151359    #import GSASIIconstrGUI
    13161360    #reload(GSASIIconstrGUI)
     
    13211365    #reload(G2mv)
    13221366    #reload(G2gd)
    1323     ###################################################
     1367    #===================================================
    13241368    Histograms,Phases = G2frame.GetUsedHistogramsAndPhasesfromTree()
    13251369    if not len(Phases) or not len(Histograms):
     
    13351379            G2frame.dataWindow.ConstraintEdit.Enable(G2G.wxID_SHOWISO,True)
    13361380            break
    1337     ##################################################################################
    1338     # patch: convert old-style (str) variables in constraints to G2VarObj objects
     1381    ###### patch: convert old-style (str) variables in constraints to G2VarObj objects #####
    13391382    for key,value in data.items():
    13401383        if key.startswith('_'): continue
     
    13481391        if j:
    13491392            print (str(key) + ': '+str(j)+' variable(s) as strings converted to objects')
    1350     ##################################################################################
     1393    ##### end patch #############################################################################
    13511394    rigidbodyDict = G2frame.GPXtree.GetItemPyData(
    13521395        G2gd.GetGPXtreeItemId(G2frame,G2frame.root,'Rigid bodies'))
     
    14261469    G2frame.Bind(wx.EVT_MENU, OnAddAtomEquiv, id=G2G.wxID_EQUIVALANCEATOMS)
    14271470#    G2frame.Bind(wx.EVT_MENU, OnAddRiding, id=G2G.wxID_ADDRIDING)
    1428     def OnShowISODISTORT(event):
    1429         ShowIsoDistortCalc(G2frame)
    14301471    G2frame.Bind(wx.EVT_MENU, OnShowISODISTORT, id=G2G.wxID_SHOWISO)
    14311472    # tab commands
     
    14621503        print (errmsg)
    14631504        print (G2mv.VarRemapShow([],True))
     1505        return
    14641506    elif warnmsg:
    14651507        print ('Unexpected contraint warning:\n'+warnmsg)
     1508    WarnConstraintLimit()
    14661509       
    1467 ################################################################################
    1468 # check scale & phase fractions, create constraint if needed
    1469 ################################################################################
     1510###### check scale & phase fractions, create constraint if needed #############
    14701511def CheckAllScalePhaseFractions(G2frame):
    14711512    '''Check if scale factor and all phase fractions are refined without a constraint
     
    15271568    Constraints['HAP'] += [constr]
    15281569       
    1529 ################################################################################
    1530 #### Make nuclear/magnetic phase transition constraints - called by OnTransform in G2phsGUI
    1531 ################################################################################       
    1532        
     1570#### Make nuclear/magnetic phase transition constraints - called by OnTransform in G2phsGUI ##########
    15331571def TransConstraints(G2frame,oldPhase,newPhase,Trans,Vec,atCodes):
    15341572    '''Add constraints for new magnetic phase created via transformation of old
     
    17521790            constraints['HAP'].append([IndpCon,DepCons,None,None,'e'])
    17531791       
    1754 ################################################################################
    1755 #### Rigid bodies
    1756 ################################################################################
     1792#### Rigid bodies #############################################################
    17571793resRBsel = None
    17581794def UpdateRigidBodies(G2frame,data):
     
    36483684        G2frame.GetStatusBar().SetStatusText(text,1)                                     
    36493685
    3650     #================== UpdateRigidBodies starts here =========
     3686    #### UpdateRigidBodies starts here =========
    36513687    global resList,resRBsel           
    36523688    if not data.get('RBIds') or not data:
  • trunk/GSASIIctrlGUI.py

    r4819 r4822  
    41534153        self.SetItemCount(0)
    41544154
    4155         self.attr1 = wx.ListItemAttr()
     4155        try:
     4156            self.attr1 = wx.ItemAttr()
     4157        except:
     4158            self.attr1 = wx.ListItemAttr() # deprecated in wx4.1
    41564159        self.attr1.SetBackgroundColour((255,255,150))
    41574160
     
    43214324        # draw min value widgets
    43224325        mainSizer.Add((-1,10),0)
    4323         n,val = G2obj.prmLookup(name,self.parmWin.Controls['parmMinDict']) # is this a wild-card?
    4324         if val is None:
    4325             addMbtn = wx.Button(dlg, wx.ID_ANY,'Add Lower limit')
    4326             addMbtn.Bind(wx.EVT_BUTTON, AddM)
    4327             mainSizer.Add(addMbtn,0)
    4328         else:
    4329             subSizer = wx.BoxSizer(wx.HORIZONTAL)
    4330             subSizer.Add(wx.StaticText(dlg,wx.ID_ANY,'Minimum limit'),0,wx.CENTER)
    4331             subSizer.Add(ValidatedTxtCtrl(dlg,self.parmWin.Controls['parmMinDict'],n,nDig=(10,2,'g')),0,WACV)
    4332             delMbtn = wx.Button(dlg, wx.ID_ANY,'Delete',style=wx.BU_EXACTFIT)
    4333             subSizer.Add((5,-1),0,WACV)
    4334             subSizer.Add(delMbtn,0,WACV)
    4335             delMbtn.Bind(wx.EVT_BUTTON, delM)
    4336             if name.split(':')[1]:             # is this using a histogram?
     4326        if name not in self.parmWin.varyList and name in self.parmWin.fullVaryList:
     4327            mainSizer.Add(wx.StaticText(dlg,wx.ID_ANY,'Limits not allowed on constrained variables'),0)
     4328            for key in 'parmMinDict','parmMaxDict':
     4329                d = self.parmWin.Controls[key]
     4330                n,v = G2obj.prmLookup(name,d)
     4331                if v is not None and str(n) == name:
     4332                    try:  # strange hard to reproduce problem with this not working
     4333                        del d[n]
     4334                    except:
     4335                        if GSASIIpath.GetConfigValue('debug'):
     4336                            print('debug: failed to delete ',name,'in',key)
     4337
     4338        else:
     4339            n,val = G2obj.prmLookup(name,self.parmWin.Controls['parmMinDict']) # is this a wild-card?
     4340            if val is None:
     4341                addMbtn = wx.Button(dlg, wx.ID_ANY,'Add Lower limit')
     4342                addMbtn.Bind(wx.EVT_BUTTON, AddM)
     4343                mainSizer.Add(addMbtn,0)
     4344            else:
     4345                subSizer = wx.BoxSizer(wx.HORIZONTAL)
     4346                subSizer.Add(wx.StaticText(dlg,wx.ID_ANY,'Minimum limit'),0,wx.CENTER)
     4347                subSizer.Add(ValidatedTxtCtrl(dlg,self.parmWin.Controls['parmMinDict'],n,nDig=(10,2,'g')),0,WACV)
     4348                delMbtn = wx.Button(dlg, wx.ID_ANY,'Delete',style=wx.BU_EXACTFIT)
    43374349                subSizer.Add((5,-1),0,WACV)
    4338                 wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all histograms ')
    4339                 wild.SetValue(str(n).split(':')[1] == '*')
    4340                 wild.Bind(wx.EVT_CHECKBOX,SetWild)
    4341                 wild.hist = True
    4342                 subSizer.Add(wild,0,WACV)
    4343             elif len(name.split(':')) > 3:
     4350                subSizer.Add(delMbtn,0,WACV)
     4351                delMbtn.Bind(wx.EVT_BUTTON, delM)
     4352                if name.split(':')[1]:             # is this using a histogram?
     4353                    subSizer.Add((5,-1),0,WACV)
     4354                    wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all histograms ')
     4355                    wild.SetValue(str(n).split(':')[1] == '*')
     4356                    wild.Bind(wx.EVT_CHECKBOX,SetWild)
     4357                    wild.hist = True
     4358                    subSizer.Add(wild,0,WACV)
     4359                elif len(name.split(':')) > 3:
     4360                    subSizer.Add((5,-1),0,WACV)
     4361                    wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all atoms ')
     4362                    wild.SetValue(str(n).split(':')[3] == '*')
     4363                    wild.Bind(wx.EVT_CHECKBOX,SetWild)
     4364                    subSizer.Add(wild,0,WACV)
     4365                mainSizer.Add(subSizer,0)
     4366            # draw max value widgets
     4367            mainSizer.Add((-1,10),0)
     4368            n,val = G2obj.prmLookup(name,self.parmWin.Controls['parmMaxDict']) # is this a wild-card?
     4369            if val is None:
     4370                addMbtn = wx.Button(dlg, wx.ID_ANY,'Add Upper limit')
     4371                addMbtn.Bind(wx.EVT_BUTTON, AddM)
     4372                addMbtn.max = True
     4373                mainSizer.Add(addMbtn,0)
     4374            else:
     4375                subSizer = wx.BoxSizer(wx.HORIZONTAL)
     4376                subSizer.Add(wx.StaticText(dlg,wx.ID_ANY,'Maximum limit'),0,wx.CENTER)
     4377                subSizer.Add(ValidatedTxtCtrl(dlg,self.parmWin.Controls['parmMaxDict'],n,nDig=(10,2,'g')),0,WACV)
     4378                delMbtn = wx.Button(dlg, wx.ID_ANY,'Delete',style=wx.BU_EXACTFIT)
    43444379                subSizer.Add((5,-1),0,WACV)
    4345                 wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all atoms ')
    4346                 wild.SetValue(str(n).split(':')[3] == '*')
    4347                 wild.Bind(wx.EVT_CHECKBOX,SetWild)
    4348                 subSizer.Add(wild,0,WACV)
    4349             mainSizer.Add(subSizer,0)
    4350         # draw max value widgets
    4351         mainSizer.Add((-1,10),0)
    4352         n,val = G2obj.prmLookup(name,self.parmWin.Controls['parmMaxDict']) # is this a wild-card?
    4353         if val is None:
    4354             addMbtn = wx.Button(dlg, wx.ID_ANY,'Add Upper limit')
    4355             addMbtn.Bind(wx.EVT_BUTTON, AddM)
    4356             addMbtn.max = True
    4357             mainSizer.Add(addMbtn,0)
    4358         else:
    4359             subSizer = wx.BoxSizer(wx.HORIZONTAL)
    4360             subSizer.Add(wx.StaticText(dlg,wx.ID_ANY,'Maximum limit'),0,wx.CENTER)
    4361             subSizer.Add(ValidatedTxtCtrl(dlg,self.parmWin.Controls['parmMaxDict'],n,nDig=(10,2,'g')),0,WACV)
    4362             delMbtn = wx.Button(dlg, wx.ID_ANY,'Delete',style=wx.BU_EXACTFIT)
    4363             subSizer.Add((5,-1),0,WACV)
    4364             subSizer.Add(delMbtn,0,WACV)
    4365             delMbtn.Bind(wx.EVT_BUTTON, delM)
    4366             delMbtn.max = True
    4367             if name.split(':')[1]:             # is this using a histogram?
    4368                 subSizer.Add((5,-1),0,WACV)
    4369                 wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all histograms ')
    4370                 wild.SetValue(str(n).split(':')[1] == '*')
    4371                 wild.Bind(wx.EVT_CHECKBOX,SetWild)
    4372                 wild.max = True
    4373                 wild.hist = True
    4374                 subSizer.Add(wild,0,WACV)
    4375             elif len(name.split(':')) > 3:
    4376                 subSizer.Add((5,-1),0,WACV)
    4377                 wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all atoms ')
    4378                 wild.SetValue(str(n).split(':')[3] == '*')
    4379                 wild.Bind(wx.EVT_CHECKBOX,SetWild)
    4380                 wild.max = True
    4381                 subSizer.Add(wild,0,WACV)
    4382             mainSizer.Add(subSizer,0)
     4380                subSizer.Add(delMbtn,0,WACV)
     4381                delMbtn.Bind(wx.EVT_BUTTON, delM)
     4382                delMbtn.max = True
     4383                if name.split(':')[1]:             # is this using a histogram?
     4384                    subSizer.Add((5,-1),0,WACV)
     4385                    wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all histograms ')
     4386                    wild.SetValue(str(n).split(':')[1] == '*')
     4387                    wild.Bind(wx.EVT_CHECKBOX,SetWild)
     4388                    wild.max = True
     4389                    wild.hist = True
     4390                    subSizer.Add(wild,0,WACV)
     4391                elif len(name.split(':')) > 3:
     4392                    subSizer.Add((5,-1),0,WACV)
     4393                    wild = wx.CheckBox(dlg,wx.ID_ANY,label='Match all atoms ')
     4394                    wild.SetValue(str(n).split(':')[3] == '*')
     4395                    wild.Bind(wx.EVT_CHECKBOX,SetWild)
     4396                    wild.max = True
     4397                    subSizer.Add(wild,0,WACV)
     4398                mainSizer.Add(subSizer,0)
    43834399           
    43844400        btnsizer = wx.StdDialogButtonSizer()
  • trunk/GSASIIdataGUI.py

    r4819 r4822  
    51175117            if key not in Controls: Controls[key] = {}
    51185118        wx.EndBusyCursor()
     5119        # check for limits on dependent vars
     5120        consVars = [i for i in reqVaryList if i not in varyList]
     5121        impossible = set(
     5122            [str(i) for i in Controls['parmMinDict'] if i in consVars] +
     5123            [str(i) for i in Controls['parmMaxDict'] if i in consVars])
     5124        if impossible:
     5125            msg = ''
     5126            for i in sorted(impossible):
     5127                if msg: msg += ', '
     5128                msg += i
     5129            msg =  ' &'.join(msg.rsplit(',',1))
     5130            msg = ('Note: limits on variable(s) '+msg+
     5131            ' will be ignored because they are constrained.')
     5132            G2G.G2MessageBox(self,msg,'Limits ignored for constrained vars')
    51195133        # debug stuff
    51205134        #if GSASIIpath.GetConfigValue('debug'):
     
    51225136        #    import imp
    51235137        #    imp.reload(G2G)
    5124         # end debug stuff           
     5138        # end debug stuff   
    51255139        dlg = G2G.ShowLSParms(self,'Least Squares Parameters',parmValDict,
    51265140                    varyList,reqVaryList,Controls)
     5141        dlg.CenterOnParent()
    51275142        dlg.ShowModal()
    51285143        dlg.Destroy()
Note: See TracChangeset for help on using the changeset viewer.