Changeset 3418


Ignore:
Timestamp:
Jun 2, 2018 7:42:33 AM (3 years ago)
Author:
vondreele
Message:

move SGMagSpinBox from G2phsGUI to G2ctrlGUI
add selection of spin choices in Unit Cells List for testing magnetic space groups with neutron data only - test TBD
fix bug in ApplyBNSlatt for non BNS centered lattice choice

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIctrlGUI.py

    r3417 r3418  
    140140import copy
    141141import webbrowser     # could postpone this for quicker startup
     142import numpy as np
    142143
    143144import GSASIIpath
     
    145146import GSASIIdataGUI as G2gd
    146147import GSASIIpwdGUI as G2pdG
     148import GSASIIspc as G2spc
    147149import GSASIIpy3 as G2py3
    148150import GSASIIlog as log
    149151import GSASIIobj as G2obj
     152
    150153
    151154# Define a short names for convenience
     
    31453148        parent.Raise()
    31463149        self.EndModal(wx.ID_OK)
     3150
     3151################################################################################
     3152class SGMagSpinBox(wx.Dialog):
     3153    ''' Special version of MessageBox that displays magnetic spin text
     3154    '''
     3155    def __init__(self,parent,title,text,table,Cents,names,spins,ifGray):
     3156        wx.Dialog.__init__(self,parent,wx.ID_ANY,title,pos=wx.DefaultPosition,
     3157            style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,size=wx.Size(420,350))
     3158        self.text = text
     3159        self.table = table
     3160        self.names = names
     3161        Nnames = len(self.names)
     3162        self.spins = spins
     3163        self.ifGray = ifGray
     3164        self.PrintTable = [' Magnetic symmetry operations for %s:'%self.text[0].split(':')[1],]
     3165        self.panel = wxscroll.ScrolledPanel(self)
     3166        mainSizer = wx.BoxSizer(wx.VERTICAL)
     3167        mainSizer.Add((0,10))
     3168        cents = [0,]
     3169        if len(Cents) > 1:
     3170            cents = self.text[-1].split(';')
     3171        lentable = len(self.table)
     3172        for line in self.text:
     3173            mainSizer.Add(wx.StaticText(self.panel,label='     %s     '%(line)),0,WACV)
     3174            if 'equivalent' in line:
     3175                break
     3176        ncol = self.table[0].count(',')+2
     3177        nBlk = 0
     3178        nG = 1
     3179        if self.ifGray:
     3180            nG = 2
     3181        for ng in range(nG):
     3182            for ic,cent in enumerate(cents):
     3183                Cent = np.array(Cents[ic])
     3184                if ic:
     3185                    if cent: cent = cent.strip(' (').strip(')+\n')
     3186                    label = '      for (%s)+'%(cent)
     3187                    if ng or self.spins[nBlk*lentable] < 0:     #test for gray operators
     3188                        label += "1'"
     3189                    mainSizer.Add(wx.StaticText(self.panel,label=label),0,WACV)
     3190                tableSizer = wx.FlexGridSizer(0,2*ncol+3,0,0)
     3191                j = 0
     3192                for item in self.table:
     3193                    flds = item.split(')')[1]
     3194                    tableSizer.Add(wx.StaticText(self.panel,label='  (%2d)  '%(j+1)),0,WACV)           
     3195                    flds = flds.replace(' ','').split(',')
     3196                    for i,fld in enumerate(flds):
     3197                        if i < ncol-1:
     3198                            text = wx.StaticText(self.panel,label='%s, '%(fld))
     3199                            tableSizer.Add(text,0,WACV)
     3200                        else:
     3201                            text = wx.StaticText(self.panel,label='%s '%(fld))
     3202                            tableSizer.Add(text,0,WACV)
     3203                    text = wx.StaticText(self.panel,label=' (%s) '%(self.names[j%Nnames]))
     3204                    try:
     3205                        if self.spins[j+nBlk*lentable] < 0:
     3206                            text.SetForegroundColour('Red')
     3207                            item += ',-1'
     3208                        else:
     3209                            item += ',+1'
     3210                    except IndexError:
     3211                        print(self.spins,j,ic,lentable,self.names[j%Nnames])
     3212                        item += ',+1'
     3213                    M,T,S = G2spc.MagText2MTS(item.split(')')[1].replace(' ',''),CIF=False)
     3214                    T = (T+Cent)%1.
     3215                    item = G2spc.MT2text([M,T],reverse=True)
     3216                    if S > 0:
     3217                        item += ',+1'
     3218                    else:
     3219                        item += ',-1'
     3220                    self.PrintTable.append(item.replace(' ','').lower())
     3221                    tableSizer.Add(text,0,WACV)
     3222                    if not j%2:
     3223                        tableSizer.Add((20,0))
     3224                    j += 1
     3225                nBlk += 1
     3226                mainSizer.Add(tableSizer,0,WACV)
     3227           
     3228           
     3229        def OnPrintOps(event):
     3230            for item in self.PrintTable:
     3231                print(item)
     3232           
     3233        btnsizer = wx.StdDialogButtonSizer()
     3234        printBtn = wx.Button(self.panel,label='Print Ops')
     3235        printBtn.Bind(wx.EVT_BUTTON, OnPrintOps)
     3236        btnsizer.Add(printBtn)
     3237        OKbtn = wx.Button(self.panel, wx.ID_OK)
     3238        OKbtn.SetDefault()
     3239        btnsizer.AddButton(OKbtn)
     3240        btnsizer.Realize()
     3241        OKbtn.SetFocus()
     3242        mainSizer.Add((0,10))
     3243        mainSizer.Add(btnsizer,0)
     3244       
     3245        self.panel.SetSizer(mainSizer)
     3246        self.panel.SetAutoLayout(True)
     3247        self.panel.SetScrollRate(10,10)
     3248        self.panel.SendSizeEvent()
     3249
     3250
     3251    def Show(self):
     3252        '''Use this method after creating the dialog to post it
     3253        '''
     3254        self.ShowModal()
     3255        return
     3256   
    31473257
    31483258################################################################################
  • trunk/GSASIIphsGUI.py

    r3406 r3418  
    7070################################################################################
    7171#### phase class definitions
    72 ################################################################################
    73 class SGMagSpinBox(wx.Dialog):
    74     ''' Special version of MessageBox that displays magnetic spin text
    75     '''
    76     def __init__(self,parent,title,text,table,Cents,names,spins,ifGray):
    77         wx.Dialog.__init__(self,parent,wx.ID_ANY,title,pos=wx.DefaultPosition,
    78             style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,size=wx.Size(420,350))
    79         self.text = text
    80         self.table = table
    81         self.names = names
    82         Nnames = len(self.names)
    83         self.spins = spins
    84         self.ifGray = ifGray
    85         self.PrintTable = [' Magnetic symmetry operations for %s:'%self.text[0].split(':')[1],]
    86         self.panel = wxscroll.ScrolledPanel(self)
    87         mainSizer = wx.BoxSizer(wx.VERTICAL)
    88         mainSizer.Add((0,10))
    89         cents = [0,]
    90         if len(Cents) > 1:
    91             cents = self.text[-1].split(';')
    92         lentable = len(self.table)
    93         for line in self.text:
    94             mainSizer.Add(wx.StaticText(self.panel,label='     %s     '%(line)),0,WACV)
    95             if 'equivalent' in line:
    96                 break
    97         ncol = self.table[0].count(',')+2
    98         nBlk = 0
    99         nG = 1
    100         if self.ifGray:
    101             nG = 2
    102         for ng in range(nG):
    103             for ic,cent in enumerate(cents):
    104                 Cent = np.array(Cents[ic])
    105                 if ic:
    106                     if cent: cent = cent.strip(' (').strip(')+\n')
    107                     label = '      for (%s)+'%(cent)
    108                     if ng or self.spins[nBlk*lentable] < 0:     #test for gray operators
    109                         label += "1'"
    110                     mainSizer.Add(wx.StaticText(self.panel,label=label),0,WACV)
    111                 tableSizer = wx.FlexGridSizer(0,2*ncol+3,0,0)
    112                 j = 0
    113                 for item in self.table:
    114                     flds = item.split(')')[1]
    115                     tableSizer.Add(wx.StaticText(self.panel,label='  (%2d)  '%(j+1)),0,WACV)           
    116                     flds = flds.replace(' ','').split(',')
    117                     for i,fld in enumerate(flds):
    118                         if i < ncol-1:
    119                             text = wx.StaticText(self.panel,label='%s, '%(fld))
    120                             tableSizer.Add(text,0,WACV)
    121                         else:
    122                             text = wx.StaticText(self.panel,label='%s '%(fld))
    123                             tableSizer.Add(text,0,WACV)
    124                     text = wx.StaticText(self.panel,label=' (%s) '%(self.names[j%Nnames]))
    125                     try:
    126                         if self.spins[j+nBlk*lentable] < 0:
    127                             text.SetForegroundColour('Red')
    128                             item += ',-1'
    129                         else:
    130                             item += ',+1'
    131                     except IndexError:
    132                         print(self.spins,j,ic,lentable,self.names[j%Nnames])
    133                         item += ',+1'
    134                     M,T,S = G2spc.MagText2MTS(item.split(')')[1].replace(' ',''),CIF=False)
    135                     T = (T+Cent)%1.
    136                     item = G2spc.MT2text([M,T],reverse=True)
    137                     if S > 0:
    138                         item += ',+1'
    139                     else:
    140                         item += ',-1'
    141                     self.PrintTable.append(item.replace(' ','').lower())
    142                     tableSizer.Add(text,0,WACV)
    143                     if not j%2:
    144                         tableSizer.Add((20,0))
    145                     j += 1
    146                 nBlk += 1
    147                 mainSizer.Add(tableSizer,0,WACV)
    148            
    149            
    150         def OnPrintOps(event):
    151             for item in self.PrintTable:
    152                 print(item)
    153            
    154         btnsizer = wx.StdDialogButtonSizer()
    155         printBtn = wx.Button(self.panel,label='Print Ops')
    156         printBtn.Bind(wx.EVT_BUTTON, OnPrintOps)
    157         btnsizer.Add(printBtn)
    158         OKbtn = wx.Button(self.panel, wx.ID_OK)
    159         OKbtn.SetDefault()
    160         btnsizer.AddButton(OKbtn)
    161         btnsizer.Realize()
    162         OKbtn.SetFocus()
    163         mainSizer.Add((0,10))
    164         mainSizer.Add(btnsizer,0)
    165        
    166         self.panel.SetSizer(mainSizer)
    167         self.panel.SetAutoLayout(True)
    168         self.panel.SetScrollRate(10,10)
    169         self.panel.SendSizeEvent()
    170 
    171 
    172     def Show(self):
    173         '''Use this method after creating the dialog to post it
    174         '''
    175         self.ShowModal()
    176         return
    177    
    178 
    17972################################################################################
    18073class SymOpDialog(wx.Dialog):
     
    18731766                    text[0] += " 1'"
    18741767                    text[3] += "1'"
    1875                 SGMagSpinBox(General,msg,text,table,SGData['SGCen'],OprNames,
     1768                G2G.SGMagSpinBox(General,msg,text,table,SGData['SGCen'],OprNames,
    18761769                    SGData['SpnFlp'],SGData['SGGray']& (not SGData['SGFixed'])).Show()
    18771770                               
  • trunk/GSASIIpwdGUI.py

    r3395 r3418  
    30923092        A = G2lat.cell2A(cell)
    30933093        ibrav = bravaisSymb.index(controls[5])
     3094        controls[13] = SPGlist[ibrav][0]       
    30943095        SGData = G2spc.SpcGroup(controls[13])[1]
    30953096        if 'C' in Inst['Type'][0] or 'PKS' in Inst['Type'][0]:
     
    32643265            dlg.Destroy()
    32653266           
     3267    def OnSpinOp(event):
     3268        Obj = event.GetEventObject()
     3269        isym = Indx[Obj.GetId()]+1
     3270        spCode = {'red':-1,'black':1}                   
     3271        SGData['SGSpin'][isym] = spCode[Obj.GetValue()]
     3272        G2spc.CheckSpin(isym,SGData)
     3273        GenSym,GenFlg,BNSsym = G2spc.GetGenSym(SGData)
     3274        SGData['GenSym'] = GenSym
     3275        SGData['GenFlg'] = GenFlg
     3276        OprNames,SpnFlp = G2spc.GenMagOps(SGData)
     3277        SGData['SpnFlp'] = SpnFlp
     3278        SGData['MagSpGrp'] = G2spc.MagSGSym(SGData)
     3279       
     3280    def OnBNSlatt(event):
     3281        Obj = event.GetEventObject()
     3282        SGData.update(G2spc.SpcGroup(SGData['SpGrp'])[1])
     3283        BNSlatt = Obj.GetValue()
     3284        if '_' in BNSlatt:
     3285            SGData['BNSlattsym'] = [BNSlatt,BNSsym[BNSlatt]]
     3286        else:
     3287            SGData['BNSlattsym'] = [SGData['SGLatt'],[0.,0.,0.]]
     3288        SGData['SGSpin'] = [1,]*len(SGData['SGSpin'])
     3289        GenSym,GenFlg = G2spc.GetGenSym(SGData)[:2]
     3290        SGData['GenSym'] = GenSym
     3291        SGData['GenFlg'] = GenFlg
     3292        SGData['MagSpGrp'] = G2spc.MagSGSym(SGData)
     3293        G2spc.ApplyBNSlatt(SGData,SGData['BNSlattsym'])
     3294        OprNames,SpnFlp = G2spc.GenMagOps(SGData)
     3295        SGData['SpnFlp'] = SpnFlp
     3296           
     3297    def OnShowSpins(event):
     3298        SGData['MagSpGrp'] = G2spc.MagSGSym(SGData)
     3299        msg = 'Magnetic space group information'
     3300        text,table = G2spc.SGPrint(SGData,AddInv=True)
     3301        text[0] = ' Magnetic Space Group: '+SGData['MagSpGrp']
     3302        text[3] = ' The magnetic lattice point group is '+SGData['MagPtGp']
     3303        G2G.SGMagSpinBox(G2frame.dataWindow,msg,text,table,SGData['SGCen'],OprNames,
     3304            SGData['SpnFlp'],False).Show()
     3305       
    32663306    G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.IndexMenu)
    32673307    G2frame.Bind(wx.EVT_MENU, OnIndexPeaks, id=G2G.wxID_INDEXPEAKS)
     
    32783318    if len(controls) < 14:              #add space group used in indexing
    32793319        controls.append(spaceGroups[bravaisSymb.index(controls[5])])
     3320    SGData = G2spc.SpcGroup(controls[13])[1]
    32803321    G2frame.GPXtree.SetItemPyData(UnitCellsId,data)            #update with volume
    32813322    bravaisNames = ['Cubic-F','Cubic-I','Cubic-P','Trigonal-R','Trigonal/Hexagonal-P',
     
    33683409    SSopt.Bind(wx.EVT_CHECKBOX,OnSSopt)
    33693410    littleSizer.Add(SSopt,0,WACV)
    3370     hklShow = wx.Button(G2frame.dataWindow,label="Show hkl positions")
    3371     hklShow.Bind(wx.EVT_BUTTON,OnHklShow)
    3372     littleSizer.Add(hklShow,0,WACV)
     3411    if 'X' in Inst['Type'][0]:
     3412        hklShow = wx.Button(G2frame.dataWindow,label="Show hkl positions")
     3413        hklShow.Bind(wx.EVT_BUTTON,OnHklShow)
     3414        littleSizer.Add(hklShow,0,WACV)
    33733415    mainSizer.Add(littleSizer,0)
    3374    
    33753416    mainSizer.Add((5,5),0)
     3417    if 'N' in Inst['Type'][0]:
     3418        Indx = {}
     3419        GenSym,GenFlg,BNSsym = G2spc.GetGenSym(SGData)
     3420        SGData['GenSym'] = GenSym
     3421        SGData['SGGray'] = False
     3422        neutSizer = wx.BoxSizer(wx.HORIZONTAL)
     3423        neutSizer.Add(wx.StaticText(G2frame.dataWindow,label=' BNS lattice: '),0,WACV)
     3424        BNS = wx.ComboBox(G2frame.dataWindow,value=SGData['BNSlattsym'][0],
     3425            choices=[SGData['SGLatt'],]+list(BNSsym.keys()),style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3426        BNS.Bind(wx.EVT_COMBOBOX,OnBNSlatt)
     3427        neutSizer.Add(BNS,0,WACV)
     3428        spinColor = ['black','red']
     3429        spCode = {-1:'red',1:'black'}
     3430        for isym,sym in enumerate(GenSym[1:]):
     3431            neutSizer.Add(wx.StaticText(G2frame.dataWindow,label=' %s: '%(sym.strip())),0,WACV)               
     3432            spinOp = wx.ComboBox(G2frame.dataWindow,value=spCode[SGData['SGSpin'][isym+1]],choices=spinColor,
     3433                style=wx.CB_READONLY|wx.CB_DROPDOWN)               
     3434            Indx[spinOp.GetId()] = isym
     3435            spinOp.Bind(wx.EVT_COMBOBOX,OnSpinOp)
     3436            neutSizer.Add(spinOp,0,WACV)
     3437        OprNames,SpnFlp = G2spc.GenMagOps(SGData)
     3438        SGData['SpnFlp'] = SpnFlp
     3439        showSpins = wx.Button(G2frame.dataWindow,label=' Show spins?')
     3440        showSpins.Bind(wx.EVT_BUTTON,OnShowSpins)
     3441        neutSizer.Add(showSpins,0,WACV)
     3442        hklShow = wx.Button(G2frame.dataWindow,label="Show hkl positions")
     3443        hklShow.Bind(wx.EVT_BUTTON,OnHklShow)
     3444        neutSizer.Add(hklShow,0,WACV)
     3445        mainSizer.Add(neutSizer,0)
     3446        mainSizer.Add((5,5),0)
    33763447    ibrav = SetLattice(controls)
    33773448    for cellGUI in cellGUIlist:
  • trunk/GSASIIspc.py

    r3400 r3418  
    801801        SGData['SGSpin'] += [-1,-1,-1,]
    802802        Tmat *= 2.0
     803    else:
     804        return Tmat
    803805    SGData['SGSpin'].append(-1)
    804806    if 'P' not in BNS:
  • trunk/GSASIIstrMath.py

    r3416 r3418  
    11101110    VGi = np.sqrt(nl.det(Ginv))
    11111111    Kdata = np.inner(Gdata.T,uAmat).T*VGi/Mag       #make unit vectors in Cartesian space
    1112 #    Gones = np.ones_like(Gdata)
    11131112    dkdG = (np.inner(Gones.T,uAmat).T*VGi)/Mag
    11141113    dkdm = dkdG-Kdata*dMdm[:,nxs,:]/Mag[nxs,:,:]
Note: See TracChangeset for help on using the changeset viewer.