Skip to content

Commit 6facefe

Browse files
committed
Complete #169 by adding subgroup search to Phase-General/Compute
1 parent 5cd9ac6 commit 6facefe

File tree

3 files changed

+144
-23
lines changed

3 files changed

+144
-23
lines changed

GSASII/GSASIIdataGUI.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7166,6 +7166,8 @@ def _makemenu(): # routine to create menu when first used
71667166
self.GeneralCalc.Append(G2G.wxID_COMPARECELLS,'Compare Cells','Compare Unit Cells using NIST*LATTICE')
71677167
self.GeneralCalc.Append(G2G.wxID_COMPARESTRUCTURE,'Compare polyhedra','Compare polyhedra to ideal octahedra/tetrahedra')
71687168
self.GeneralCalc.Enable(G2G.wxID_COMPARESTRUCTURE,False)
7169+
G2G.Define_wxId('wxID_SUBSRCH')
7170+
self.GeneralCalc.Append(G2G.wxID_SUBSRCH,'SUBGROUPS search','Search for settings of this phase in higher symmetry')
71697171
self.GeneralCalc.Append(G2G.wxID_USEBILBAOMAG,'Select magnetic/subgroup phase','If disabled, make in PWDR/Unit Cells')
71707172
self.GeneralCalc.Append(G2G.wxID_USEBILBAOSUB,'Make subgroup project file(s)','Requires subcell search in PWDR/Unit Cells')
71717173
G2G.Define_wxId('wxID_SUPERSRCH')

GSASII/GSASIIphsGUI.py

Lines changed: 140 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3802,6 +3802,108 @@ def fmtCell(cell):
38023802
# Restore the original saved project
38033803
wx.CallLater(100,_GetPhase)
38043804

