Ignore:
Timestamp:
Oct 20, 2022 9:56:41 PM (8 months ago)
Author:
toby
Message:

add ability to merge chem and magnetic phases in a quick CIF

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/exports/G2export_CIF.py

    r5232 r5352  
    3232import copy
    3333import re
     34interactive = False
    3435try:
    3536    import wx
    3637    import wx.lib.scrolledpanel as wxscroll
    3738    import wx.lib.resizewidget as rw
     39    interactive = True
    3840except ImportError:
    3941    # Avoid wx dependency for CLI
     
    5961import GSASIIstrMain as G2stMn
    6062import GSASIIstrIO as G2stIO       
    61 import GSASIImapvars as G2mv
     63#import GSASIImapvars as G2mv
    6264import GSASIIElem as G2el
    6365import GSASIIpy3 as G2py3
     
    32203222            WriteCIFitem(self.fp, '\n# STRUCTURE FACTOR TABLE')
    32213223            # compute maximum intensity reflection
    3222             Imax = 0
     3224            #Imax = 0
    32233225            phaselist = []
    32243226            for phasenam in histblk['Reflection Lists']:
    3225                 try:
    3226                     scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0]
    3227                 except KeyError: # reflection table from removed phase?
    3228                     continue
     3227                #try:
     3228                #    scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0]
     3229                #except KeyError: # reflection table from removed phase?
     3230                #    continue
    32293231                phaselist.append(phasenam)
    3230                 refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList'])
    3231                 I100 = scale*refList.T[8]*refList.T[11]
     3232                #refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList'])
     3233                #I100 = scale*refList.T[8]*refList.T[11]
    32323234                #Icorr = np.array([refl[13] for refl in histblk['Reflection Lists'][phasenam]])[0]
    32333235                #FO2 = np.array([refl[8] for refl in histblk['Reflection Lists'][phasenam]])
     
    32613263            dmin = None
    32623264            for phasenam in phaselist:
    3263                 scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0]
     3265                #scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0]
    32643266                phaseid = self.Phases[phasenam]['pId']
    32653267                refcount += len(histblk['Reflection Lists'][phasenam]['RefList'])
    3266                 refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList'])
    3267                 I100 = scale*refList.T[8]*refList.T[11]
     3268                #refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList'])
     3269                #I100 = scale*refList.T[8]*refList.T[11]
    32683270                for j,ref in enumerate(histblk['Reflection Lists'][phasenam]['RefList']):
    32693271                    if DEBUG:
     
    45774579        self.author = ''
    45784580
     4581    def mergeMag(self,G2frame,ChemPhase,MagPhase):
     4582        if not interactive: return   # if wx is not loaded then merge is not an option
     4583        dlg = wx.MessageDialog(self.G2frame,'Do you want to merge chemical and magentic phases?',
     4584            'Confirm phase merge',wx.YES|wx.NO)
     4585        try:
     4586            dlg.CenterOnParent()
     4587            result = dlg.ShowModal()
     4588        finally:
     4589            dlg.Destroy()
     4590        if result != wx.ID_YES: return
     4591        dlg = wx.Dialog(G2frame,wx.ID_ANY,'Merge criteria',
     4592            pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
     4593        dlg.CenterOnParent()
     4594        import imp
     4595        imp.reload(G2G)
     4596        def onChange(*args,**kwargs):
     4597            #wx.CallAfter(showMergeMag)
     4598            wx.CallLater(100,showMergeMag)
     4599        def showMergeMag():
     4600            if dlg.GetSizer():
     4601                mainSizer = dlg.GetSizer()
     4602                mainSizer.Clear(True)
     4603            else:
     4604                mainSizer = wx.BoxSizer(wx.VERTICAL)
     4605                dlg.SetSizer(mainSizer)
     4606            mainSizer.Add(wx.StaticText(dlg,label=' Define transformation'),
     4607                              0,wx.ALIGN_CENTER)
     4608            mainSizer.Add(G2G.XformMatrix(dlg,Trans,Uvec,Vvec,OnLeave=onChange))
     4609            newCell = G2lat.TransformCell(self.Phases[ChemPhase]['General']['Cell'][1:7],Trans)
     4610            cellSizer = wx.GridBagSizer()
     4611            G2G.showUniqueCell(dlg,cellSizer,0,
     4612                                   self.Phases[ChemPhase]['General']['Cell'][1:],
     4613                                   self.Phases[ChemPhase]['General']['SGData'])
     4614            cellSizer.Add(wx.StaticText(dlg,label=' Chem cell '),(0,0))
     4615            G2G.showUniqueCell(dlg,cellSizer,1,
     4616                                   self.Phases[MagPhase]['General']['Cell'][1:],
     4617                                   self.Phases[MagPhase]['General']['SGData'])
     4618            cellSizer.Add(wx.StaticText(dlg,label=' Mag cell '),(1,0))
     4619            G2G.showUniqueCell(dlg,cellSizer,2,newCell)
     4620            cellSizer.Add(wx.StaticText(dlg,label=' Xform cell '),(2,0))
     4621            mainSizer.Add(cellSizer)
     4622            cellsSame = True
     4623            diff = 0.01
     4624            for i in range(6):
     4625                if i == 3: diff = 0.1
     4626                if abs(self.Phases[MagPhase]['General']['Cell'][i+1]-newCell[i]) > diff:
     4627                    cellsSame = False
     4628                    break
     4629                   
     4630            if cellsSame:
     4631                tmpPhase['Atoms'] = copy.deepcopy(self.Phases[ChemPhase]['Atoms'])
     4632                _,atCodes = G2lat.TransformPhase(self.Phases[ChemPhase],
     4633                                                        tmpPhase,Trans,Uvec,Vvec,False) # xforms atoms not cell
     4634                mainSizer.Add((0,15))
     4635                atomSizer = wx.BoxSizer(wx.HORIZONTAL)
     4636
     4637                atomSubSizer = wx.BoxSizer(wx.VERTICAL)
     4638                atomSubSizer.Add(wx.StaticText(dlg,label='Magnetic phase contents'))
     4639                G2G.HorizontalLine(atomSubSizer,dlg)
     4640                atompnl = wxscroll.ScrolledPanel(dlg,size=(250,250))
     4641                atomBox = wx.FlexGridSizer(0, 4, 2, 2)  # rows, cols, vgap, hgap
     4642                for atom in self.Phases[MagPhase]['Atoms']:
     4643                    atomBox.Add(wx.StaticText(atompnl,label=atom[ctM-1]))
     4644                    for x in atom[cxM:cxM+3]:
     4645                        atomBox.Add(wx.StaticText(atompnl,label='{:.3f}'.format(x)))
     4646                atompnl.SetSizer(atomBox)
     4647                atompnl.SetAutoLayout(1)
     4648                atompnl.SetupScrolling()
     4649                atompnl.Layout()
     4650                atomSubSizer.Add(atompnl)
     4651                atomSizer.Add(atomSubSizer)
     4652               
     4653                cellsSame = False  # at least one atom must match
     4654                atomSubSizer = wx.BoxSizer(wx.VERTICAL)
     4655                atomSubSizer.Add(wx.StaticText(dlg,label='Chemical phase transformed'))
     4656                G2G.HorizontalLine(atomSubSizer,dlg)
     4657                atompnl = wxscroll.ScrolledPanel(dlg,size=(310,250))
     4658                atomBox = wx.FlexGridSizer(0, 5, 2, 2)  # rows, cols, vgap, hgap
     4659                for atom in tmpPhase['Atoms']:
     4660                    atomBox.Add(wx.StaticText(atompnl,label=atom[ctT-1]))
     4661                    for x in atom[cxT:cxT+3]:
     4662                        atomBox.Add(wx.StaticText(atompnl,label='{:.3f}'.format(x)))
     4663                    match = False
     4664                    for Matom in self.Phases[MagPhase]['Atoms']:
     4665                        if atom[ctT] == Matom[ctM]:
     4666                            for i in range(3):
     4667                                if abs(atom[cxT+i]-Matom[cxM+i]) > 0.005:
     4668                                    break
     4669                            else:
     4670                                cellsSame = True
     4671                                match = Matom[ctM-1]
     4672                                break
     4673                    if match:
     4674                        atomBox.Add(wx.StaticText(atompnl,label='  matches '+match))
     4675                    else:
     4676                        atomBox.Add((-1,-1))
     4677                atompnl.SetSizer(atomBox)
     4678                atompnl.SetAutoLayout(1)
     4679                atompnl.SetupScrolling()
     4680                atompnl.Layout()
     4681                atomSubSizer.Add(atompnl)
     4682                atomSizer.Add(atomSubSizer)               
     4683                mainSizer.Add(atomSizer)
     4684            mainSizer.Add((0,15))
     4685            OkBtn = wx.Button(dlg,wx.ID_ANY,"Merge phases")
     4686            OkBtn.Bind(wx.EVT_BUTTON, lambda x: dlg.EndModal(wx.ID_OK))
     4687            OkBtn.Enable(cellsSame)
     4688            cancelBtn = wx.Button(dlg,wx.ID_ANY,"Cancel")
     4689            cancelBtn.Bind(wx.EVT_BUTTON, lambda x: dlg.EndModal(wx.ID_CANCEL))
     4690            btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     4691            btnSizer.Add((20,20),1)
     4692            btnSizer.Add(OkBtn)
     4693            btnSizer.Add((20,20),1)
     4694            btnSizer.Add(cancelBtn)
     4695            btnSizer.Add((20,20),1)
     4696       
     4697            mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
     4698            dlg.Fit()
     4699            wx.CallAfter(dlg.SendSizeEvent)
     4700
     4701        Trans = np.eye(3)
     4702        Uvec = np.zeros(3)
     4703        Vvec = np.zeros(3)
     4704        if 'MagXform' in self.Phases[MagPhase]:
     4705           Trans,Uvec,Vvec = self.Phases[MagPhase]['MagXform']
     4706        tmpPhase = copy.deepcopy(self.Phases[MagPhase])
     4707        cxM,ctM,csM,ciaM = self.Phases[MagPhase]['General']['AtomPtrs']
     4708        cxT,ctT,csT,ciaT = self.Phases[ChemPhase]['General']['AtomPtrs']
     4709       
     4710        showMergeMag()
     4711       
     4712        if dlg.ShowModal() != wx.ID_OK:
     4713            dlg.Destroy()
     4714            return None
     4715        dlg.Destroy()
     4716        # restore atom type info from chemical phase but keep the mag cell & sym, etc.
     4717        combinedPhase = copy.deepcopy(self.Phases[MagPhase])
     4718        combinedPhase['General'] = copy.deepcopy(self.Phases[ChemPhase]['General'])
     4719        combinedPhase['General']['Name'] += ' - merged'
     4720        for k in 'SGData','Cell','AtomPtrs','Lande g','MagDmin','Type':
     4721            if k not in self.Phases[MagPhase]['General']: continue
     4722            combinedPhase['General'][k] = copy.deepcopy(self.Phases[MagPhase]['General'][k])
     4723
     4724        for atom in tmpPhase['Atoms']:
     4725            for x in atom[cxT:cxT+3]:
     4726                match = False
     4727                for Matom in self.Phases[MagPhase]['Atoms']:
     4728                    if atom[ctT] == Matom[ctM]:
     4729                        for i in range(3):
     4730                            if abs(atom[cxT+i]-Matom[cxM+i]) > 0.005:
     4731                                break
     4732                        else:
     4733                            match = True
     4734                            break
     4735            if not match:  # add atom to merged phase
     4736                combinedPhase['Atoms'].append(atom[:cxT+4]+[0.,0.,0.]+atom[cxT+4:])               
     4737        return combinedPhase
     4738   
    45794739    def Exporter(self,event=None):
    45804740        # get a phase and file name
     
    45884748        self.currentExportType = 'phase'
    45894749        if self.ExportSelect('ask'): return
    4590         self.OpenFile()
     4750        self.OpenFile(delayOpen=True)
     4751        MagPhase = None
     4752        ChemPhase = None
     4753           
     4754        if len(self.phasenam) == 2:
     4755            for name in self.phasenam:
     4756                if self.Phases[name]['General']['Type'] == 'nuclear':
     4757                    ChemPhase = name
     4758                if self.Phases[name]['General']['Type'] == 'magnetic':
     4759                    MagPhase = name
     4760            if MagPhase and ChemPhase:
     4761                newPhase = self.mergeMag(self.G2frame,ChemPhase,MagPhase)
     4762                if newPhase is not None:
     4763                    self.openDelayed()
     4764                    newName = ChemPhase + '_merged'
     4765                    self.Phases = {newName:newPhase}
     4766                    self._Exporter(event=event,phaseOnly=newName)
     4767                    self.CloseFile()
     4768                    return
    45914769        for name in self.phasenam:
    4592             self._Exporter(event=event,phaseOnly=name)  #TODO: repeat for magnetic phase
     4770            self.openDelayed()
     4771            self._Exporter(event=event,phaseOnly=name)
    45934772        self.CloseFile()
    45944773
Note: See TracChangeset for help on using the changeset viewer.