Changeset 3317


Ignore:
Timestamp:
Mar 16, 2018 12:24:43 PM (4 years ago)
Author:
vondreele
Message:

magnetic site symmetry restrictions on moments & magnetic site symmetry symbols

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r3302 r3317  
    12181218        return
    12191219    constraints = G2frame.GPXtree.GetItemPyData(item)
    1220 #    GSASIIpath.IPyBreak()
    12211220    parmDict = {}
    12221221    varyList = []
  • trunk/GSASIIctrlGUI.py

    r3298 r3317  
    36073607        self.nextval = self.startValue
    36083608        val = self._tc.GetValue().lower().strip()
    3609         if val != self.startValue:
     3609        if val != str(self.startValue):
    36103610            changed = True
    36113611            neg = False
  • trunk/GSASIIphsGUI.py

    r3312 r3317  
    8080        self.table = table
    8181        self.names = names
     82        Nnames = len(self.names)
    8283        self.spins = spins
    8384        self.PrintTable = [' Magnetic symmetry operations for %s:'%self.text[0].split(':')[1],]
     
    99100            tableSizer = wx.FlexGridSizer(0,2*ncol+3,0,0)
    100101            j = 0
    101             Red = False
    102102            for item in self.table:
     103                if 'for' in item:
     104                    mainSizer.Add(tableSizer,0,WACV)
     105                    mainSizer.Add(wx.StaticText(self.panel,label=item),0,WACV)
     106                    tableSizer = wx.FlexGridSizer(0,2*ncol+3,0,0)
     107                    continue
    103108                flds = item.split(')')[1]
    104109                tableSizer.Add(wx.StaticText(self.panel,label='  (%2d)  '%(j+1)),0,WACV)           
     
    111116                        text = wx.StaticText(self.panel,label='%s '%(fld))
    112117                        tableSizer.Add(text,0,WACV)
    113                 text = wx.StaticText(self.panel,label=' (%s) '%(self.names[j]))
     118                text = wx.StaticText(self.panel,label=' (%s) '%(self.names[j%Nnames]))
    114119                try:
    115                     if self.spins[j+ic*lentable] < 0 or Red:
     120                    if self.spins[j+ic*lentable] < 0:
    116121                        text.SetForegroundColour('Red')
    117122                        item += ',-1'
     
    119124                        item += ',+1'
    120125                except IndexError:
    121                     print(self.spins,j,ic,lentable,self.names[j])
     126                    print(self.spins,j,ic,lentable,self.names[j%Nnames])
    122127                    item += ',+1'
    123128                M,T,S = G2spc.MagText2MTS(item.split(')')[1].replace(' ',''),CIF=False)
     
    147152        btnsizer.AddButton(OKbtn)
    148153        btnsizer.Realize()
     154        OKbtn.SetFocus()
    149155        mainSizer.Add((0,10))
    150156        mainSizer.Add(btnsizer,0)
     
    468474                return
    469475            SGData['BNSlattsym'] = [BNSlatt,BNSsym[BNSlatt]]
     476            SGData['SGSpin'] = [1,]*len(SGData['SGSpin'])
    470477            self.Trans = G2spc.ApplyBNSlatt(SGData,SGData['BNSlattsym'])
    471478            wx.CallAfter(self.Draw)
     
    18351842               
    18361843            def OnShowSpins(event):
    1837                 showSpins.SetValue(False)
    18381844                msg = 'Magnetic space group information'
    18391845                text,table = G2spc.SGPrint(SGData,AddInv=not SGData['SGFixed'])
     
    18741880            SGData['OprNames'] = OprNames
    18751881            spinSizer.Add(wx.StaticText(General,label=' Magnetic space group: %s  '%(MagSym)),0,WACV)
    1876             showSpins = wx.CheckBox(General,label=' Show spins?')
    1877             showSpins.Bind(wx.EVT_CHECKBOX,OnShowSpins)
     1882            showSpins = wx.Button(General,label=' Show spins?')
     1883            showSpins.Bind(wx.EVT_BUTTON,OnShowSpins)
    18781884            spinSizer.Add(showSpins,0,WACV)
    18791885            magSizer.Add(spinSizer)
     
    19421948            modSizer.Add(superGp,0,WACV)
    19431949            modSizer.Add((5,5),0)
    1944             showOps = wx.CheckBox(General,label='Show ops.')
    1945             showOps.Bind(wx.EVT_CHECKBOX,OnSuperGp)
     1950            showOps = wx.Button(General,label='Show ops.')
     1951            showOps.Bind(wx.EVT_BUTTON,OnSuperGp)
    19461952            modSizer.Add(showOps,0,WACV)
    19471953            if PWDR:
     
    27372743                atId = atomData[row][colIA+8]
    27382744                rbExcl = rbAtmDict.get(atId,'')
    2739                 Atoms.SetReadOnly(row,colType,True)
    2740                 Atoms.SetReadOnly(row,colSS,True)                         #site sym
    2741                 Atoms.SetReadOnly(row,colSS+1,True)                       #Mult
    27422745                if Atoms.GetCellValue(row,colIA) == 'A':
    27432746                    try:    #patch for sytsym name changes
     
    27662769                if colM:
    27672770                    SytSym,Mul,Nop,dupDir = G2spc.SytSym(atomData[row][colX:colX+3],SGData)
     2771                    MagSytSym = G2spc.MagSytSym(SytSym,dupDir,SGData)
     2772                    Atoms.SetCellValue(row,colSS,MagSytSym)
    27682773                    CSI = []
    27692774                    if not SGData['SGGray']:
     
    27852790                        if c != colR:
    27862791                            Atoms.SetCellStyle(row,c,VERY_LIGHT_GREY,True)
     2792                Atoms.SetReadOnly(row,colType,True)
     2793                Atoms.SetReadOnly(row,colSS,True)                         #site sym
     2794                Atoms.SetReadOnly(row,colSS+1,True)                       #Mult
    27872795            Atoms.AutoSizeColumns(False)
    27882796            SetPhaseWindow(Atoms)
  • trunk/GSASIIspc.py

    r3311 r3317  
    7777        SGSymbol = SGSymbol.replace("1'",'')
    7878    SGSymbol = SGSymbol.split(':')[0]   #remove :1/2 setting symbol from some cif files
     79    if '-2' in SGSymbol:    #replace bad but legal symbols with correct equivalents
     80        SGSymbol = SGSymbol.replace('-2','m')
     81    if SGSymbol.split()[1] =='3/m':
     82        SGSymbol = SGSymbol.replace('3/m','-6')
    7983    import pyspg
    8084    SGInfo = pyspg.sgforpy(SGSymbol)
     
    210214            SGData['SGSpin'] = lattSpin+[1,1,]
    211215        elif SGData['SGPtGrp'] in ['2/m','4/m','422','4mm','-42m','-4m2','-3m1','-31m',
    212             '6/m','622','6mm','-6m2','-62m','m3','m-3m']:
     216            '6/m','622','6mm','-6m2','-62m','m3','m3m']:
    213217            SGData['SGSpin'] = lattSpin+[1,1,1,]
    214218        else: #'222'-'mmm','4/mmm','6/mmm'
    215219            SGData['SGSpin'] = lattSpin+[1,1,1,1,]
    216            
    217    
    218220    return SGInfo[-1],SGData
    219221
     
    385387                return '432',[]
    386388        else:
    387             return 'm-3m',[]
     389            return 'm3m',[]
    388390   
    389391def SGPrint(SGData,AddInv=False):
     
    569571   
    570572    '''
    571     OprNames = [GetOprPtrName(str(irtx))[1] for irtx in PackRot(SGData['SGOps'])]
     573    OprNames = [GetOprPtrName(str(irtx)) for irtx in PackRot(SGData['SGOps'])]
    572574    if SGData['SGInv']:
    573         OprNames += [GetOprPtrName(str(-irtx))[1] for irtx in PackRot(SGData['SGOps'])]
     575        OprNames += [GetOprPtrName(str(-irtx)) for irtx in PackRot(SGData['SGOps'])]
    574576    Nsyms = len(SGData['SGOps'])
    575     if SGData['SGInv']: Nsyms *= 2
     577    if SGData['SGInv'] and not SGData['SGFixed']: Nsyms *= 2
    576578    UsymOp = ['1',]
    577579    OprFlg = [0,] 
     
    697699    if 'P' in SGData['SGLatt']:
    698700        if SGData['SGSys'] == 'triclinic':
    699             BNSsym = {'P(a)':[.5,0,0],'P(b)':[0,.5,0],'P(c)':[0,0,.5]}           
     701            BNSsym = {'P_a':[.5,0,0],'P_b':[0,.5,0],'P_c':[0,0,.5]}           
    700702        elif SGData['SGSys'] == 'monoclinic':
    701             BNSsym = {'P(a)':[.5,0,0],'P(b)':[0,.5,0],'P(c)':[0,0,.5]}
     703            BNSsym = {'P_a':[.5,0,0],'P_b':[0,.5,0],'P_c':[0,0,.5]}
    702704            if SGData['SGUniq'] == 'a':
    703                 BNSsym.update({'P(B)':[.5,0,.5],'P(C)':[.5,.5,0]})
     705                BNSsym.update({'P_B':[.5,0,.5],'P_C':[.5,.5,0]})
    704706            elif SGData['SGUniq'] == 'b':
    705                 BNSsym.update({'P(A)':[.5,.5,0],'P(C)':[0,.5,.5]})
     707                BNSsym.update({'P_A':[.5,.5,0],'P_C':[0,.5,.5]})
    706708            elif SGData['SGUniq'] == 'c':
    707                 BNSsym.update({'P(A)':[0,.5,.5],'P(B)':[.5,0,.5]})
     709                BNSsym.update({'P_A':[0,.5,.5],'P_B':[.5,0,.5]})
    708710        elif SGData['SGSys'] == 'orthorhombic':
    709             BNSsym = {'P(a)':[.5,0,0],'P(b)':[0,.5,0],'P(c)':[0,0,.5],
    710                 'P(A)':[0,.5,.5],'P(B)':[.5,0,.5],'P(C)':[.5,.5,0],'P(I)':[.5,.5,.5]}
     711            BNSsym = {'P_a':[.5,0,0],'P_b':[0,.5,0],'P_c':[0,0,.5],
     712                'P_A':[0,.5,.5],'P_B':[.5,0,.5],'P_C':[.5,.5,0],'P_I':[.5,.5,.5]}
    711713        elif SGData['SGSys'] == 'tetragonal':
    712             BNSsym = {'P(c)':[0,0,.5],'P(C)':[.5,.5,0],'P(I)':[.5,.5,.5]}           
     714            BNSsym = {'P_c':[0,0,.5],'P_C':[.5,.5,0],'P_I':[.5,.5,.5]}           
    713715        elif SGData['SGSys'] in ['trigonal','hexagonal']:
    714             BNSsym = {'P(c)':[0,0,.5]}           
     716            BNSsym = {'P_c':[0,0,.5]}           
    715717        elif SGData['SGSys'] == 'cubic':
    716             BNSsym = {'P(I)':[.5,.5,.5]}           
     718            BNSsym = {'P_I':[.5,.5,.5]}           
    717719           
    718720    elif 'A' in SGData['SGLatt']:
     
    720722            BNSsym = {}
    721723            if SGData['SGUniq'] == 'b':
    722                 BNSsym.update({'A(a)':[.5,0,0],'A(c)':[0,0,.5]})
     724                BNSsym.update({'A_a':[.5,0,0],'A_c':[0,0,.5]})
    723725            elif SGData['SGUniq'] == 'c':
    724                 BNSsym.update({'A(a)':[.5,0,0],'A(b)':[0,.5,0]})
     726                BNSsym.update({'A_a':[.5,0,0],'A_b':[0,.5,0]})
    725727        elif SGData['SGSys'] == 'orthorhombic':
    726             BNSsym = {'A(a)':[.5,0,0],'A(b)':[0,.5,0],'A(c)':[0,0,.5],
    727                'A(B)':[.5,0,.5],'A(C)':[.5,.5,0]}   
     728            BNSsym = {'A_a':[.5,0,0],'A_b':[0,.5,0],'A_c':[0,0,.5],
     729               'A_B':[.5,0,.5],'A_C':[.5,.5,0]}   
    728730        elif SGData['SGSys'] == 'triclinic':
    729             BNSsym = {'A(a)':[.5,0,0],'A(b)':[0,.5,0],'A(c)':[0,0,.5]}   
     731            BNSsym = {'A_a':[.5,0,0],'A_b':[0,.5,0],'A_c':[0,0,.5]}   
    730732           
    731733    elif 'B' in SGData['SGLatt']:
     
    733735            BNSsym = {}
    734736            if SGData['SGUniq'] == 'a':
    735                 BNSsym.update({'B(b)':[0,.5,0],'B(c)':[0,0,.5]})
     737                BNSsym.update({'B_b':[0,.5,0],'B_c':[0,0,.5]})
    736738            elif SGData['SGUniq'] == 'c':
    737                 BNSsym.update({'B(a)':[.5,0,0],'B(b)':[0,.5,0]})
     739                BNSsym.update({'B_a':[.5,0,0],'B_b':[0,.5,0]})
    738740        elif SGData['SGSys'] == 'orthorhombic':
    739             BNSsym = {'B(a)':[.5,0,0],'B(b)':[0,.5,0],'B(c)':[0,0,.5],
    740                 'B(A)':[0,.5,.5],'B(C)':[.5,.5,0]}     
     741            BNSsym = {'B_a':[.5,0,0],'B_b':[0,.5,0],'B_c':[0,0,.5],
     742                'B_A':[0,.5,.5],'B_C':[.5,.5,0]}     
    741743        elif SGData['SGSys'] == 'triclinic':
    742             BNSsym = {'B(a)':[.5,0,0],'B(b)':[0,.5,0],'B(c)':[0,0,.5]}     
     744            BNSsym = {'B_a':[.5,0,0],'B_b':[0,.5,0],'B_c':[0,0,.5]}     
    743745           
    744746    elif 'C' in SGData['SGLatt']:
     
    746748            BNSsym = {}
    747749            if SGData['SGUniq'] == 'a':
    748                 BNSsym.update({'C(b)':[0,.5,.0],'C(c)':[0,0,.5]})
     750                BNSsym.update({'C_b':[0,.5,.0],'C_c':[0,0,.5]})
    749751            elif SGData['SGUniq'] == 'b':
    750                 BNSsym.update({'C(a)':[.5,0,0],'C(c)':[0,0,.5]})
     752                BNSsym.update({'C_a':[.5,0,0],'C_c':[0,0,.5]})
    751753        elif SGData['SGSys'] == 'orthorhombic':
    752             BNSsym = {'C(a)':[.5,0,0],'C(b)':[0,.5,0],'C(c)':[0,0,.5],
    753                 'C(A)':[0,.5,.5],'C(B)':[.5,0,.5]}     
     754            BNSsym = {'C_a':[.5,0,0],'C_b':[0,.5,0],'C_c':[0,0,.5],
     755                'C_A':[0,.5,.5],'C_B':[.5,0,.5]}     
    754756        elif SGData['SGSys'] == 'triclinic':
    755             BNSsym = {'C(a)':[.5,0,0],'C(b)':[0,.5,0],'C(c)':[0,0,.5]}     
     757            BNSsym = {'C_a':[.5,0,0],'C_b':[0,.5,0],'C_c':[0,0,.5]}     
    756758           
    757759    elif 'I' in SGData['SGLatt']:
    758760        if SGData['SGSys'] in ['monoclinic','orthorhombic','triclinic']:
    759             BNSsym = {'I(a)':[.5,0,0],'I(b)':[0,.5,0],'I(c)':[0,0,.5]}
     761            BNSsym = {'I_a':[.5,0,0],'I_b':[0,.5,0],'I_c':[0,0,.5]}
    760762        elif SGData['SGSys'] == 'tetragonal':
    761             BNSsym = {'I(c)':[0,0,.5]}
     763            BNSsym = {'I_c':[0,0,.5]}
    762764        elif SGData['SGSys'] == 'cubic':
    763765            BNSsym = {}
     
    765767    elif 'F' in SGData['SGLatt']:
    766768        if SGData['SGSys'] in ['monoclinic','orthorhombic','cubic','triclinic']:
    767             BNSsym = {'F(S)':[.5,.5,.5]}
     769            BNSsym = {'F_S':[.5,.5,.5]}
    768770           
    769771    elif 'R' in SGData['SGLatt']:
    770         BNSsym = {'R(I)':[0,0,.5]}
     772        BNSsym = {'R_I':[0,0,.5]}
    771773    return UsymOp,OprFlg,BNSsym
    772774
     
    776778    A = np.array(BNSlatt[1])
    777779    SGCen = SGData['SGCen']
    778     if '(a)' in BNS:
     780    if '_a' in BNS:
    779781        Tmat[0,0] = 2.0
    780     elif '(b)' in BNS:
     782    elif '_b' in BNS:
    781783        Tmat[1,1] = 2.0
    782     elif '(c)' in BNS:
     784    elif '_c' in BNS:
    783785        Tmat[2,2] = 2.0
    784     elif '(A)' in BNS:
     786    elif '_A' in BNS:
    785787        Tmat[0,0] = 2.0
    786     elif '(B)' in BNS:
     788    elif '_B' in BNS:
    787789        Tmat[1,1] = 2.0
    788     elif '(C)' in BNS:
     790    elif '_C' in BNS:
    789791        Tmat[2,2] = 2.0
    790     elif '(I)' in BNS:
     792    elif '_I' in BNS:
    791793        Tmat *= 2.0
    792794        SGData['SGSpin'][-1] = -1
    793795        if 'R' in BNS:
    794796            SGData['SGSpin'][-1] = -1
    795     elif '(S)' in BNS:
     797    elif '_S' in BNS:
    796798        SGData['SGSpin'][-1] = -1
    797799        SGData['SGSpin'] += [-1,-1,-1,]
     
    803805    SGData['SGCen'] = np.vstack((SGCen,C))%1.
    804806    return Tmat
    805    
     807       
    806808def CheckSpin(isym,SGData):
    807809    ''' Check for exceptions in spin rules
    808810    '''
    809     if SGData['SpGrp'] in ['C c','C 1 c 1','A a','A 1 a 1','B b 1 1','C c 1 1',
    810         'A 1 1 a','B 1 1 b','I -4']:
    811         if SGData['SGSpin'][:2] == [-1,-1]:
    812             SGData['SGSpin'][(isym+1)%2] = 1
    813     elif SGData['SpGrp'] in ['C 2/c','C 1 2/c 1','A 2/a','A 1 2/a 1','B 2/b 1 1','C 2/c 1 1',
    814         'A 1 1 2/a','B 1 1 2/b']:
    815         if SGData['SGSpin'][1:3] == [-1,-1]:
    816             SGData['SGSpin'][isym%2+1] = 1
    817     elif SGData['SGPtGrp'] in ['222','mm2','2mm','m2m']:
    818         if SGData['SGSpin'][0]*SGData['SGSpin'][1]*SGData['SGSpin'][2] < 0:
    819             SGData['SGSpin'][(isym+1)%3] *= -1
     811    if SGData['SGPtGrp'] in ['222','mm2','2mm','m2m']:      #only 2/3 can be red; not 1/3 or 3/3
     812        if SGData['SGSpin'][1]*SGData['SGSpin'][2]*SGData['SGSpin'][3] < 0:
     813            SGData['SGSpin'][(isym+1)%3+1] *= -1
    820814        if SGData['SpGrp'][0] == 'F' and isym > 2:
    821             SGData['SGSpin'][(isym+1)%3+3] *= -1
     815            SGData['SGSpin'][(isym+1)%3+3] == 1
    822816    elif SGData['SGPtGrp'] == 'mmm':
    823817        if SGData['SpGrp'][0] == 'F' and isym > 2:
    824             SGData['SGSpin'][(isym+1)%3+3] *= -1
    825         elif SGData['SGSpin'][3] < 0:
    826             if SGData['SpGrp'] in ['C m m a','A b m m','B m c m','B m a m','C m m b','A c m m',
    827                 'C c c a','A b a a','B b c b','B b a b','C c c b','A c a a','I b c a','I c a b']:
    828                 for i in [0,1,2]:
    829                     if i != isym and SGData['SGSpin'][i] < 0:
    830                         SGData['SGSpin'][i] = 1
    831             elif SGData['SpGrp'] in ['I m m a','I b m m','I m c m','I m a m','I m m b','I c m m']:
    832                 if SGData['SGSpin'][0]*SGData['SGSpin'][1]*SGData['SGSpin'][2] < 0:
    833                     SGData['SGSpin'][(isym+1)%3] *= -1
    834     elif SGData['SpGrp'] in ['I -4 m 2','I -4 c 2']:
    835         if SGData['SGSpin'][2] < 0:
    836             if 'm' in SGData['SpGrp']:
    837                 SGData['SGSpin'][1] = 1
    838             elif isym < 2:
    839                 if SGData['SGSpin'][isym] < 0:
    840                     SGData['SGSpin'][:2] = [-1,-1]
    841                 else:
    842                     SGData['SGSpin'][:2] = [1,1]
    843             else:
    844                 SGData['SGSpin'][:2] = [1,1]
    845    
     818            SGData['SGSpin'][(isym+1)%3+3] == 1
     819
    846820def MagSGSym(SGData):       #needs to use SGPtGrp not SGLaue!
    847821    SGLaue = SGData['SGLaue']
     
    10291003            Ptsym[1] += "'"
    10301004        SGData['MagPtGp'] = '3'.join(Ptsym)
    1031     elif SGData['SGPtGrp'] == 'm-3m':
     1005    elif SGData['SGPtGrp'] == 'm3m':
    10321006        Ptsym = ['m','3','m']
    10331007        if SpnFlp[1:3] == [-1,1]:
     
    10501024    magSym[0] = SGData.get('BNSlattsym',[SGData['SGLatt'],[0,0,0]])[0]
    10511025    return ' '.join(magSym)
    1052    
     1026
    10531027def MagText2MTS(mcifOpr,CIF=True):
    10541028    "From magnetic space group cif text returns matrix/translation + spin flip"
    10551029    XYZ = {'x':[1,0,0],'+x':[1,0,0],'-x':[-1,0,0],'y':[0,1,0],'+y':[0,1,0],'-y':[0,-1,0],
    1056            'z':[0,0,1],'+z':[0,0,1],'-z':[0,0,-1],'x-y':[1,-1,0],'-x+y':[-1,1,0],'y-x':[-1,1,0]}
     1030           'z':[0,0,1],'+z':[0,0,1],'-z':[0,0,-1],'x-y':[1,-1,0],'-x+y':[-1,1,0],'y-x':[-1,1,0],
     1031           '+x-y':[1,-1,0],'+y-x':[-1,1,0]}
    10571032    ops = mcifOpr.split(",")
    10581033    M = []
     
    11081083    Ncv = len(SGData['SGCen'])
    11091084    sgOp = [M for M,T in SGData['SGOps']]
    1110     OprName = [GetOprPtrName(str(irtx))[1] for irtx in PackRot(SGData['SGOps'])]
    1111     if SGData['SGInv'] and not SGData.get('SGFixed',False):
     1085    oprName = [GetOprPtrName(str(irtx)) for irtx in PackRot(SGData['SGOps'])]
     1086    if SGData['SGInv'] and not SGData['SGFixed'] and not SGData['SGGray']:
    11121087        Nsym *= 2
    11131088        sgOp += [-M for M,T in SGData['SGOps']]
    1114         OprName += [GetOprPtrName(str(-irtx))[1] for irtx in PackRot(SGData['SGOps'])]
     1089        oprName += [GetOprPtrName(str(-irtx)) for irtx in PackRot(SGData['SGOps'])]
    11151090    Nsyms = 0
    11161091    sgOps = []
     
    11191094        Nsyms += Nsym
    11201095        sgOps += sgOp
    1121         OprNames += OprName   
     1096        OprNames += oprName   
    11221097    SpnFlp = np.ones(Nsym,dtype=np.int)
    11231098    GenFlg = SGData.get('GenFlg',[0])
     1099    Ngen = len(SGData['SGGen'])
    11241100#    print ('GenFlg:',SGData['GenFlg'])
    11251101#    print ('GenSym:',SGData['GenSym'])
     
    11271103    for ieqv in range(Nsym):
    11281104        for iunq in range(Nfl):
    1129             if SGData['SGGen'][ieqv] & GenFlg[iunq]:
     1105            if SGData['SGGen'][ieqv%Ngen] & GenFlg[iunq]:
    11301106                SpnFlp[ieqv] *= FlpSpn[iunq]
    11311107#        print ('\nMagSpGrp:',SGData['MagSpGrp'],Ncv)
     
    18011777    :param Move: True move generated atom positions to be inside cell
    18021778      False do not move atoms       
    1803     :return: [[XYZEquiv],Idup,[UijEquiv]]
     1779    :return: [[XYZEquiv],Idup,[UijEquiv],spnflp]
    18041780
    18051781      *  [XYZEquiv] is list of equivalent positions (XYZ is first entry)
     
    18081784        Cell = unit cell translations needed to put new positions inside cell
    18091785        [UijEquiv] - equivalent Uij; absent if no Uij given
     1786      * +1/-1 for spin inversion of operator - empty if not magnetic
    18101787       
    18111788    '''
     
    18181795    if SGData['SGFixed']:
    18191796        inv = 1
     1797    SpnFlp = SGData.get('SpnFlp',[])
     1798    spnflp = []
    18201799    X = np.array(XYZ)
     1800    mj = 0
    18211801    if Move:
    18221802        X = MoveToUnitCell(X)[0]
     
    18521832                    Cell.append(cell)
    18531833                    if len(Uij):
    1854                         UijEquiv.append(newUij)                   
     1834                        UijEquiv.append(newUij)
     1835                    if len(SpnFlp):
     1836                        spnflp.append(SpnFlp[mj])
     1837                    else:
     1838                        spnflp.append(1)
     1839                mj += 1
    18551840    if len(Uij):
    1856         return zip(XYZEquiv,UijEquiv,Idup,Cell)
     1841        return zip(XYZEquiv,UijEquiv,Idup,Cell,spnflp)
    18571842    else:
    1858         return zip(XYZEquiv,Idup,Cell)
     1843        return zip(XYZEquiv,Idup,Cell,spnflp)
    18591844       
    18601845def GenHKL(HKL,SGData):
     
    19641949#### Site symmetry tables
    19651950################################################################################
    1966    
    1967 OprPtrName = {
    1968     '-6643':[   2,' 1bar ', 1],'6479' :[  10,'  2z  ', 2],'-6479':[   9,'  mz  ', 3],
    1969     '6481' :[   7,'  my  ', 4],'-6481':[   6,'  2y  ', 5],'6641' :[   4,'  mx  ', 6],
    1970     '-6641':[   3,'  2x  ', 7],'6591' :[  28,' m+-0 ', 8],'-6591':[  27,' 2+-0 ', 9],
    1971     '6531' :[  25,' m110 ',10],'-6531':[  24,' 2110 ',11],'6537' :[  61,'  4z  ',12],
    1972     '-6537':[  62,' -4z  ',13],'975'  :[  68,' 3+++1',14],'6456' :[ 114,'  3z1 ',15],
    1973     '-489' :[  73,' 3+-- ',16],'483'  :[  78,' 3-+- ',17],'-969' :[  83,' 3--+ ',18],
    1974     '819'  :[  22,' m+0- ',19],'-819' :[  21,' 2+0- ',20],'2431' :[  16,' m0+- ',21],
    1975     '-2431':[  15,' 20+- ',22],'-657' :[  19,' m101 ',23],'657'  :[  18,' 2101 ',24],
    1976     '1943' :[  48,' -4x  ',25],'-1943':[  47,'  4x  ',26],'-2429':[  13,' m011 ',27],
    1977     '2429' :[  12,' 2011 ',28],'639'  :[  55,' -4y  ',29],'-639' :[  54,'  4y  ',30],
    1978     '-6484':[ 146,' 2010 ', 4],'6484' :[ 139,' m010 ', 5],'-6668':[ 145,' 2100 ', 6],
    1979     '6668' :[ 138,' m100 ', 7],'-6454':[ 148,' 2120 ',18],'6454' :[ 141,' m120 ',19],
    1980     '-6638':[ 149,' 2210 ',20],'6638' :[ 142,' m210 ',21],              #search ends here
    1981     '2223' :[  68,' 3+++2',39],
    1982     '6538' :[ 106,'  6z1 ',40],'-2169':[  83,' 3--+2',41],'2151' :[  73,' 3+--2',42],
    1983     '2205' :[  79,'-3-+-2',43],'-2205':[  78,' 3-+-2',44],'489'  :[  74,'-3+--1',45],
    1984     '801'  :[  53,'  4y1 ',46],'1945' :[  47,'  4x3 ',47],'-6585':[  62,' -4z3 ',48],
    1985     '6585' :[  61,'  4z3 ',49],'6584' :[ 114,'  3z2 ',50],'6666' :[ 106,'  6z5 ',51],
    1986     '6643' :[   1,' Iden ',52],'-801' :[  55,' -4y1 ',53],'-1945':[  48,' -4x3 ',54],
    1987     '-6666':[ 105,' -6z5 ',55],'-6538':[ 105,' -6z1 ',56],'-2223':[  69,'-3+++2',57],
    1988     '-975' :[  69,'-3+++1',58],'-6456':[ 113,' -3z1 ',59],'-483' :[  79,'-3-+-1',60],
    1989     '969'  :[  84,'-3--+1',61],'-6584':[ 113,' -3z2 ',62],'2169' :[  84,'-3--+2',63],
    1990     '-2151':[  74,'-3+--2',64],'0':[0,' ????',0]
    1991     }
    1992    
     1951     
    19931952OprName = {
    1994     '-6643':'   -1   ','6479' :'    2(z)','-6479':'    m(z)',
    1995     '6481' :'    m(y)','-6481':'    2(y)','6641' :'    m(x)',
    1996     '-6641':'    2(x)','6591' :'  m(+-0)','-6591':'  2(+-0)',
    1997     '6531' :' m(110) ','-6531':' 2(110) ','6537' :'  4(001)',
    1998     '-6537':' -4(001)','975'  :'  3(111)','6456' :'    3   ',
    1999     '-489' :'  3(+--)','483'  :'  3(-+-)','-969' :'  3(--+)',
    2000     '819'  :'  m(+0-)','-819' :'  2(+0-)','2431' :'  m(0+-)',
    2001     '-2431':'  2(0+-)','-657' :'   m(xz)','657'  :'   2(xz)',
    2002     '1943' :' -4(100)','-1943':'  4(100)','-2429':'   m(yz)',
    2003     '2429' :'   2(yz)','639'  :' -4(010)','-639' :'  4(010)',
    2004     '-6484':' 2(010) ','6484' :' m(010) ','-6668':' 2(100) ',
    2005     '6668' :' m(100) ','-6454':' 2(120) ','6454' :' m(120) ',
    2006     '-6638':' 2(210) ','6638' :' m(210) '}              #search ends here
    2007    
    2008                                  
     1953    '-6643':       ['-1',1],'6479' :    ['2(z)',2],'-6479':     ['m(z)',3],
     1954    '6481' :     ['m(y)',4],'-6481':    ['2(y)',5],'6641' :     ['m(x)',6],
     1955    '-6641':     ['2(x)',7],'6591' :  ['m(+-0)',8],'-6591':   ['2(+-0)',9],
     1956    '6531' :  ['m(110)',10],'-6531': ['2(110)',11],'6537' :    ['4(z)',12],
     1957    '-6537':   ['-4(z)',13],'975'  : ['3(111)',14],'6456' :       ['3',15],
     1958    '-489' :  ['3(+--)',16],'483'  : ['3(-+-)',17],'-969' :  ['3(--+)',18],
     1959    '819'  :  ['m(+0-)',19],'-819' : ['2(+0-)',20],'2431' :  ['m(0+-)',21],
     1960    '-2431':  ['2(0+-)',22],'-657' :  ['m(xz)',23],'657'  :   ['2(xz)',24],
     1961    '1943' :   ['-4(x)',25],'-1943':   ['4(x)',26],'-2429':   ['m(yz)',27],
     1962    '2429' :   ['2(yz)',28],'639'  :  ['-4(y)',29],'-639' :    ['4(y)',30],
     1963    '-6484':   ['2(010)',4],'6484' :  ['m(010)',5],'-6668':   ['2(100)',6],
     1964    '6668' :   ['m(100)',7],'-6454': ['2(120)',18],'6454' :  ['m(120)',19],
     1965    '-6638':  ['2(210)',20],'6638' : ['m(210)',21],   #search in SytSym ends at m(210)
     1966    '2223' : ['3(+++)2',39],
     1967    '6538' :   ['6(z)1',40],'-2169':['3(--+)2',41],'2151' : ['3(+--)2',42],
     1968    '2205' :['-3(-+-)2',43],'-2205':[' (-+-)2',44],'489'  :['-3(+--)1',45],
     1969    '801'  :   ['4(y)1',46],'1945' :  ['4(x)3',47],'-6585': ['-4(z)3 ',48],
     1970    '6585' :   ['4(z)3',49],'6584' :  ['3(z)2',50],'6666' :  ['6(z)5 ',51],
     1971    '6643' :       ['1',52],'-801' : ['-4(y)1',53],'-1945': ['-4(x)3 ',54],
     1972    '-6666':  ['-6(z)5',55],'-6538': ['-6(z)1',56],'-2223':['-3(+++)2',57],
     1973    '-975' :['-3(+++)1',58],'-6456': ['-3(z)1',59],'-483' :['-3(-+-)1',60],
     1974    '969'  :['-3(--+)1',61],'-6584': ['-3(z)2',62],'2169' :['-3(--+)2',63],
     1975    '-2151':['-3(+--)2',64],   }                               
     1976
    20091977KNsym = {
    20101978    '0'         :'    1   ','1'         :'   -1   ','64'        :'    2(x)','32'        :'    m(x)',
     
    20191987    '1156'      :' mm2(xy)','772'       :'mm2(+-0)','82'        :'  222   ','136314944' :'  222(x)',
    20201988    '8912912'   :'  222(y)','1282'      :'  222(z)','127'       :'  mmm   ','204472417' :'  mmm(x)',
    2021     '13369369'  :'  mmm(y)','1927'      :'  mmm(z)','33554496'  :'  4(100)','16777280'  :' -4(100)',
    2022     '50331745'  :'4/m(100)','169869394' :'422(100)','84934738'  :'-42m 100','101711948' :'4mm(100)',
    2023     '254804095' :'4/mmm100','536870928 ':'  4(010)','268435472' :' -4(010)','805306393' :'4/m (10)',
    2024     '545783890' :'422(010)','272891986' :'-42m 010','541327412' :'4mm(010)','818675839' :'4/mmm010',
    2025     '2050'      :'  4(001)','4098'      :' -4(001)','6151'      :'4/m(001)','3410'      :'422(001)',
    2026     '4818'      :'-42m 001','2730'      :'4mm(001)','8191'      :'4/mmm001','8192'      :'  3(111)',
     1989    '13369369'  :'  mmm(y)','1927'      :'  mmm(z)','33554496'  :'  4(x)','16777280'  :' -4(x)',
     1990    '50331745'  :'4/m(x)'  ,'169869394' :'422(x)','84934738'  :'-42m(x)','101711948' :'4mm(x)',
     1991    '254804095' :'4/mmm(x)','536870928 ':'  4(y)','268435472' :' -4(y)','805306393' :'4/m(y)',
     1992    '545783890' :'422(y)','272891986' :'-42m(y)','541327412' :'4mm(y)','818675839' :'4/mmm(y)',
     1993    '2050'      :'  4(z)','4098'      :' -4(z)','6151'      :'4/m(z)','3410'      :'422(z)',
     1994    '4818'      :'-42m(z)','2730'      :'4mm(z)','8191'      :'4/mmm(z)','8192'      :'  3(111)',
    20271995    '8193'      :' -3(111)','2629888'   :' 32(111)','1319040'   :' 3m(111)','3940737'   :'-3m(111)',
    20281996    '32768'     :'  3(+--)','32769'     :' -3(+--)','10519552'  :' 32(+--)','5276160'   :' 3m(+--)',
     
    20311999    '142737664' :' 32(--+)','71434368'  :' 3m(--+)','214040961' :'-3m(--+)','237650'    :'   23   ',
    20322000    '237695'    :'   m3   ','715894098' :'   432  ','358068946' :'  -43m  ','1073725439':'   m3m  ',
    2033     '68157504'  :' mm2d100','4456464'   :' mm2d010','642'       :' mm2d001','153092172' :'-4m2 100',
    2034     '277348404' :'-4m2 010','5418'      :'-4m2 001','1075726335':'  6/mmm ','1074414420':'-6m2 100',
    2035     '1075070124':'-6m2 120','1075069650':'   6mm  ','1074414890':'   622  ','1073758215':'   6/m  ',
     2001    '68157504'  :' mm2(d100)','4456464'   :' mm2(d010)','642'       :' mm2(d001)','153092172' :'-4m2(x)',
     2002    '277348404' :'-4m2(y)','5418'      :'-4m2(z)','1075726335':'  6/mmm ','1074414420':'-6m2(100)',
     2003    '1075070124':'-6m2(120)','1075069650':'   6mm  ','1074414890':'   622  ','1073758215':'   6/m  ',
    20362004    '1073758212':'   -6   ','1073758210':'    6   ','1073759865':'-3m(100)','1075724673':'-3m(120)',
    20372005    '1073758800':' 3m(100)','1075069056':' 3m(120)','1073759272':' 32(100)','1074413824':' 32(120)',
    20382006    '1073758209':'   -3   ','1073758208':'    3   ','1074135143':'mmm(100)','1075314719':'mmm(010)',
    2039     '1073743751':'mmm(110)','1074004034':' mm2z100','1074790418':' mm2z010','1073742466':' mm2z110',
     2007    '1073743751':'mmm(110)','1074004034':' mm2(z100)','1074790418':' mm2(z010)','1073742466':' mm2(z110)',
    20402008    '1074004004':'mm2(100)','1074790412':'mm2(010)','1073742980':'mm2(110)','1073872964':'mm2(120)',
    20412009    '1074266132':'mm2(210)','1073742596':'mm2(+-0)','1073872930':'222(100)','1074266122':'222(010)',
     
    20492017
    20502018NXUPQsym = {
    2051     '    1   ':(28,29,28,28),'   -1   ':( 1,29,28, 0),'    2(x)':(12,18,12,25),'    m(x)':(25,18,12,25),
    2052     '  2/m(x)':( 1,18, 0,-1),'    2(y)':(13,17,13,24),'    m(y)':(24,17,13,24),'  2/m(y)':( 1,17, 0,-1),
    2053     '    2(z)':(14,16,14,23),'    m(z)':(23,16,14,23),'  2/m(z)':( 1,16, 0,-1),'   2(yz)':(10,23,10,22),
    2054     '   m(yz)':(22,23,10,22),' 2/m(yz)':( 1,23, 0,-1),'  2(0+-)':(11,24,11,21),'  m(0+-)':(21,24,11,21),
    2055     '2/m(0+-)':( 1,24, 0,-1),'   2(xz)':( 8,21, 8,20),'   m(xz)':(20,21, 8,20),' 2/m(xz)':( 1,21, 0,-1),
    2056     '  2(+0-)':( 9,22, 9,19),'  m(+0-)':(19,22, 9,19),'2/m(+0-)':( 1,22, 0,-1),'   2(xy)':( 6,19, 6,18),
    2057     '   m(xy)':(18,19, 6,18),' 2/m(xy)':( 1,19, 0,-1),'  2(+-0)':( 7,20, 7,17),'  m(+-0)':(17,20, 7,17),
    2058     '2/m(+-0)':( 1,20, 17,-1),'  mm2(x)':(12,10, 0,-1),'  mm2(y)':(13,10, 0,-1),'  mm2(z)':(14,10, 0,-1),
    2059     ' mm2(yz)':(10,13, 0,-1),'mm2(0+-)':(11,13, 0,-1),' mm2(xz)':( 8,12, 0,-1),'mm2(+0-)':( 9,12, 0,-1),
    2060     ' mm2(xy)':( 6,11, 0,-1),'mm2(+-0)':( 7,11, 0,-1),'  222   ':( 1,10, 0,-1),'  222(x)':( 1,13, 0,-1),
    2061     '  222(y)':( 1,12, 0,-1),'  222(z)':( 1,11, 0,-1),'  mmm   ':( 1,10, 0,-1),'  mmm(x)':( 1,13, 0,-1),
    2062     '  mmm(y)':( 1,12, 0,-1),'  mmm(z)':( 1,11, 0,-1),'  4(100)':(12, 4,12, 0),' -4(100)':( 1, 4,12, 0),
    2063     '4/m(100)':( 1, 4,12,-1),'422(100)':( 1, 4, 0,-1),'-42m 100':( 1, 4, 0,-1),'4mm(100)':(12, 4, 0,-1),
    2064     '4/mmm100':( 1, 4, 0,-1),'  4(010)':(13, 3,13, 0),' -4(010)':( 1, 3,13, 0),'4/m (10)':( 1, 3,13,-1),
    2065     '422(010)':( 1, 3, 0,-1),'-42m 010':( 1, 3, 0,-1),'4mm(010)':(13, 3, 0,-1),'4/mmm010':(1, 3, 0,-1,),
    2066     '  4(001)':(14, 2,14, 0),' -4(001)':( 1, 2,14, 0),'4/m(001)':( 1, 2,14,-1),'422(001)':( 1, 2, 0,-1),
    2067     '-42m 001':( 1, 2, 0,-1),'4mm(001)':(14, 2, 0,-1),'4/mmm001':( 1, 2, 0,-1),'  3(111)':( 2, 5, 2, 0),
    2068     ' -3(111)':( 1, 5, 2, 0),' 32(111)':( 1, 5, 0, 2),' 3m(111)':( 2, 5, 0, 2),'-3m(111)':( 1, 5, 0,-1),
    2069     '  3(+--)':( 5, 8, 5, 0),' -3(+--)':( 1, 8, 5, 0),' 32(+--)':( 1, 8, 0, 5),' 3m(+--)':( 5, 8, 0, 5),
    2070     '-3m(+--)':( 1, 8, 0,-1),'  3(-+-)':( 4, 7, 4, 0),' -3(-+-)':( 1, 7, 4, 0),' 32(-+-)':( 1, 7, 0, 4),
    2071     ' 3m(-+-)':( 4, 7, 0, 4),'-3m(-+-)':( 1, 7, 0,-1),'  3(--+)':( 3, 6, 3, 0),' -3(--+)':( 1, 6, 3, 0),
    2072     ' 32(--+)':( 1, 6, 0, 3),' 3m(--+)':( 3, 6, 0, 3),'-3m(--+)':( 1, 6, 0,-1),'   23   ':( 1, 1, 0, 0),
    2073     '   m3   ':( 1, 1, 0, 0),'   432  ':( 1, 1, 0, 0),'  -43m  ':( 1, 1, 0, 0),'   m3m  ':( 1, 1, 0, 0),
    2074     ' mm2d100':(12,13, 0,-1),' mm2d010':(13,12, 0,-1),' mm2d001':(14,11, 0,-1),'-4m2 100':( 1, 4, 0,-1),
    2075     '-4m2 010':( 1, 3, 0,-1),'-4m2 001':( 1, 2, 0,-1),'  6/mmm ':( 1, 9, 0,-1),'-6m2 100':( 1, 9, 0,-1),
    2076     '-6m2 120':( 1, 9, 0,-1),'   6mm  ':(14, 9, 0,-1),'   622  ':( 1, 9, 0,-1),'   6/m  ':( 1, 9,14,-1),
    2077     '   -6   ':( 1, 9,14, 0),'    6   ':(14, 9,14, 0),'-3m(100)':( 1, 9, 0,-1),'-3m(120)':( 1, 9, 0,-1),
    2078     ' 3m(100)':(14, 9, 0,14),' 3m(120)':(14, 9, 0,14),' 32(100)':( 1, 9, 0,14),' 32(120)':( 1, 9, 0,14),
    2079     '   -3   ':( 1, 9,14, 0),'    3   ':(14, 9,14, 0),'mmm(100)':( 1,14, 0,-1),'mmm(010)':( 1,15, 0,-1),
    2080     'mmm(110)':( 1,11, 0,-1),' mm2z100':(14,14, 0,-1),' mm2z010':(14,15, 0,-1),' mm2z110':(14,11, 0,-1),
    2081     'mm2(100)':(12,14, 0,-1),'mm2(010)':(13,15, 0,-1),'mm2(110)':( 6,11, 0,-1),'mm2(120)':(15,14, 0,-1),
    2082     'mm2(210)':(16,15, 0,-1),'mm2(+-0)':( 7,11, 0,-1),'222(100)':( 1,14, 0,-1),'222(010)':( 1,15, 0,-1),
    2083     '222(110)':( 1,11, 0,-1),'2/m(001)':( 1,16,14,-1),'2/m(100)':( 1,25,12,-1),'2/m(010)':( 1,28,13,-1),
    2084     '2/m(110)':( 1,19, 6,-1),'2/m(120)':( 1,27,15,-1),'2/m(210)':( 1,26,16,-1),'2/m(+-0)':( 1,20,17,-1),
    2085     ' m(001) ':(23,16,14,23),' m(100) ':(26,25,12,26),' m(010) ':(27,28,13,27),' m(110) ':(18,19, 6,18),
    2086     ' m(120) ':(24,27,15,24),' m(210) ':(25,26,16,25),' m(+-0) ':(17,20, 7,17),' 2(001) ':(14,16,14,23),
    2087     ' 2(100) ':(12,25,12,26),' 2(010) ':(13,28,13,27),' 2(110) ':( 6,19, 6,18),' 2(120) ':(15,27,15,24),
    2088     ' 2(210) ':(16,26,16,25),' 2(+-0) ':( 7,20, 7,17),'   -1   ':( 1,29,28, 0)
     2019    '1'        :(28,29,28,28),'-1'       :( 1,29,28, 0),'2(x)'     :(12,18,12,25),'m(x)'     :(25,18,12,25),
     2020    '2/m(x)'   :( 1,18, 0,-1),'2(y)'     :(13,17,13,24),'m(y)'     :(24,17,13,24),'2/m(y)'   :( 1,17, 0,-1),
     2021    '2(z)'     :(14,16,14,23),'m(z)'     :(23,16,14,23),'2/m(z)'   :( 1,16, 0,-1),'2(yz)'    :(10,23,10,22),
     2022    'm(yz)'    :(22,23,10,22),' 2/m(yz)' :( 1,23, 0,-1),'2(0+-)'   :(11,24,11,21),'m(0+-)'   :(21,24,11,21),
     2023    '2/m(0+-)' :( 1,24, 0,-1),'2(xz)'    :( 8,21, 8,20),'m(xz)'    :(20,21, 8,20),'2/m(xz)'  :( 1,21, 0,-1),
     2024    '2(+0-)'   :( 9,22, 9,19),'m(+0-)'   :(19,22, 9,19),'2/m(+0-)' :( 1,22, 0,-1),'2(xy)'    :( 6,19, 6,18),
     2025    'm(xy)'    :(18,19, 6,18),' 2/m(xy)' :( 1,19, 0,-1),'2(+-0)'   :( 7,20, 7,17),'m(+-0)'   :(17,20, 7,17),
     2026    '2/m(+-0)' :( 1,20, 17,-1),'mm2(x)'  :(12,10, 0,-1),'mm2(y)'   :(13,10, 0,-1),'mm2(z)'   :(14,10, 0,-1),
     2027    'mm2(yz)'  :(10,13, 0,-1),'mm2(0+-)' :(11,13, 0,-1),'mm2(xz)'  :( 8,12, 0,-1),'mm2(+0-)' :( 9,12, 0,-1),
     2028    'mm2(xy)'  :( 6,11, 0,-1),'mm2(+-0)' :( 7,11, 0,-1),'222'      :( 1,10, 0,-1),'222(x)'   :( 1,13, 0,-1),
     2029    '222(y)'   :( 1,12, 0,-1),'222(z)'   :( 1,11, 0,-1),'mmm'      :( 1,10, 0,-1),'mmm(x)'   :( 1,13, 0,-1),
     2030    'mmm(y)'   :( 1,12, 0,-1),'mmm(z)'   :( 1,11, 0,-1),'4(x)'     :(12, 4,12, 0),'-4(x)'    :( 1, 4,12, 0),
     2031    '4/m(x)'   :( 1, 4,12,-1),'422(x)'   :( 1, 4, 0,-1),'-42m(x)'  :( 1, 4, 0,-1),'4mm(x)'   :(12, 4, 0,-1),
     2032    '4/mmm(x)' :( 1, 4, 0,-1),'4(y)'     :(13, 3,13, 0),'-4(y)'    :( 1, 3,13, 0),'4/m(y)'   :( 1, 3,13,-1),
     2033    '422(y)'   :( 1, 3, 0,-1),'-42m(y)'  :( 1, 3, 0,-1),'4mm(y)'   :(13, 3, 0,-1),'4/mmm(y)' :(1, 3, 0,-1,),
     2034    '4(z)'     :(14, 2,14, 0),'-4(z)'    :( 1, 2,14, 0),'4/m(z)'   :( 1, 2,14,-1),'422(z)'   :( 1, 2, 0,-1),
     2035    '-42m(z)'  :( 1, 2, 0,-1),'4mm(z)'   :(14, 2, 0,-1),'4/mmm(z)' :( 1, 2, 0,-1),'3(111)'   :( 2, 5, 2, 0),
     2036    '-3(111)'  :( 1, 5, 2, 0),'32(111)'  :( 1, 5, 0, 2),'3m(111)'  :( 2, 5, 0, 2),'-3m(111)' :( 1, 5, 0,-1),
     2037    '3(+--)'   :( 5, 8, 5, 0),'-3(+--)'  :( 1, 8, 5, 0),'32(+--)'  :( 1, 8, 0, 5),'3m(+--)'  :( 5, 8, 0, 5),
     2038    '-3m(+--)' :( 1, 8, 0,-1),'3(-+-)'   :( 4, 7, 4, 0),'-3(-+-)'  :( 1, 7, 4, 0),'32(-+-)'  :( 1, 7, 0, 4),
     2039    '3m(-+-)'  :( 4, 7, 0, 4),'-3m(-+-)' :( 1, 7, 0,-1),'3(--+)'   :( 3, 6, 3, 0),'-3(--+)'  :( 1, 6, 3, 0),
     2040    '32(--+)'  :( 1, 6, 0, 3),'3m(--+)'  :( 3, 6, 0, 3),'-3m(--+)' :( 1, 6, 0,-1),'23'       :( 1, 1, 0, 0),
     2041    'm3'       :( 1, 1, 0, 0),'432'      :( 1, 1, 0, 0),'-43m'     :( 1, 1, 0, 0),'m3m'      :( 1, 1, 0, 0),
     2042    'mm2(d100)':(12,13, 0,-1),'mm2(d010)':(13,12, 0,-1),'mm2(d001)':(14,11, 0,-1),'-4m2(x)'  :( 1, 4, 0,-1),
     2043    '-4m2(y)'  :( 1, 3, 0,-1),'-4m2(z)'  :( 1, 2, 0,-1),'6/mmm'    :( 1, 9, 0,-1),'-6m2(100)':( 1, 9, 0,-1),
     2044    '-6m2(120)':( 1, 9, 0,-1),'6mm'      :(14, 9, 0,-1),'622'      :( 1, 9, 0,-1),'6/m'      :( 1, 9,14,-1),
     2045    '-6'       :( 1, 9,14, 0),'6'        :(14, 9,14, 0),'-3m(100)' :( 1, 9, 0,-1),'-3m(120)' :( 1, 9, 0,-1),
     2046    '3m(100)'  :(14, 9, 0,14),'3m(120)'  :(14, 9, 0,14),'32(100)'  :( 1, 9, 0,14),'32(120)'  :( 1, 9, 0,14),
     2047    '-3'       :( 1, 9,14, 0),'3'        :(14, 9,14, 0),'mmm(100)' :( 1,14, 0,-1),'mmm(010)' :( 1,15, 0,-1),
     2048    'mmm(110)' :( 1,11, 0,-1),'mm2(z100)':(14,14, 0,-1),'mm2(z010)':(14,15, 0,-1),'mm2(z110)':(14,11, 0,-1),
     2049    'mm2(100)' :(12,14, 0,-1),'mm2(010)' :(13,15, 0,-1),'mm2(110)' :( 6,11, 0,-1),'mm2(120)' :(15,14, 0,-1),
     2050    'mm2(210)' :(16,15, 0,-1),'mm2(+-0)' :( 7,11, 0,-1),'222(100)' :( 1,14, 0,-1),'222(010)' :( 1,15, 0,-1),
     2051    '222(110)' :( 1,11, 0,-1),'2/m(001)' :( 1,16,14,-1),'2/m(100)' :( 1,25,12,-1),'2/m(010)' :( 1,28,13,-1),
     2052    '2/m(110)' :( 1,19, 6,-1),'2/m(120)' :( 1,27,15,-1),'2/m(210)' :( 1,26,16,-1),'2/m(+-0)' :( 1,20,17,-1),
     2053    'm(001)'   :(23,16,14,23),'m(100)'   :(26,25,12,26),'m(010)'   :(27,28,13,27),'m(110)'   :(18,19, 6,18),
     2054    'm(120)'   :(24,27,15,24),'m(210)'   :(25,26,16,25),'m(+-0)'   :(17,20, 7,17),'2(001)'   :(14,16,14,23),
     2055    '2(100)'   :(12,25,12,26),'2(010)'   :(13,28,13,27),'2(110)'   :( 6,19, 6,18),'2(120)'   :(15,27,15,24),
     2056    '2(210)'   :(16,26,16,25),'2(+-0)'   :( 7,20, 7,17),'-1'       :( 1,29,28, 0)
    20892057    }
    20902058       
     
    21582126def GetOprPtrName(key):
    21592127    'Needs a doc string'
    2160     return OprPtrName[key]
     2128    oprName = OprName[key][0]
     2129    return oprName.replace('(','').replace(')','')
     2130
     2131def GetOprPtrNumber(key):
     2132    'Needs a doc string'
     2133    return OprName[key][1]
    21612134
    21622135def GetOprName(key):
    21632136    'Needs a doc string'
    2164     return OprName[key]
     2137    return OprName[key][0]
    21652138
    21662139def GetKNsym(key):
    21672140    'Needs a doc string'
    21682141    try:
    2169         return KNsym[key]
     2142        return KNsym[key].strip()
    21702143    except KeyError:
    21712144        return 'sp'
     
    21792152def GetCSxinel(siteSym): 
    21802153    "returns Xyz terms, multipliers, GUI flags"
    2181     indx = GetNXUPQsym(siteSym)
     2154    indx = GetNXUPQsym(siteSym.strip())
    21822155    return CSxinel[indx[0]]
    21832156   
    21842157def GetCSuinel(siteSym):
    21852158    "returns Uij terms, multipliers, GUI flags & Uiso2Uij multipliers"
    2186     indx = GetNXUPQsym(siteSym)
     2159    indx = GetNXUPQsym(siteSym.strip())
    21872160    return CSuinel[indx[1]]
    21882161   
     
    21902163    "returns Mxyz terms, multipliers, GUI flags"
    21912164    CSI = [[1,2,3],[1.0,1.0,1.0]]
    2192     for opr in dupDir:
     2165    for sopr in dupDir:
     2166#        print (sopr,dupDir[sopr])
     2167        opr = sopr.replace("'",'')
    21932168        indx = GetNXUPQsym(opr)
    2194         if SpnFlp[dupDir[opr]] > 0.:
     2169        if SpnFlp[dupDir[sopr]] > 0:
    21952170            csi = CSxinel[indx[2]]  #P
    21962171        else:
    21972172            csi = CSxinel[indx[3]]  #Q
    2198 #        print(opr,SpnFlp[dupDir[opr]],indx,csi,CSI)
     2173#        print(opr,indx,csi,CSI)
    21992174        if not len(csi):
    22002175            return [[0,0,0],[0.,0.,0.]]
     
    28732848    return np.sqrt(np.sum(XYZ**2)/900.)
    28742849   
    2875    
    28762850def Muiso2Shkl(muiso,SGData,cell):
    28772851    "this is to convert isotropic mustrain to generalized Shkls"
     
    29332907    :param XYZ: an array, tuple or list containing 3 elements: x, y & z
    29342908    :param SGData: from SpcGroup
    2935     :Returns: a two element tuple:
     2909    :Returns: a four element tuple:
    29362910
    29372911     * The 1st element is a code for the site symmetry (see GetKNsym)
    29382912     * The 2nd element is the site multiplicity
     2913     * Ndup number of overlapping operators
     2914     * dupDir Dict - dictionary of overlapping operators
    29392915
    29402916    '''
     
    29512927        inv = 1
    29522928    Xeqv = GenAtom(XYZ,SGData,True)
     2929#    for xeqv in Xeqv:   print(xeqv)
    29532930    IRT = PackRot(SGData['SGOps'])
    29542931    L = -1
     
    29612938                    Ndup = io
    29622939                    Jdup += 1
    2963                     jx = GetOprPtrName(str(irtx))   #[KN table no,op name,KNsym ptr]
    2964                     if jx[2] < 39:
     2940                    jx = GetOprPtrNumber(str(irtx))   #[KN table no,op name,KNsym ptr]
     2941                    if jx < 39:
    29652942                        px = GetOprName(str(irtx))
    2966                         if px != '6643':    #skip Iden
    2967                             dupDir[px] = io
    2968                         Isym += 2**(jx[2]-1)
     2943                        if Xeqv[L][-1] < 0:
     2944                            if '(' in px:
     2945                                px = px.split('(')
     2946                                px[0] += "'"
     2947                                px = '('.join(px)
     2948                            else:   
     2949                                px += "'"
     2950                        dupDir[px] = L
     2951                        Isym += 2**(jx-1)
    29692952    if Isym == 1073741824: Isym = 0
    29702953    Mult = len(SGData['SGOps'])*len(SGData['SGCen'])*(int(SGData['SGInv'])+1)//Jdup
     
    29722955    return GetKNsym(str(Isym)),Mult,Ndup,dupDir
    29732956   
     2957def MagSytSym(SytSym,dupDir,SGData):
     2958    '''
     2959    site sym operations: 1,-1,2,3,-3,4,-4,6,-6,m need to be marked if spin inversion
     2960    '''
     2961    SGData['GenSym'],SGData['GenFlg'] = GetGenSym(SGData)[:2]
     2962#    print('SGPtGrp',SGData['SGPtGrp'],'SytSym',SytSym,'MagSpGrp',SGData['MagSpGrp'])
     2963#    print('dupDir',dupDir)
     2964    SplitSytSym = SytSym.split('(')
     2965    if SytSym == '1':       #genersl position
     2966        return SytSym
     2967    if SplitSytSym[0] == SGData['SGPtGrp']:     #simple cases
     2968        try:
     2969            MagSytSym = SGData['MagSpGrp'].split()[1]
     2970        except IndexError:
     2971            MagSytSym = SGData['MagSpGrp'][1:].strip("1'")
     2972        if len(SplitSytSym) > 1:
     2973            MagSytSym += '('+SplitSytSym[1]
     2974        return MagSytSym
     2975    if len(dupDir) == 1:
     2976        return dupDir.keys()[0]
     2977   
     2978   
     2979    if '2/m' in SytSym:         #done I think; last 2wo might be not needed
     2980        ops = {'(x)':['2(x)','m(x)'],'(y)':['2(y)','m(y)'],'(z)':['2(z)','m(z)'],
     2981               '(100)':['2(100)','m(100)'],'(010)':['2(010)','m(010)'],'(001)':['2(001)','m(001)'],
     2982               '(120)':['2(120)','m(120)'],'(210)':['2(210)','m(210)'],'(+-0)':['2(+-0)','m(+-0)'],
     2983               '(110)':['2(110)','m(110)']}
     2984   
     2985    elif '4/mmm' in SytSym:
     2986        ops = {'(x)':['4(x)','m(x)','m(y)','m(0+-)'],   #m(0+-) for cubic m3m?
     2987               '(y)':['4(y)','m(y)','m(z)','m(+0-)'],   #m(+0-)
     2988               '(z)':['4(z)','m(z)','m(x)','m(+-0)']}   #m(+-0)
     2989    elif '4mm' in SytSym:
     2990        ops = {'(x)':['4(x)','m(y)','m(yz)'],'(y)':['4(y)','m(z)','m(xz)'],'(z)':['4(z)','m(x)','m(110)']}
     2991    elif '422' in SytSym:
     2992        ops = {'(x)':['4(x)','2(y)','2(yz)'],'(y)':['4(y)','2(z)','2(xz)'],'(z)':['4(z)','2(x)','2(110)']}
     2993    elif '-4m2' in SytSym:
     2994        ops = {'(x)':['-4(x)','m(x)','2(yz)'],'(y)':['-4(y)','m(y)','2(xz)'],'(z)':['-4(z)','m(z)','2(110)']}
     2995    elif '-42m' in SytSym:
     2996        ops = {'(x)':['-4(x)','2(y)','m(yz)'],'(y)':['-4(y)','2(z)','m(xz)'],'(z)':['-4(z)','2(x)','m(110)']}
     2997    elif '-4' in SytSym:
     2998        ops = {'(x)':['-4(x)',],'(y)':['-4(y)',],'(z)':['-4(z)',],}
     2999    elif '4' in SytSym:
     3000        ops = {'(x)':['4(x)',],'(y)':['4(y)',],'(z)':['4(z)',],}
     3001
     3002    elif '222' in SytSym:
     3003        ops = {'':['2(x)','2(y)','2(z)'],
     3004                   '(x)':['2(y)','2(z)','2(x)'],'(y)':['2(x)','2(z)','2(y)'],'(z)':['2(x)','2(y)','2(z)'],
     3005                   '(100)':['2(z)','2(100)','2(120)',],'(010)':['2(z)','2(010)','2(210)',],
     3006                   '(110)':['2(z)','2(110)','2(+-0)',],}
     3007    elif 'mm2' in SytSym:
     3008        ops = {'(x)':['m(y)','m(z)','2(x)'],'(y)':['m(x)','m(z)','2(y)'],'(z)':['m(x)','m(y)','2(z)'],
     3009               '(xy)':['m(+-0)','m(z)','2(110)'],'(yz)':['m(0+-)','m(xz)','2(yz)'],     #not 2(xy)!
     3010               '(xz)':['m(+0-)','m(y)','2(xz)'],'(z100)':['m(100)','m(120)','2(z)'],
     3011               '(z010)':['m(010)','m(210)','2(z)'],'(z110)':['m(110)','m(+-0)','2(z)'],
     3012               '(+-0)':[ 'm(110)','m(z)','2(+-0)'],'(d100)':['m(yz)','m(0+-)','2(xz)'],
     3013               '(d010)':['m(xz)','m(+0-)','2(y)'],'(d001)':['m(110)','m(+-0)','2(z)'],
     3014               '(210)':['m(z)','m(010)','2(210)'],
     3015               '(100)':['m(z)','m(120)','2(100)',],'(010)':['m(z)','m(210)','2(010)',],
     3016               '(110)':['m(z)','m(+-0)','2(110)',],}
     3017    elif 'mmm' in SytSym:
     3018        ops = {'':['m(x)','m(y)','m(z)'],
     3019                   '(100)':['m(z)','m(100)','m(120)',],'(010)':['m(z)','m(010)','m(210)',],
     3020                   '(110)':['m(z)','m(110)','m(+-0)',],
     3021                   '(x)':['m(x)','m(y)','m(z)'],'(y)':['m(x)','m(y)','m(z)'],'(z)':['m(x)','m(y)','m(z)'],}
     3022       
     3023    elif '32' in SytSym:
     3024        ops = {'(120)':['3','2(120)',],'(100)':['3','2(100)']}
     3025    elif '23' in SytSym:
     3026        ops = {'':['2(x)','3(111)']}
     3027    elif 'm3' in SytSym:
     3028        ops = {'(100)':['(+-0)',],'(+--)':[],'(-+-)':[],'(--+)':[]}
     3029    elif '3m' in SytSym:
     3030        ops = {'(111)':['3(111)','m(+-0)',],'(+--)':['3(+--)','m(0+-)',],
     3031               '(-+-)':['3(-+-)','m(+0-)',],'(--+)':['3(--+)','m(+-0)',],
     3032               '(100)':['3','m(100)'],'(120)':['3','m(210)',]}
     3033   
     3034    if SytSym.split('(')[0] in ['6/m','6mm','-6m2','622','-6','-3','-3m',]:     #not simple cases
     3035        MagSytSym = SytSym
     3036        if "-1'" in dupDir:
     3037            if '-6' in SytSym:
     3038                MagSytSym = MagSytSym.replace('-6',"-6'")
     3039            elif '-3m' in SytSym:
     3040                MagSytSym = MagSytSym.replace('-3m',"-3'm'")
     3041            elif '-3' in SytSym:
     3042                MagSytSym = MagSytSym.replace('-3',"-3'")
     3043        elif '-6m2' in SytSym:
     3044            if "m'(110)" in dupDir:
     3045                MagSytSym = "-6m'2'("+SytSym.split('(')[1]
     3046        elif '6/m' in SytSym:
     3047            if "m'(z)" in dupDir:
     3048                MagSytSym = "6'/m'"
     3049        elif '6mm' in SytSym:
     3050            if "m'(110)" in dupDir:
     3051                MagSytSym = "6'm'm"
     3052        return MagSytSym
     3053    try:
     3054        axis = '('+SytSym.split('(')[1]
     3055    except IndexError:
     3056        axis = ''
     3057    MagSytSym = ''
     3058    for m in ops[axis]:
     3059        if m in dupDir:
     3060            MagSytSym += m.split('(')[0]
     3061        else:
     3062            MagSytSym += m.split('(')[0]+"'"
     3063        if '2/m' in SytSym and '2' in m:
     3064            MagSytSym += '/'
     3065        if '-3/m' in SytSym:
     3066            MagSytSym = '-'+MagSytSym
     3067       
     3068    MagSytSym += axis
     3069# some exceptions & special rules         
     3070    if MagSytSym == "4'/m'm'm'": MagSytSym = "4/m'm'm'"
     3071    return MagSytSym
     3072   
     3073#    if len(GenSym) == 3:
     3074#        if SGSpin[1] < 0:
     3075#            if 'mm2' in SytSym:
     3076#                MagSytSym = "m'm'2"+'('+SplitSytSym[1]
     3077#            else:   #bad rule for I41/a
     3078#                MagSytSym = SplitSytSym[0]+"'"
     3079#                if len(SplitSytSym) > 1:
     3080#                    MagSytSym += '('+SplitSytSym[1]
     3081#        else:
     3082#            MagSytSym = SytSym
     3083#        if len(SplitSytSym) >1:
     3084#            if "-4'"+'('+SplitSytSym[1] in dupDir:
     3085#                MagSytSym = MagSytSym.replace('-4',"-4'")
     3086#            if "-6'"+'('+SplitSytSym[1] in dupDir:
     3087#                MagSytSym = MagSytSym.replace('-6',"-6'")
     3088#        return MagSytSym
     3089#           
     3090    return SytSym
     3091   
    29743092def ElemPosition(SGData):
    29753093    ''' Under development.
Note: See TracChangeset for help on using the changeset viewer.