Changeset 2464


Ignore:
Timestamp:
Sep 11, 2016 3:05:54 PM (5 years ago)
Author:
vondreele
Message:

magnetic space group work - spin flip display

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r2451 r2464  
    185185        wx.Dialog.__init__(self,parent,wx.ID_ANY,title,pos=wx.DefaultPosition,
    186186            style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
    187         self.text=text
     187        self.text = text
    188188        self.table = table
    189189        self.panel = wx.Panel(self)
     
    224224        self.ShowModal()
    225225        return
     226
     227class SGMagSpinBox(wx.Dialog):
     228    ''' Special version of MessageBox that displays magnetic spin text
     229    '''
     230    def __init__(self,parent,title,text,table,names,spins,):
     231        wx.Dialog.__init__(self,parent,wx.ID_ANY,title,pos=wx.DefaultPosition,
     232            style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,size=wx.Size(400,350))
     233        self.text = text
     234        self.table = table
     235        self.names = names
     236        self.spins = spins
     237        self.panel = wxscroll.ScrolledPanel(self)
     238        mainSizer = wx.BoxSizer(wx.VERTICAL)
     239        mainSizer.Add((0,10))
     240        first = text[0].split(':')
     241        cents = ['',]
     242        if not 'P' in first[1][0]:
     243            cents = text[-1].split(';')
     244        for line in text:
     245            mainSizer.Add(wx.StaticText(self.panel,label='     %s     '%(line)),0,WACV)
     246        try:
     247            nops = self.names.index(' 1bar ')
     248        except ValueError:
     249            nops = len(self.names)
     250        ncol = self.table[0].count(',')+2
     251        for ic,cent in enumerate(cents):
     252            if cent:
     253                cent = cent.strip(' (').strip(')+\n')
     254                mainSizer.Add(wx.StaticText(self.panel,label=' for (%s)+'%(cent)),0,WACV)
     255            tableSizer = wx.FlexGridSizer(0,2*ncol+3,0,0)
     256            for j,item in enumerate(self.table):
     257                flds = item.split(')')[1]
     258                tableSizer.Add(wx.StaticText(self.panel,label='  (%2d)  '%(j+1)),0,WACV|wx.ALIGN_LEFT)           
     259                flds = flds.replace(' ','').split(',')
     260                for i,fld in enumerate(flds):
     261                    if i < ncol-1:
     262                        text = wx.StaticText(self.panel,label='%s, '%(fld))
     263                        tableSizer.Add(text,0,WACV|wx.ALIGN_RIGHT)
     264                    else:
     265                        text = wx.StaticText(self.panel,label='%s '%(fld))
     266                        tableSizer.Add(text,0,WACV|wx.ALIGN_RIGHT)
     267                text = wx.StaticText(self.panel,label=' (%s) '%(self.names[j]))
     268                if self.spins[j+ic*len(self.table)] < 0:
     269                    text.SetForegroundColour('Red')
     270                tableSizer.Add(text,0,WACV|wx.ALIGN_RIGHT)
     271                if not j%2:
     272                    tableSizer.Add((20,0))
     273            mainSizer.Add(tableSizer,0,wx.ALIGN_LEFT)
     274           
     275        btnsizer = wx.StdDialogButtonSizer()
     276        OKbtn = wx.Button(self.panel, wx.ID_OK)
     277        OKbtn.SetDefault()
     278        btnsizer.AddButton(OKbtn)
     279        btnsizer.Realize()
     280        mainSizer.Add((0,10))
     281        mainSizer.Add(btnsizer,0,wx.ALIGN_CENTER)
     282        self.panel.SetSizer(mainSizer)
     283        size = np.array(self.GetSize())
     284        self.panel.SetupScrolling()
     285        size = [size[0]-5,size[1]-20]       #this fiddling is needed for older wx!
     286        self.panel.SetSize(size)
     287        self.panel.SetAutoLayout(1)
     288
     289    def Show(self):
     290        '''Use this method after creating the dialog to post it
     291        '''
     292        self.ShowModal()
     293        return   
    226294
    227295################################################################################
     
    11651233        btnSizer.Add((20,20),1)
    11661234        mainSizer.Add(btnSizer,0,wx.BOTTOM|wx.TOP, 10)
     1235        self.panel.SetSizer(mainSizer)
    11671236        size = np.array(self.GetSize())
    11681237        self.panel.SetupScrolling()
    1169         self.panel.SetSizer(mainSizer)
    11701238        self.panel.SetAutoLayout(1)
    11711239        size = [size[0]-5,size[1]-20]       #this fiddling is needed for older wx!
     
    12081276    '''
    12091277    def __init__(self,parent,data,default,Reset=True):
    1210         wx.Dialog.__init__(self,parent,wx.ID_ANY,
    1211                            'Distance Angle Controls',
     1278        wx.Dialog.__init__(self,parent,wx.ID_ANY,'Distance Angle Controls',
    12121279            pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
    12131280        self.default = default
  • trunk/GSASIIphsGUI.py

    r2461 r2464  
    726726                SGData['SGSpin'][isym] = spCode[Obj.GetValue()]
    727727                G2spc.CheckSpin(isym,SGData)
    728                 wx.CallAfter(UpdateGeneral)                               
    729 
     728                wx.CallAfter(UpdateGeneral)
     729               
     730            def OnShowSpins(event):
     731                showSpins.SetValue(False)
     732                msg = 'Magnetic spin operators for '+SGData['MagSpGrp']
     733                text,table = G2spc.SGPrint(SGData,AddInv=True)
     734                text[0] = ' Magnetic Space Group: '+SGData['MagSpGrp']
     735                G2gd.SGMagSpinBox(General,msg,text,table,OprNames,SpnFlp).Show()
     736               
    730737            SGData = generalData['SGData']           
    731738            Indx = {}
     
    749756            MagSym = G2spc.MagSGSym(SGData)
    750757            SGData['MagSpGrp'] = MagSym
    751             spinSizer.Add(wx.StaticText(General,label=' OG Magnetic space group: '+MagSym),0,WACV)
     758            OprNames,SpnFlp = G2spc.GenMagOps(SGData)
     759            spinSizer.Add(wx.StaticText(General,label=' OG Magnetic space group: %s  '%(MagSym)),0,WACV)
     760            showSpins = wx.CheckBox(General,label=' Show spins?')
     761            showSpins.Bind(wx.EVT_CHECKBOX,OnShowSpins)
     762            spinSizer.Add(showSpins,0,WACV)
    752763            magSizer.Add(spinSizer)
    753764            return magSizer
     
    12701281            GenSym,GenFlg = G2spc.GetGenSym(generalData['SGData'])
    12711282            generalData['SGData']['GenSym'] = GenSym
     1283            generalData['SGData']['GenFlg'] = GenFlg
    12721284            mainSizer.Add(MagSizer())
    12731285            G2G.HorizontalLine(mainSizer,General)
  • trunk/GSASIIspc.py

    r2461 r2464  
    104104    if SGData['SGLaue'] == '2/m' and SGData['SGLatt'] != 'P' and '/' in SGData['SpGrp']:
    105105        SGData['SGSpin'].append(1)  #fix bug in fortran
    106     if SGData['SpGrp'] in ['F 2 2 2','F m m m','F m m 2','F m 2 m','F 2 m m']:
    107         SGData['SGSpin'] = [1,1,1,1,1,1]
    108     if SGData['SpGrp'] in ['F d d 2','F d 2 d','F 2 d d','F d d d']:
    109         SGData['SGSpin'] = [1,1,1]
     106    if 'F' in SGData['SpGrp']:
     107        SGData['SGSpin'] += [1,1,1,1]
     108    elif 'R' in SGData['SpGrp']:
     109        SGData['SGSpin'] += [1,1,1]
     110    elif SGData['SpGrp'][0] in ['A','B','C','I']:
     111        SGData['SGSpin'] += [1,]
    110112    if SGData['SGInv']:
    111113        if SGData['SGLaue'] in ['-1','2/m','mmm']:
     
    168170                moregen.append(1)
    169171    SGData['SGGen'] += moregen
     172#    GSASIIpath.IPyBreak()
    170173    if SGData['SGLaue'] in '-1':
    171174        SGData['SGSys'] = SysSym[0]
     
    357360            return 'm-3m',[]
    358361   
    359 def SGPrint(SGData):
     362def SGPrint(SGData,AddInv=False):
    360363    '''
    361364    Print the output of SpcGroup in a nicely formatted way. Used in SpaceGroup
     
    395398    for i,Opr in enumerate(SGData['SGOps']):
    396399        SGTable.append('(%2d) %s'%(i+1,MT2text(Opr)))
     400    if AddInv and SGData['SGInv']:
     401        for i,Opr in enumerate(SGData['SGOps']):
     402            IOpr = [-Opr[0],-Opr[1]]
     403            SGTable.append('(%2d) %s'%(i+1,MT2text(IOpr)))       
    397404    return SGText,SGTable
    398405
     
    488495    for l in SGPrint(A):
    489496        print l
    490        
     497################################################################################
     498#### Magnetic space group stuff
     499################################################################################
     500
    491501def GetGenSym(SGData):
    492502    '''
     
    504514    if SGData['SGInv']: Nsyms *= 2
    505515    UsymOp = []
    506     OprFlg = []   
     516    OprFlg = [] 
    507517    if Nsyms in [1,3]: NunqOp = 0       #Triclinic acentric OR trigonal 3
    508518    elif Nsyms == 2:                    #Centric triclinic or acentric monoclinic
     
    889899        if SpnFlp[2] < 0:
    890900            magSym[0] += '(P)'
     901#    print SpnFlp
    891902    return ' '.join(magSym)
     903   
     904def GenMagOps(SGData):
     905    FlpSpn = SGData['SGSpin']
     906    Nsym = len(SGData['SGOps'])
     907    Nfl = len(SGData['GenFlg'])
     908    Ncv = len(SGData['SGCen'])
     909    sgOp = [M for M,T in SGData['SGOps']]
     910    OprName = [GetOprPtrName(str(irtx))[1] for irtx in PackRot(SGData['SGOps'])]
     911    if SGData['SGInv']:
     912        Nsym *= 2
     913        sgOp += [-M for M,T in SGData['SGOps']]
     914        OprName += [GetOprPtrName(str(-irtx))[1] for irtx in PackRot(SGData['SGOps'])]
     915    Nsyms = 0
     916    sgOps = []
     917    OprNames = []
     918    for incv in range(Ncv):
     919        Nsyms += Nsym
     920        sgOps += sgOp
     921        OprNames += OprName   
     922    SpnFlp = np.ones(Nsym,dtype=np.int)
     923    for ieqv in range(Nsym):
     924        for iunq in range(Nfl):
     925            if SGData['SGGen'][ieqv] & SGData['GenFlg'][iunq]:
     926                SpnFlp[ieqv] *= FlpSpn[iunq]
     927#    print '\nMagSpGrp:',SGData['MagSpGrp'],Ncv
     928#    print 'GenFlg:',SGData['GenFlg']
     929#    print 'GenSym:',SGData['GenSym']
     930#    print 'FlpSpn:',Nfl,FlpSpn
     931    detM = [nl.det(M) for M in sgOp]
     932    for incv in range(Ncv):
     933        if incv:
     934            SpnFlp = np.concatenate((SpnFlp,SpnFlp[:Nsym]*FlpSpn[Nfl+incv-1]))
     935    MagMom = SpnFlp*np.array(Ncv*detM)
     936    SGData['MagMom'] = MagMom
     937#    print 'SgOps:',OprNames
     938#    print 'SpnFlp:',SpnFlp
     939#    print 'MagMom:',MagMom
     940    return OprNames,SpnFlp
     941   
     942   
    892943   
    893944   
     
    18071858def GetNXUPQsym(siteSym):
    18081859    '''       
    1809     The codes XUPQ are for lookup of symmetry constraints for position(X), thermal parm(U) & magnetic moments
    1810     (P&Q-not used in GSAS-II)
     1860    The codes XUPQ are for lookup of symmetry constraints for position(X), thermal parm(U) & magnetic moments (P & Q)
    18111861    '''
    18121862    NXUPQsym = {
Note: See TracChangeset for help on using the changeset viewer.