Ignore:
Timestamp:
Apr 24, 2020 11:06:35 AM (3 years ago)
Author:
toby
Message:

do much more cleanup after phase delete; refactor some importer imports to avoid G2IO

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIdataGUI.py

    r4406 r4410  
    14891489            for i in range(1,1+ibanks):
    14901490                choices.append('Bank '+str(i))
    1491             bank = 1 + G2IO.BlockSelector(
     1491            bank = 1 + G2G.BlockSelector(
    14921492                choices, self,
    14931493                title=u'Select an instrument parameter bank for '+
     
    15381538                for l in dI.defaultIparm_lbl:
    15391539                    choices.append('Defaults for '+l)
    1540                 res = G2IO.BlockSelector(choices,ParentFrame=self,title=head,
     1540                res = G2G.BlockSelector(choices,ParentFrame=self,title=head,
    15411541                    header='Select default inst parms',useCancel=True)
    15421542                if res is None: return None
     
    37933793       
    37943794    def OnDeletePhase(self,event):
    3795         'Delete a phase from the tree. Called by Data/Delete Phase menu'
    3796         #Hmm, also need to delete this phase from Reflection Lists for each PWDR histogram
     3795        '''Delete one or more phases from the tree. Called by Data/Delete Phase menu.
     3796        Also delete this phase from Reflection Lists for each PWDR histogram;
     3797        removes the phase from restraints and deletes any constraints
     3798        with variables from the phase.
     3799        If any deleted phase is marked as Used in a histogram, a more rigorous
     3800        "deep clean" is done and histogram refinement results are cleared, as well as
     3801        the covariance information and all plots are deleted
     3802        '''
     3803        selItem = self.GPXtree.GetSelection()
    37973804        if self.dataWindow:
    37983805            self.dataWindow.ClearData()
     
    38003807        DelList = []
    38013808        DelItemList = []
     3809        consDeleted = 0
     3810        usedPhase = False
    38023811        if GetGPXtreeItemId(self,self.root,'Phases'):
    38033812            sub = GetGPXtreeItemId(self,self.root,'Phases')
     
    38083817        else:
    38093818            subr = 0
    3810         if sub:
    3811             item, cookie = self.GPXtree.GetFirstChild(sub)
    3812             while item:
    3813                 TextList.append(self.GPXtree.GetItemText(item))
    3814                 item, cookie = self.GPXtree.GetNextChild(sub, cookie)               
    3815             dlg = wx.MultiChoiceDialog(self, 'Which phase to delete?', 'Delete phase', TextList, wx.CHOICEDLG_STYLE)
    3816             try:
    3817                 if dlg.ShowModal() == wx.ID_OK:
    3818                     result = dlg.GetSelections()
    3819                     for i in result: DelList.append([i,TextList[i]])
    3820                     item, cookie = self.GPXtree.GetFirstChild(sub)
    3821                     i = 0
    3822                     while item:
    3823                         if [i,self.GPXtree.GetItemText(item)] in DelList: DelItemList.append(item)
    3824                         item, cookie = self.GPXtree.GetNextChild(sub, cookie)
    3825                         i += 1
    3826                     for item in DelItemList:
    3827                         name = self.GPXtree.GetItemText(item)
    3828                         self.GPXtree.Delete(item)
    3829                         self.G2plotNB.Delete(name)
    3830                     item, cookie = self.GPXtree.GetFirstChild(self.root)
    3831                     while item:
    3832                         name = self.GPXtree.GetItemText(item)
    3833                         if 'PWDR' in name:
    3834                             Id = GetGPXtreeItemId(self,item, 'Reflection Lists')
    3835                             refList = self.GPXtree.GetItemPyData(Id)
    3836                             if len(refList):
    3837                                 for i,item in DelList:
    3838                                     if item in refList:
    3839                                         del(refList[item])
    3840                         elif 'HKLF' in name:
    3841                             data = self.GPXtree.GetItemPyData(item)
    3842                             data[0] = {}
    3843                            
    3844                         item, cookie = self.GPXtree.GetNextChild(self.root, cookie)
    3845             finally:
    3846                 dlg.Destroy()
     3819        if GetGPXtreeItemId(self,self.root,'Constraints'):
     3820            id = GetGPXtreeItemId(self,self.root,'Constraints')
     3821            constr = self.GPXtree.GetItemPyData(id)
     3822        else:
     3823            constr = {}
     3824           
     3825        item, cookie = self.GPXtree.GetFirstChild(sub)
     3826        while item:
     3827            TextList.append(self.GPXtree.GetItemText(item))
     3828            item, cookie = self.GPXtree.GetNextChild(sub, cookie)               
     3829        dlg = wx.MultiChoiceDialog(self, 'Which phase to delete?', 'Delete phase', TextList, wx.CHOICEDLG_STYLE)
     3830        try:
     3831            if dlg.ShowModal() == wx.ID_OK:
     3832                result = dlg.GetSelections()
     3833                for i in result: DelList.append([i,TextList[i]])
     3834                item, cookie = self.GPXtree.GetFirstChild(sub)
     3835                i = 0
     3836                while item:
     3837                    if [i,self.GPXtree.GetItemText(item)] in DelList: DelItemList.append(item)
     3838                    item, cookie = self.GPXtree.GetNextChild(sub, cookie)
     3839                    i += 1
     3840                for item in DelItemList:
     3841                    phase = self.GPXtree.GetItemPyData(item)
     3842                    for h in phase['Histograms']:
     3843                        if 'Use' not in phase['Histograms'][h]: continue
     3844                        if phase['Histograms'][h]['Use']:
     3845                            usedPhase = True
     3846                            break
     3847                    if 'pId' in phase:
     3848                        p = phase['pId']
     3849                    else:
     3850                        p = '?'
     3851                    self.GPXtree.Delete(item)
     3852                    if item == selItem: selItem = self.root
     3853                    # look for constraints to remove
     3854                    for key in constr:
     3855                        delThis = []
     3856                        if key.startswith('_'): continue
     3857                        for i,cons in enumerate(constr[key]):
     3858                            for var in cons[0:-3]:
     3859                                if str(var[1]).startswith(str(p)):
     3860                                    delThis.append(i)
     3861                                    break
     3862                        for i in reversed(delThis):
     3863                            consDeleted += 1
     3864                            del constr[key][i]
     3865                # delete refinement results from histograms
     3866                item, cookie = self.GPXtree.GetFirstChild(self.root)
     3867                while item:
     3868                    name = self.GPXtree.GetItemText(item)
     3869                    if 'PWDR' in name:
     3870                        data = self.GPXtree.GetItemPyData(item)
     3871                        if usedPhase: # remove r-factors
     3872                            dellist = [value for value in data[0] if ':' in value]
     3873                            for v in dellist+['Durbin-Watson', 'R', 'wR', 'Rb',
     3874                                                  'wRb', 'wRmin','Nobs']:
     3875                                if v in data[0]: del data[0][v]
     3876                            # could wipe out computed & difference patterns, but does not work
     3877                            #data[1][3] = np.zeros_like(data[1][3])
     3878                            #data[1][5] = np.zeros_like(data[1][5])
     3879                        # always get rid of reflection lists
     3880                        Id = GetGPXtreeItemId(self,item, 'Reflection Lists')
     3881                        refList = self.GPXtree.GetItemPyData(Id)
     3882                        if len(refList):
     3883                            for i,item in DelList:
     3884                                if item in refList:
     3885                                    del(refList[item])
     3886                    elif 'HKLF' in name and usedPhase: # probably not needed if phase is not used
     3887                        data = self.GPXtree.GetItemPyData(item)
     3888                        data[0] = {}
     3889
     3890                    item, cookie = self.GPXtree.GetNextChild(self.root, cookie)
     3891        finally:
     3892            dlg.Destroy()
     3893        if usedPhase: # clear info from last refinement for "deep clean" if a used phase is deleted
     3894            id = GetGPXtreeItemId(self,self.root,'Covariance')
     3895            if DelItemList and id:
     3896                self.GPXtree.SetItemPyData(id,{})
     3897            id = GetGPXtreeItemId(self,self.root,'Sequential results')
     3898            if DelItemList and id:
     3899                self.GPXtree.Delete(id)
     3900                if id == selItem: selItem = self.root
     3901            # delete all plots
     3902            for lbl in self.G2plotNB.plotList:
     3903                self.G2plotNB.Delete(lbl)
    38473904        if subr:        #remove restraints for deleted phase
    38483905            DelList = [itm[1] for itm in DelList]
     
    38523909                if name in DelList:
    38533910                    self.GPXtree.Delete(item)
    3854                 item, cookie = self.GPXtree.GetNextChild(subr, cookie)               
    3855                
     3911                    if item == selItem: selItem = self.root
     3912                item, cookie = self.GPXtree.GetNextChild(subr, cookie)
     3913        # force redisplay of current tree item if it was not deleted
     3914        self.PickIdText = None
     3915        SelectDataTreeItem(self,selItem)
     3916        wx.CallAfter(self.GPXtree.SelectItem,selItem)
     3917        if consDeleted:
     3918            print('\n',consDeleted,'constraints were deleted')
     3919       
    38563920    def OnRenameData(self,event):
    38573921        'Renames an existing phase. Called by Data/Rename Phase menu'
Note: See TracChangeset for help on using the changeset viewer.