3805+
def OnSubSearch(event):
3806+
'''Search for a lower symmetry structure consistent with the
3807+
current phase using the Bilbao SUBGROUPS web service
3808+
3809+
Based on GSASIIpwdGUI.OnRunSubs
3810+
'''
3811+
generalData = data['General']
3812+
Kx = [' ','0','1/2','-1/2','1/3','-1/3','2/3','1']
3813+
Ky = [' ','0','1/2','1/3','2/3','1']
3814+
Kz = [' ','0','1/2','3/2','1/3','2/3','1']
3815+
kvec = [['0','0','0'],[' ',' ',' '],[' ',' ',' ',' ']]
3816+
dlg = G2G.MultiDataDialog(G2frame,title='SUBGROUPS options',prompts=[' k-vector 1',' k-vector 2',' k-vector 3', \
3817+
' Use whole star',' Filter by','preserve axes','max unique'],
3818+
values=kvec+[False,'',True,100],
3819+
limits=[[Kx[1:],Ky[1:],Kz[1:]],[Kx,Ky,Kz],[Kx,Ky,Kz],[True,False],['',' Landau transition',' Only maximal subgroups',],
3820+
[True,False],[1,100]],
3821+
formats=[['choice','choice','choice'],['choice','choice','choice'],['choice','choice','choice'],'bool','choice',
3822+
'bool','%d',])
3823+
dlg.CenterOnParent()
3824+
if dlg.ShowModal() != wx.ID_OK: return
3825+
3826+
subcells = []
3827+
newVals = dlg.GetValues()
3828+
kvec[:9] = newVals[0]+newVals[1]+newVals[2]+[' ',]
3829+
nkvec = kvec.index(' ')
3830+
star = newVals[3]
3831+
filterby = newVals[4]
3832+
keepaxes = newVals[5]
3833+
maxequiv = newVals[6]
3834+
if 'maximal' in filterby:
3835+
maximal = True
3836+
Landau = False
3837+
elif 'Landau' in filterby:
3838+
maximal = False
3839+
Landau = True
3840+
else:
3841+
maximal = False
3842+
Landau = False
3843+
if nkvec not in [0,3,6,9]:
3844+
wx.MessageBox('Error: check your propagation vector(s)',
3845+
caption='Bilbao SUBGROUPS setup error',style=wx.ICON_EXCLAMATION)
3846+
return
3847+
if nkvec in [6,9] and Landau:
3848+
wx.MessageBox('Error, multi k-vectors & Landau not compatible',
3849+
caption='Bilbao SUBGROUPS setup error',style=wx.ICON_EXCLAMATION)
3850+
return
3851+
wx.MessageBox(' For use of SUBGROUPS, please cite:\n\n'+
3852+
G2G.GetCite('Bilbao: k-SUBGROUPSMAG'),
3853+
caption='Bilbao SUBGROUPS',
3854+
style=wx.ICON_INFORMATION)
3855+
wx.BeginBusyCursor()
3856+
SGData = generalData['SGData']
3857+
from . import SUBGROUPS as kSUB
3858+
SubGroups,baseList = kSUB.GetNonStdSubgroups(SGData,kvec[:9],star,Landau)
3859+
wx.EndBusyCursor()
3860+
if SubGroups is None:
3861+
wx.MessageBox('Check your internet connection?',caption='Bilbao SUBGROUPS error',style=wx.ICON_EXCLAMATION)
3862+
return
3863+
if not SubGroups:
3864+
if Landau:
3865+
wx.MessageBox('No results from SUBGROUPS, multi k-vectors & Landau not compatible',
3866+
caption='Bilbao SUBGROUPS error',style=wx.ICON_EXCLAMATION)
3867+
else:
3868+
wx.MessageBox('No results from SUBGROUPS, check your propagation vector(s)',
3869+
caption='Bilbao SUBGROUPS error',style=wx.ICON_EXCLAMATION)
3870+
return
3871+
3872+
# emulate indexing controls
3873+
controls = 16*[None]
3874+
controls[6:12] = generalData['Cell'][1:7] # cell
3875+
cx,ct,cs,cia = data['General']['AtomPtrs']
3876+
controls[15] = [atom[:cx+3] for atom in data['Atoms']]
3877+
3878+
dlg = wx.ProgressDialog('SUBGROUPS results',f'Processing {SubGroups[0][0]}',len(SubGroups),
3879+
style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_REMAINING_TIME)
3880+
import GSASII.GSASIIpwdGUI
3881+
for ir,result in enumerate(SubGroups):
3882+
dlg.Update(ir,newmsg='Processing '+result[0])
3883+
Trans = np.array(eval(result[1][0]))
3884+
Uvec = np.array(eval(result[1][1]))
3885+
phase = G2lat.makeBilbaoPhase(result,Uvec,Trans)
3886+
phase['gid'] = result[2]
3887+
phase['altList'] = result[3]
3888+
phase['supList'] = eval(result[4])
3889+
RVT = None
3890+
if keepaxes:
3891+
RVT = G2lat.FindNonstandard(controls,phase)
3892+
if RVT is not None:
3893+
result,Uvec,Trans = RVT
3894+
phase.update(G2lat.makeBilbaoPhase(result,Uvec,Trans))
3895+
phase['Cell'] = G2lat.TransformCell(controls[6:12],Trans)
3896+
phase['maxequiv'] = maxequiv
3897+
phase['nAtoms'] = len(GSASII.GSASIIpwdGUI.TestAtoms(phase,controls[15],SGData,Uvec,Trans,maxequiv,maximal))
3898+
subcells.append(phase)
3899+
dlg.Destroy()
3900+
data['SUBGROUPS'] = (subcells,baseList)
3901+
msg = f'''{len(subcells)} subgroup entries were generated. Use menu commands
3902+
"Select magnetic/subgroup phase" or "Make subgroup project file(s)"
3903+
to use these entries'''
3904+
G2G.G2MessageBox(G2frame,msg,'Sugbroups stored')
3905+
wx.CallAfter(UpdatePhaseData,G2frame,Item,data)
3906+
38053907
def OnTransform2Std(event):
38063908
'''Uses the Bilbao web site to transform a space group and coordinates
38073909
to a standard setting
@@ -3992,15 +4094,19 @@ def OnUseBilbao(event):
39924094
'''Select and apply a transformation matrix from the Bilbao web site
39934095
to create a new phase
39944096
'''
3995-
PatternName = data['magPhases']
3996-
PatternId = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,PatternName)
3997-
UnitCellsId = G2gd.GetGPXtreeItemId(G2frame,PatternId, 'Unit Cells List')
3998-
UCdata = list(G2frame.GPXtree.GetItemPyData(UnitCellsId))
3999-
magData = UCdata[5]
4000-
if len(UCdata[0]) < 17: #old version of k-SUBGROUPSMAG
4001-
baseList = range(1,len(magData)+1)
4097+
if 'SUBGROUPS' in data:
4098+
magData,baseList = data['SUBGROUPS']
40024099
else:
4003-
baseList = UCdata[0][16]
4100+
PatternName = data['magPhases']
4101+
PatternId = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,PatternName)
4102+
UnitCellsId = G2gd.GetGPXtreeItemId(G2frame,PatternId, 'Unit Cells List')
4103+
UCdata = list(G2frame.GPXtree.GetItemPyData(UnitCellsId))
4104+
magData = UCdata[5]
4105+
if len(UCdata[0]) < 17: #old version of k-SUBGROUPSMAG
4106+
baseList = range(1,len(magData)+1)
4107+
else:
4108+
baseList = UCdata[0][16]
4109+
40044110
magKeep = []
40054111
magIds = []
40064112
magchoices = []
@@ -4035,8 +4141,10 @@ def OnUseBilbao(event):
40354141
else:
40364142
phaseName = '%s-sub_%d'%(data['General']['Name'],magchoice['No.'])
40374143
newPhase = copy.deepcopy(data)
4038-
newPhase['ranId'] = ran.randint(0,sys.maxsize),
4039-
del newPhase['magPhases']
4144+
newPhase['ranId'] = ran.randint(0,sys.maxsize)
4145+
# remove subgroup info on parent from new phase
4146+
if 'magPhases' in newPhase: del newPhase['magPhases']
4147+
if 'SUBGROUPS' in newPhase: del newPhase['SUBGROUPS']
40404148
generalData = newPhase['General']
40414149
generalData['Name'] = phaseName
40424150
generalData['SGData'] = copy.deepcopy(magchoice['SGData'])
@@ -4109,20 +4217,25 @@ def OnApplySubgroups(event):
41094217
'''Select and apply a transformation matrix from the Bilbao web site
41104218
to replace current phase with a subgroup
41114219
'''
4112-
PatternName = data['magPhases']
4113-
PatternId = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,PatternName)
4114-
UnitCellsId = G2gd.GetGPXtreeItemId(G2frame,PatternId, 'Unit Cells List')
4115-
UCdata = list(G2frame.GPXtree.GetItemPyData(UnitCellsId))
4116-
if len(UCdata[0]) < 17: #old version of k-SUBGROUPSMAG
4117-
baseList = range(1,len(UCdata[5])+1)
4220+
if 'SUBGROUPS' in data:
4221+
subPhases,baseList = data['SUBGROUPS']
4222+
UnitCellsId = None
41184223
else:
4119-
baseList = UCdata[0][16]
4224+
PatternName = data['magPhases']
4225+
PatternId = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,PatternName)
4226+
UnitCellsId = G2gd.GetGPXtreeItemId(G2frame,PatternId, 'Unit Cells List')
4227+
UCdata = list(G2frame.GPXtree.GetItemPyData(UnitCellsId))
4228+
if len(UCdata[0]) < 17: #old version of k-SUBGROUPSMAG
4229+
baseList = range(1,len(UCdata[5])+1)
4230+
else:
4231+
baseList = UCdata[0][16]
4232+
subPhases = UCdata[5]
41204233
subKeep = []
41214234
subIds = []
41224235
subchoices = []
41234236
ifMag = False
4124-
itemList = [phase.get('gid',ip+1) for ip,phase in enumerate(UCdata[5])]
4125-
phaseDict = dict(zip(itemList,UCdata[5]))
4237+
itemList = [phase.get('gid',ip+1) for ip,phase in enumerate(subPhases)]
4238+
phaseDict = dict(zip(itemList,subPhases))
41264239
for im,mid in enumerate(baseList):
41274240
if phaseDict[mid]['Keep']:
41284241
phaseDict[mid]['No.'] = im+1
@@ -4218,8 +4331,10 @@ def OnApplySubgroups(event):
42184331
data.update(newPhase)
42194332
#clear away prev subgroup choices
42204333
if 'magPhases' in data: del data['magPhases']
4221-
UCdata[5] = []
4222-
G2frame.GPXtree.SetItemPyData(UnitCellsId,UCdata)
4334+
if 'SUBGROUPS' in data: del data['SUBGROUPS']
4335+
if UnitCellsId:
4336+
UCdata[5] = []
4337+
G2frame.GPXtree.SetItemPyData(UnitCellsId,UCdata)
42234338
# save new file
42244339
G2frame.GSASprojectfile = os.path.splitext(orgFilName
42254340
)[0]+'_'+spg.replace('/','_')+'.gpx'
@@ -12934,6 +13049,7 @@ def FillMenus():
1293413049
G2frame.Bind(wx.EVT_MENU, OnTransform2Std, id=G2G.wxID_TRANSFORMSTD)
1293513050
G2frame.Bind(wx.EVT_MENU, OnSuperSearch, id=G2G.wxID_SUPERSRCH)
1293613051
G2frame.Bind(wx.EVT_MENU, OnISOSearch, id=G2G.wxID_ISOSRCH)
13052+
G2frame.Bind(wx.EVT_MENU, OnSubSearch, id=G2G.wxID_SUBSRCH)
1293713053
G2frame.Bind(wx.EVT_MENU, OnCompare, id=G2G.wxID_COMPARESTRUCTURE)
1293813054
G2frame.Bind(wx.EVT_MENU, OnCompareCells, id=G2G.wxID_COMPARECELLS)
1293913055
G2frame.Bind(wx.EVT_MENU, OnUseBilbao, id=G2G.wxID_USEBILBAOMAG)
@@ -13318,6 +13434,9 @@ def renamePhaseName(phaseItem,generalData,newName):
1331813434
else:
1331913435
del data['magPhases']
1332013436
G2frame.dataWindow.GeneralCalc.Enable(G2G.wxID_USEBILBAOSUB,flag)
13437+
if not flag and 'SUBGROUPS' in data:
13438+
G2frame.dataWindow.GeneralCalc.Enable(G2G.wxID_USEBILBAOSUB,True)
13439+
G2frame.dataWindow.GeneralCalc.Enable(G2G.wxID_USEBILBAOMAG,True)
1332113440
G2frame.phaseDisplay.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, OnPageChanged)
1332213441
FillMenus()
1332313442
if G2frame.lastSelectedPhaseTab in Pages:

GSASII/GSASIIpwdGUI.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4977,11 +4977,11 @@ def OnRunSubs(event):
49774977
wx.MessageBox('Error, multi k-vectors & Landau not compatible',
49784978
caption='Bilbao SUBGROUPS setup error',style=wx.ICON_EXCLAMATION)
49794979
return
4980-
wx.BeginBusyCursor()
49814980
wx.MessageBox(' For use of SUBGROUPS, please cite:\n\n'+
49824981
G2G.GetCite('Bilbao: k-SUBGROUPSMAG'),
49834982
caption='Bilbao SUBGROUPS',
49844983
style=wx.ICON_INFORMATION)
4984+
wx.BeginBusyCursor()
49854985
SubGroups,baseList = kSUB.GetNonStdSubgroups(SGData,kvec[:9],star,Landau)
49864986
wx.EndBusyCursor()
49874987
if SubGroups is None:
@@ -5000,7 +5000,7 @@ def OnRunSubs(event):
50005000
controls[16] = baseList
50015001
except IndexError:
50025002
controls.append(baseList)
5003-
dlg = wx.ProgressDialog('SUBGROUPS results','Processing '+SubGroups[0][0],len(SubGroups),
5003+
dlg = wx.ProgressDialog('SUBGROUPS results',f'Processing {SubGroups[0][0]}',len(SubGroups),
50045004
style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_REMAINING_TIME)
50055005
for ir,result in enumerate(SubGroups):
50065006
dlg.Update(ir,newmsg='Processing '+result[0])

0 commit comments

Comments
 (0)