Changeset 4263


Ignore:
Timestamp:
Jan 22, 2020 9:49:36 AM (21 months ago)
Author:
vondreele
Message:

major revision of RMCProfile GUI - now shows in data window instead of a dialog
additions of atom-atom and atom-atom-aton potentials & coordination no. restraints
tested with RMCProfile 6.7.6 (serial)

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIphsGUI.py

    r4254 r4263  
    10841084        self.EndModal(wx.ID_CANCEL)
    10851085
    1086 ################################################################################
    1087 class SetUpRMCProfileDialog(wx.Dialog):
    1088     ''' Get from user the super cell size & selected histogram to make various files
    1089     '''
    1090     def __init__(self,parent,Name,Phase):
    1091         title = 'RMCProfile setup for '+Name
    1092         wx.Dialog.__init__(self,parent,wx.ID_ANY,title,size=(700,500),
    1093             pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
    1094         self.panel = wxscroll.ScrolledPanel(self)         #just a dummy - gets destroyed in Draw!
    1095         self.Name = Name
    1096         if not Phase['RMC']['RMCProfile']:
    1097             Atypes = Phase['General']['AtomTypes']
    1098             aTypes = dict(zip(Atypes,len(Atypes)*[0.10,]))
    1099             atSeq = list(aTypes.keys())
    1100             atOxid = [[atmdata.BVSoxid[atm][0],0.001] for atm in atSeq]
    1101             lenA = len(atSeq)
    1102             Pairs= []
    1103             for pair in [[' %s-%s'%(atSeq[i],atSeq[j]) for j in range(i,lenA)] for i in range(lenA)]:
    1104                 Pairs += pair
    1105             Pairs = {pairs:[0.0,0.0,0.0] for pairs in Pairs}
    1106             BVSpairs = []
    1107             if lenA > 1:
    1108                 for pair in [[' %s-%s'%(atSeq[i],atSeq[j]) for j in range(i+1,lenA)] for i in range(lenA)]:
    1109                     BVSpairs += pair
    1110                 BVS = {pairs:[0.0,0.0,0.0,0.0] for pairs in BVSpairs}
    1111             files = {'Neutron real space data; G(r): ':['',0.05,'G(r)','RMC',],
    1112                       'Neutron reciprocal space data; F(Q): ':['',0.05,'F(Q)','RMC',],
    1113                       'Neutron reciprocal space data; S(Q): ':['',0.05,'S(Q)','RMC',],
    1114                       'Xray real space data; G(r): ':['',0.01,'G(r)','RMC',],
    1115                       'Xray reciprocal space data; F(Q): ':['',0.01,'F(Q)','RMC',],}
    1116             runTimes = [10.,1.]
    1117             metadata = {'title':'none','owner':'no one','date':str(time.ctime()),'temperature':'300K',
    1118                 'material':'nothing','phase':'vacuum','comment':'none ','source':'nowhere'}
    1119             Phase['RMC']['RMCProfile'] = {'SuperCell':[1,1,1],'UseSampBrd':[True,True],'aTypes':aTypes,
    1120                  'atSeq':atSeq,'Pairs':Pairs,'histogram':['',1.0],'files':files,'metadata':metadata,
    1121                  'runTimes':runTimes,'ReStart':False,'BVS':BVS,'Oxid':atOxid,'useBVS':False,
    1122                  'AveCN':[],'FxCN':[]}
    1123         self.RMCPdict = Phase['RMC']['RMCProfile']
    1124         self.Phase = Phase
    1125         self.Draw()
    1126        
    1127     def Draw(self):
    1128        
    1129         def OnHisto(event):
    1130             self.RMCPdict['histogram'][0] = histo.GetStringSelection()
    1131            
    1132         def OnAtSel(event):
    1133             Obj = event.GetEventObject()
    1134             itype = Indx[Obj.GetId()]
    1135             tid = self.RMCPdict['atSeq'].index(Obj.GetStringSelection())
    1136             if itype < nTypes:
    1137                 if itype == tid:
    1138                     tid += 1
    1139                 self.RMCPdict['atSeq'] = G2lat.SwapItems(self.RMCPdict['atSeq'],itype,tid)
    1140             wx.CallAfter(self.Draw)
    1141            
    1142         def OnValSel(event):
    1143             Obj = event.GetEventObject()
    1144             itype = Indx[Obj.GetId()]
    1145             self.RMCPdict['Oxid'][itype][0] = Obj.GetStringSelection()           
    1146             wx.CallAfter(self.Draw)
    1147 
    1148         def OnSize(event):
    1149             self.RMCPdict['UseSampBrd'][0] = samSize.GetValue()
    1150            
    1151         def OnStrain(event):
    1152             self.RMCPdict['UseSampBrd'][1] = strain.GetValue()
    1153            
    1154         def OnFileSel(event):
    1155             Obj = event.GetEventObject()
    1156             fil = Indx[Obj.GetId()]
    1157             dlg = wx.FileDialog(self.panel, 'Choose '+fil+'NB: do not change directory; must be a local file',
    1158                 '.',style=wx.FD_OPEN,wildcard=fil+'(*.*)|*.*')
    1159             if dlg.ShowModal() == wx.ID_OK:
    1160                 fName = os.path.split(dlg.GetPath())[1]
    1161                 if os.path.exists(fName):
    1162                     self.RMCPdict['files'][fil][0] = fName
    1163                 dlg.Destroy()
    1164             else:
    1165                 dlg.Destroy()
    1166                 return
    1167             wx.CallAfter(self.Draw)
    1168            
    1169         def OnFileFormat(event):
    1170             Obj = event.GetEventObject()
    1171             fil = Indx[Obj.GetId()]
    1172             self.RMCPdict['files'][fil][3] = Obj.GetStringSelection()
    1173            
    1174         def SetRestart(invalid,value,tc):
    1175             self.RMCPdict['ReStart'] = True
    1176             self.OKBtn.SetLabel('Restart')
    1177            
    1178         def OnUseBVS(event):
    1179             self.RMCPdict['useBVS'] = not self.RMCPdict['useBVS']
    1180             wx.CallAfter(self.Draw)
    1181            
    1182         def OnResetBVS(event):
    1183             Obj = event.GetEventObject()
    1184             pair = Indx[Obj.GetId()]
    1185             pId = [key for key in self.RMCPdict['BVS']].index(pair)+1
    1186             nId = len(self.RMCPdict['BVS'])+1
    1187             dist = G2elem.GetBVS(pair,self.RMCPdict['atSeq'],self.RMCPdict['Oxid'])
    1188             if dist:
    1189                 self.RMCPdict['BVS'][pair] = [dist,0.37,3.0]
    1190                 bvsCh = bvsSizer.GetChildren()
    1191                 addr = 2*nId+pId
    1192                 bvsCh[addr].Window.SetValue('%6.3f'%dist)
    1193                 bvsCh[addr+nId].Window.SetValue('0.37')
    1194                 bvsCh[addr+2*nId].Window.SetValue('3.00')
    1195            
    1196         def OnAddFxCN(event):
    1197             self.RMCPdict['FxCN'].append(['','',0.0,2.0,6,1.0,0.001])
    1198             wx.CallAfter(self.Draw)
    1199            
    1200         def OnDelFxCN(event):
    1201             Obj = event.GetEventObject()
    1202             fxCN = Indx[Obj.GetId()]
    1203             del self.RMCPdict['FxCN'][fxCN]
    1204             wx.CallAfter(self.Draw)
    1205            
    1206         def OnFxcnAtSel(event):
    1207             Obj = event.GetEventObject()
    1208             ifxCN,i = Indx[Obj.GetId()]
    1209             self.RMCPdict['FxCN'][ifxCN][i] = Obj.GetStringSelection()
    1210 
    1211         def OnAddAveCN(event):
    1212             self.RMCPdict['AveCN'].append(['','',0.0,2.0,6.,0.001])
    1213             wx.CallAfter(self.Draw)
    1214                    
    1215         def OnDelAvCN(event):
    1216             Obj = event.GetEventObject()
    1217             fxCN = Indx[Obj.GetId()]
    1218             del self.RMCPdict['AveCN'][fxCN]
    1219             wx.CallAfter(self.Draw)
    1220            
    1221         def OnAvcnAtSel(event):
    1222             Obj = event.GetEventObject()
    1223             ifxCN,i = Indx[Obj.GetId()]
    1224             self.RMCPdict['AveCN'][ifxCN][i] = Obj.GetStringSelection()
    1225 
    1226         Indx = {}
    1227 #patches
    1228         if 'runTimes' not in self.RMCPdict:
    1229             self.RMCPdict['runTimes'] = [10.0,1.0]
    1230         lenA = len(self.RMCPdict['atSeq'])
    1231         if 'Oxid' not in self.RMCPdict:
    1232             self.RMCPdict['Oxid'] = [[atmdata.BVSoxid[atm][0],0.001] for atm in self.RMCPdict['atSeq']]
    1233         Pairs= []
    1234         for pair in [[' %s-%s'%(self.RMCPdict['atSeq'][i],self.RMCPdict['atSeq'][j]) for j in range(i,lenA)] for i in range(lenA)]:
    1235             Pairs += pair
    1236         self.RMCPdict['Pairs'] = dict(zip(Pairs,[self.RMCPdict['Pairs'].get(pair,[0.0,0.0,0.0]) for pair in Pairs]))
    1237         BVSpairs = []
    1238         if 'BVS' not in self.RMCPdict:
    1239             self.RMCPdict['useBVS'] = False
    1240             self.RMCPdict['BVS'] = {}
    1241         if lenA > 1:
    1242             for pair in [[' %s-%s'%(self.RMCPdict['atSeq'][i],self.RMCPdict['atSeq'][j]) for j in range(i+1,lenA)] for i in range(lenA)]:
    1243                 BVSpairs += pair
    1244             self.RMCPdict['BVS'] = dict(zip(BVSpairs,[self.RMCPdict['BVS'].get(pair,[0.0,0.0,0.0]) for pair in BVSpairs]))
    1245         if 'FxCN' not in self.RMCPdict:
    1246             self.RMCPdict.update({'AveCN':[],'FxCN':[]})           
    1247            
    1248 #end patches
    1249         self.panel.Destroy()
    1250         self.panel = wxscroll.ScrolledPanel(self,style = wx.DEFAULT_DIALOG_STYLE,size=(700,500))
    1251         mainSizer = wx.BoxSizer(wx.VERTICAL)
    1252         mainSizer.Add(wx.StaticText(self.panel,label=' Enter metadata items:'),0,WACV)
    1253         metalist = ['title','owner','material','phase','comment','source','temperature',]
    1254         metaSizer = wx.FlexGridSizer(0,2,5,5)
    1255         for item in metalist:
    1256             metaSizer.Add(wx.StaticText(self.panel,label=' Metadata item: '+item+' '),0,WACV)
    1257             metaSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['metadata'],item),0,WACV)
    1258         mainSizer.Add(metaSizer,0,WACV)
    1259        
    1260         G2G.HorizontalLine(mainSizer,self.panel)
    1261         timeSizer = wx.BoxSizer(wx.HORIZONTAL)
    1262         timeSizer.Add(wx.StaticText(self.panel,label=' Total running time (min): '),0,WACV)
    1263         timeSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['runTimes'],0,min=0.),0,WACV)
    1264         timeSizer.Add(wx.StaticText(self.panel,label=' Save interval time (min): '),0,WACV)
    1265         timeSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['runTimes'],1,min=0.1,max=20.),0,WACV)
    1266         mainSizer.Add(timeSizer,0,WACV)
    1267         mainSizer.Add(wx.StaticText(self.panel,label=' Lattice multipliers; if changed will force reset of atom positions:'),0,WACV)
    1268         superSizer = wx.BoxSizer(wx.HORIZONTAL)
    1269         axes = ['X','Y','Z']
    1270         for i,ax in enumerate(axes):
    1271             superSizer.Add(wx.StaticText(self.panel,label=' %s-axis: '%ax),0,WACV)
    1272             superSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['SuperCell'],i,min=1,max=20,size=(50,25),OnLeave=SetRestart),0,WACV)
    1273         mainSizer.Add(superSizer,0,WACV)
    1274         mainSizer.Add(wx.StaticText(self.panel,label=' NB: be sure to set cations first && anions last in atom ordering'),0,WACV)
    1275         nTypes = len(self.RMCPdict['aTypes'])
    1276         atmChoice = wx.FlexGridSizer(nTypes+1,5,5)
    1277         atmChoice.Add(wx.StaticText(self.panel,label=' Set atom ordering: '),0,WACV)
    1278         for iType in range(nTypes):
    1279             atChoice = self.RMCPdict['atSeq'][iType:]
    1280             atmSel = wx.ComboBox(self.panel,choices=atChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
    1281             atmSel.SetStringSelection(self.RMCPdict['atSeq'][iType])
    1282             atmSel.Bind(wx.EVT_COMBOBOX,OnAtSel)
    1283             Indx[atmSel.GetId()] = iType
    1284             atmChoice.Add(atmSel,0,WACV)
    1285         if self.RMCPdict['useBVS']:   
    1286             atmChoice.Add(wx.StaticText(self.panel,label=' Select valence: '),0,WACV)
    1287             for itype in range(nTypes):
    1288                 valChoice = atmdata.BVSoxid[self.RMCPdict['atSeq'][itype]]
    1289                 valSel = wx.ComboBox(self.panel,choices=valChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
    1290                 valSel.SetStringSelection(self.RMCPdict['Oxid'][itype][0])
    1291                 valSel.Bind(wx.EVT_COMBOBOX,OnValSel)
    1292                 Indx[valSel.GetId()] = itype
    1293                 atmChoice.Add(valSel,0,WACV)
    1294             atmChoice.Add(wx.StaticText(self.panel,label=' BVS weight: '),0,WACV)
    1295             for itype in range(nTypes):
    1296                 atmChoice.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['Oxid'][itype],1,min=0.),0,WACV)
    1297         atmChoice.Add(wx.StaticText(self.panel,label=' Set max shift: '),0,WACV)
    1298         for iType in range(nTypes):
    1299             atId = self.RMCPdict['atSeq'][iType]
    1300             atmChoice.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['aTypes'],atId,min=0.,max=1.),0,WACV)
    1301         mainSizer.Add(atmChoice,0,WACV)
    1302        
    1303         G2G.HorizontalLine(mainSizer,self.panel)
    1304         mainSizer.Add(wx.StaticText(self.panel,label=' Enter constraints && restraints:'),0,WACV)
    1305         mainSizer.Add(wx.StaticText(self.panel,label=' Set minimum && maximum distances for:'),0,WACV)
    1306         pairSizer = wx.FlexGridSizer(len(self.RMCPdict['Pairs'])+1,5,5)
    1307         pairSizer.Add((5,5),0)
    1308         for pair in self.RMCPdict['Pairs']:
    1309             pairSizer.Add(wx.StaticText(self.panel,label=pair),0,WACV)
    1310         pairSizer.Add(wx.StaticText(self.panel,label='%14s'%' Hard min: '),0,WACV)
    1311         for pair in self.RMCPdict['Pairs']:
    1312             pairSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['Pairs'][pair],0,min=0.,max=10.,size=(50,25)),0,WACV)
    1313         pairSizer.Add(wx.StaticText(self.panel,label='%14s'%' Search from: '),0,WACV)
    1314         for pair in self.RMCPdict['Pairs']:
    1315             pairSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['Pairs'][pair],1,min=self.RMCPdict['Pairs'][pair][0],max=10.,size=(50,25)),0,WACV)
    1316         pairSizer.Add(wx.StaticText(self.panel,label='%14s'%'to: '),0,WACV)
    1317         for pair in self.RMCPdict['Pairs']:
    1318             pairSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['Pairs'][pair],2,min=0.,max=10.,size=(50,25)),0,WACV)
    1319         mainSizer.Add(pairSizer,0,WACV)
    1320        
    1321         G2G.HorizontalLine(mainSizer,self.panel)
    1322         useBVS = wx.CheckBox(self.panel,label=' Use bond valence sum restraints for (set to 0 for non-bonded ones):')
    1323         useBVS.SetValue(self.RMCPdict.get('useBVS',False))
    1324         useBVS.Bind(wx.EVT_CHECKBOX,OnUseBVS)
    1325         mainSizer.Add(useBVS,0,WACV)
    1326         if self.RMCPdict.get('useBVS',False):
    1327             bvsSizer = wx.FlexGridSizer(len(self.RMCPdict['BVS'])+1,5,5)
    1328             bvsSizer.Add((5,5),0)
    1329             for pair in self.RMCPdict['BVS']:
    1330                 bvsSizer.Add(wx.StaticText(self.panel,label=pair),0,WACV)
    1331             bvsSizer.Add(wx.StaticText(self.panel,label=' Reset:'),0,WACV)
    1332             for pair in self.RMCPdict['BVS']:
    1333                 reset = wx.Button(self.panel,label='Yes')
    1334                 bvsSizer.Add(reset,0,WACV)
    1335                 reset.Bind(wx.EVT_BUTTON,OnResetBVS)
    1336                 Indx[reset.GetId()] = pair
    1337             bvsSizer.Add(wx.StaticText(self.panel,label=' Bond length:'),0,WACV)
    1338             for pair in self.RMCPdict['BVS']:
    1339                 bvsSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['BVS'][pair],0,min=0.,max=10.,size=(50,25)),0,WACV)
    1340             bvsSizer.Add(wx.StaticText(self.panel,label=' B constant (0.37): '),0,WACV)
    1341             for pair in self.RMCPdict['BVS']:
    1342                 bvsSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['BVS'][pair],1,min=0.,max=10.,size=(50,25)),0,WACV)
    1343             bvsSizer.Add(wx.StaticText(self.panel,label=' Cut off: '),0,WACV)
    1344             for pair in self.RMCPdict['BVS']:
    1345                 bvsSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['BVS'][pair],2,min=0.,max=10.,size=(50,25)),0,WACV)
    1346             mainSizer.Add(bvsSizer,0,WACV)
    1347            
    1348         G2G.HorizontalLine(mainSizer,self.panel)
    1349         fxcnBox = wx.BoxSizer(wx.HORIZONTAL)
    1350         fxcnAdd = wx.Button(self.panel,label='Add')
    1351         fxcnAdd.Bind(wx.EVT_BUTTON,OnAddFxCN)
    1352         fxcnBox.Add(fxcnAdd,0,WACV)
    1353         fxcnBox.Add(wx.StaticText(self.panel,label=' Fixed coordination number restraint: '),0,WACV)
    1354         mainSizer.Add(fxcnBox,0,WACV)
    1355         if len(self.RMCPdict['FxCN']):
    1356             atChoice = self.RMCPdict['atSeq']
    1357             fxcnSizer = wx.FlexGridSizer(8,5,5)
    1358             fxcnLabels = [' ','Atom-1','Atom-2','min dist','max dist','CN','fraction','weight']
    1359             for lab in fxcnLabels:
    1360                 fxcnSizer.Add(wx.StaticText(self.panel,label=lab),0,WACV)
    1361             for ifx,fxCN in enumerate(self.RMCPdict['FxCN']):
    1362                 delBtn = wx.Button(self.panel,label='Delete')
    1363                 delBtn.Bind(wx.EVT_BUTTON,OnDelFxCN)
    1364                 Indx[delBtn.GetId()] = ifx
    1365                 fxcnSizer.Add(delBtn,0,WACV)
    1366                 for i in [0,1]:
    1367                     atmSel = wx.ComboBox(self.panel,choices=atChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
    1368                     atmSel.SetStringSelection(fxCN[i])
    1369                     atmSel.Bind(wx.EVT_COMBOBOX,OnFxcnAtSel)
    1370                     Indx[atmSel.GetId()] = [ifx,i]
    1371                     fxcnSizer.Add(atmSel,0,WACV)
    1372                 fxcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,2,min=0.,max=5.,size=(50,25)),0,WACV)
    1373                 fxcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,3,min=0.,max=5.,size=(50,25)),0,WACV)
    1374                 fxcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,4,min=1,max=12,size=(50,25)),0,WACV)
    1375                 fxcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,5,min=0.,max=1.,size=(50,25)),0,WACV)
    1376                 fxcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,6,min=0.,size=(50,25)),0,WACV)
    1377             mainSizer.Add(fxcnSizer,0,WACV)
    1378        
    1379         G2G.HorizontalLine(mainSizer,self.panel)
    1380         avcnBox = wx.BoxSizer(wx.HORIZONTAL)
    1381         avcnAdd = wx.Button(self.panel,label='Add')
    1382         avcnAdd.Bind(wx.EVT_BUTTON,OnAddAveCN)
    1383         avcnBox.Add(avcnAdd,0,WACV)
    1384         avcnBox.Add(wx.StaticText(self.panel,label=' Average coordination number restraint: '),0,WACV)
    1385         mainSizer.Add(avcnBox,0,WACV)
    1386         if len(self.RMCPdict['AveCN']):
    1387             atChoice = self.RMCPdict['atSeq']
    1388             avcnSizer = wx.FlexGridSizer(7,5,5)
    1389             fxcnLabels = [' ','Atom-1','Atom-2','min dist','max dist','CN','weight']
    1390             for lab in fxcnLabels:
    1391                 avcnSizer.Add(wx.StaticText(self.panel,label=lab),0,WACV)
    1392             for ifx,fxCN in enumerate(self.RMCPdict['FxCN']):
    1393                 delBtn = wx.Button(self.panel,label='Delete')
    1394                 delBtn.Bind(wx.EVT_BUTTON,OnDelAvCN)
    1395                 Indx[delBtn.GetId()] = ifx
    1396                 avcnSizer.Add(delBtn,0,WACV)
    1397                 for i in [0,1]:
    1398                     atmSel = wx.ComboBox(self.panel,choices=atChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
    1399                     atmSel.SetStringSelection(fxCN[i])
    1400                     atmSel.Bind(wx.EVT_COMBOBOX,OnAvcnAtSel)
    1401                     Indx[atmSel.GetId()] = [ifx,i]
    1402                     avcnSizer.Add(atmSel,0,WACV)
    1403                 avcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,2,min=0.,max=5.,size=(50,25)),0,WACV)
    1404                 avcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,3,min=0.,max=5.,size=(50,25)),0,WACV)
    1405                 avcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,4,min=1.,max=12.,size=(50,25)),0,WACV)
    1406                 avcnSizer.Add(G2G.ValidatedTxtCtrl(self.panel,fxCN,5,min=0.,size=(50,25)),0,WACV)
    1407             mainSizer.Add(avcnSizer,0,WACV)
    1408 
    1409         G2G.HorizontalLine(mainSizer,self.panel)
    1410         mainSizer.Add(wx.StaticText(self.panel,label=' Select data:'),0,WACV)
    1411         histograms = self.Phase['Histograms']
    1412         histNames = list(histograms.keys())
    1413         mainSizer.Add(wx.StaticText(self.panel,label=' Select one histogram for Bragg processing:'),0,WACV)
    1414         histoSizer = wx.BoxSizer(wx.HORIZONTAL)
    1415         histo = wx.ComboBox(self.panel,choices=histNames,style=wx.CB_DROPDOWN|wx.TE_READONLY)
    1416         histo.SetStringSelection(self.RMCPdict['histogram'][0])
    1417         histo.Bind(wx.EVT_COMBOBOX,OnHisto)
    1418         histoSizer.Add(histo,0,WACV)
    1419         histoSizer.Add(wx.StaticText(self.panel,label=' Weight '),0,WACV)
    1420         histoSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['histogram'],1,min=0.,max=10000.,size=(50,25)),0,WACV)
    1421        
    1422         mainSizer.Add(histoSizer,0,WACV)
    1423         samSizer = wx.BoxSizer(wx.HORIZONTAL)
    1424         samSize = wx.CheckBox(self.panel,label=' Use size broadening?')
    1425         samSize.SetValue(self.RMCPdict['UseSampBrd'][0])
    1426         samSize.Bind(wx.EVT_CHECKBOX,OnSize)
    1427         strain = wx.CheckBox(self.panel,label=' Use mustrain broadening?')
    1428         strain.SetValue(self.RMCPdict['UseSampBrd'][1])
    1429         strain.Bind(wx.EVT_CHECKBOX,OnStrain)
    1430         samSizer.Add(samSize,0,WACV)
    1431         samSizer.Add(strain,0,WACV)
    1432         mainSizer.Add(samSizer,0,WACV)
    1433         title = ' Select data for processing:'
    1434         mainSizer.Add(wx.StaticText(self.panel,label=title),0,WACV)
    1435         fileSizer = wx.FlexGridSizer(4,5,5)
    1436         Formats = ['RMC','GUDRUN','STOG']
    1437         Heads = [' ','Format','Weight','Name']
    1438         for head in Heads:
    1439             fileSizer.Add(wx.StaticText(self.panel,label=head),0,WACV)
    1440         for fil in self.RMCPdict['files']:
    1441             filSel = wx.Button(self.panel,label='Select')
    1442             filSel.Bind(wx.EVT_BUTTON,OnFileSel)
    1443             Indx[filSel.GetId()] = fil
    1444             fileSizer.Add(filSel,0,WACV)
    1445             if self.RMCPdict['files'][fil][0]:
    1446                 nform = 3
    1447                 if 'Xray' in fil: nform = 1
    1448                 fileFormat = wx.ComboBox(self.panel,choices=Formats[:nform],style=wx.CB_DROPDOWN|wx.TE_READONLY)
    1449                 fileFormat.SetStringSelection(self.RMCPdict['files'][fil][3])
    1450                 Indx[fileFormat.GetId()] = fil
    1451                 fileFormat.Bind(wx.EVT_COMBOBOX,OnFileFormat)
    1452                 fileSizer.Add(fileFormat,0,WACV)
    1453                 fileSizer.Add(G2G.ValidatedTxtCtrl(self.panel,self.RMCPdict['files'][fil],1),0,WACV)
    1454             if not self.RMCPdict['files'][fil][0]:
    1455                 fileSizer.Add((5,5),0)
    1456                 fileSizer.Add((5,5),0)
    1457             fileSizer.Add(wx.StaticText(self.panel,label=fil+self.RMCPdict['files'][fil][0]),0,WACV)
    1458         mainSizer.Add(fileSizer,0,WACV)
    1459        
    1460         mainSizer.Add(wx.StaticText(self.panel,label=' WARNING: this can take time - be patient'),0,WACV)
    1461         btnSizer = wx.BoxSizer(wx.HORIZONTAL)
    1462         self.OKBtn = wx.Button(self.panel,-1,"OK")
    1463         self.OKBtn.Bind(wx.EVT_BUTTON, self.OnOK)
    1464         btnSizer.Add(self.OKBtn)
    1465         CancelBtn = wx.Button(self.panel,-1,'Cancel')
    1466         CancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
    1467         btnSizer.Add(CancelBtn)
    1468                    
    1469        
    1470         mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
    1471         self.panel.SetSizer(mainSizer)
    1472         size = np.array(self.GetSize())
    1473         self.panel.SetupScrolling()
    1474         self.panel.SetAutoLayout(1)
    1475         size = [size[0]-5,size[1]-20]       #this fiddling is needed for older wx!
    1476         self.panel.SetSize(size)
    1477        
    1478     def GetData(self):
    1479         'Returns the values from the dialog'
    1480         self.Phase.update(self.RMCPdict)
    1481         return self.Phase
    1482        
    1483     def OnOK(self,event):
    1484         parent = self.GetParent()
    1485         parent.Raise()
    1486         self.EndModal(wx.ID_OK)
    1487        
    1488     def OnCancel(self,event):
    1489         parent = self.GetParent()
    1490         parent.Raise()
    1491         self.EndModal(wx.ID_CANCEL)
    1492        
    14931086       
    14941087class SetUpFullrmcDialog(wx.Dialog):
     
    48304423            G2frame.dataWindow.FRMCDataEdit.Enable(G2G.wxID_LOADRMC,True)
    48314424            G2frame.dataWindow.FRMCDataEdit.Enable(G2G.wxID_SAVERMC,True)
     4425        if G2frame.FRMC.GetSizer():
     4426            G2frame.FRMC.GetSizer().Clear(True)
    48324427        mainSizer = wx.BoxSizer(wx.VERTICAL)
    48334428        runFile = ' '
     
    48444439#            G2frame.runtext.SetFont(font1)
    48454440            mainSizer.Add(G2frame.runtext)
    4846         else:
    4847             pass
    4848            
    4849        
     4441        elif G2frame.RMCchoice ==  'RMCProfile':
     4442            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=' RMCProfile setup:'))
     4443            if not data['RMC']['RMCProfile']:
     4444                Atypes = data['General']['AtomTypes']
     4445                aTypes = dict(zip(Atypes,len(Atypes)*[0.10,]))
     4446                atSeq = list(aTypes.keys())
     4447                atOxid = [[atmdata.BVSoxid[atm][0],0.001] for atm in atSeq]
     4448                lenA = len(atSeq)
     4449                Pairs= []
     4450                for pair in [[' %s-%s'%(atSeq[i],atSeq[j]) for j in range(i,lenA)] for i in range(lenA)]:
     4451                    Pairs += pair
     4452                Pairs = {pairs:[0.0,0.0,0.0] for pairs in Pairs}
     4453                BVSpairs = []
     4454                if lenA > 1:
     4455                    for pair in [[' %s-%s'%(atSeq[i],atSeq[j]) for j in range(i+1,lenA)] for i in range(lenA)]:
     4456                        BVSpairs += pair
     4457                    BVS = {pairs:[0.0,0.0,0.0,0.0] for pairs in BVSpairs}
     4458                files = {'Neutron real space data; G(r): ':['',0.05,'G(r)','RMC',],
     4459                          'Neutron reciprocal space data; F(Q): ':['',0.05,'F(Q)','RMC',],
     4460                          'Neutron reciprocal space data; S(Q): ':['',0.05,'S(Q)','RMC',],
     4461                          'Xray real space data; G(r): ':['',0.01,'G(r)','RMC',],
     4462                          'Xray reciprocal space data; F(Q): ':['',0.01,'F(Q)','RMC',],}
     4463                runTimes = [10.,1.]
     4464                metadata = {'title':'none','owner':'no one','date':str(time.ctime()),'temperature':'300K',
     4465                    'material':'nothing','phase':'vacuum','comment':'none ','source':'nowhere'}
     4466                data['RMC']['RMCProfile'] = {'SuperCell':[1,1,1],'UseSampBrd':[True,True],'aTypes':aTypes,
     4467                     'atSeq':atSeq,'Pairs':Pairs,'histogram':['',1.0],'files':files,'metadata':metadata,
     4468                     'runTimes':runTimes,'ReStart':[False,False],'BVS':BVS,'Oxid':atOxid,'useBVS':False,
     4469                     'AveCN':[],'FxCN':[],'Potentials':{'Angles':[],'Angle search':10.,'Stretch':[],'Stretch search':10.}}
     4470            RMCPdict = data['RMC']['RMCProfile']
     4471#patches
     4472            if 'runTimes' not in RMCPdict:
     4473                RMCPdict['runTimes'] = [10.0,1.0]
     4474            lenA = len(RMCPdict['atSeq'])
     4475            if 'Oxid' not in RMCPdict:
     4476                RMCPdict['Oxid'] = [[atmdata.BVSoxid[atm][0],0.001] for atm in RMCPdict['atSeq']]
     4477            Pairs= []
     4478            for pair in [[' %s-%s'%(RMCPdict['atSeq'][i],RMCPdict['atSeq'][j]) for j in range(i,lenA)] for i in range(lenA)]:
     4479                Pairs += pair
     4480            RMCPdict['Pairs'] = dict(zip(Pairs,[RMCPdict['Pairs'].get(pair,[0.0,0.0,0.0]) for pair in Pairs]))
     4481            BVSpairs = []
     4482            if 'BVS' not in RMCPdict:
     4483                RMCPdict['useBVS'] = False
     4484                RMCPdict['BVS'] = {}
     4485            if lenA > 1:
     4486                for pair in [[' %s-%s'%(RMCPdict['atSeq'][i],RMCPdict['atSeq'][j]) for j in range(i+1,lenA)] for i in range(lenA)]:
     4487                    BVSpairs += pair
     4488                RMCPdict['BVS'] = dict(zip(BVSpairs,[RMCPdict['BVS'].get(pair,[0.0,0.0,0.0]) for pair in BVSpairs]))
     4489            if 'FxCN' not in RMCPdict:
     4490                RMCPdict.update({'AveCN':[],'FxCN':[]})
     4491            if 'Potentials' not in RMCPdict:
     4492                RMCPdict.update({'Potentials':{'Angles':[],'Angle search':10.,'Stretch':[],'Stretch search':10.}})
     4493#end patches
     4494               
     4495            def OnHisto(event):
     4496                RMCPdict['histogram'][0] = histo.GetStringSelection()
     4497               
     4498            def OnSize(event):
     4499                RMCPdict['UseSampBrd'][0] = samSize.GetValue()
     4500       
     4501            def OnStrain(event):
     4502                RMCPdict['UseSampBrd'][1] = strain.GetValue()
     4503               
     4504            def OnFileSel(event):
     4505                Obj = event.GetEventObject()
     4506                fil = Indx[Obj.GetId()]
     4507                dlg = wx.FileDialog(G2frame.FRMC, 'Choose '+fil+'NB: do not change directory; must be a local file',
     4508                    '.',style=wx.FD_OPEN,wildcard=fil+'(*.*)|*.*')
     4509                if dlg.ShowModal() == wx.ID_OK:
     4510                    fName = os.path.split(dlg.GetPath())[1]
     4511                    if os.path.exists(fName):
     4512                        RMCPdict['files'][fil][0] = fName
     4513                    dlg.Destroy()
     4514                else:
     4515                    dlg.Destroy()
     4516                    return
     4517                wx.CallAfter(UpdateRMC)
     4518       
     4519            def OnFileFormat(event):
     4520                Obj = event.GetEventObject()
     4521                fil = Indx[Obj.GetId()]
     4522                RMCPdict['files'][fil][3] = Obj.GetStringSelection()
     4523               
     4524            def SetRestart(invalid,value,tc):
     4525                RMCPdict['ReStart'] = [True,True]
     4526               
     4527            def OnUseBVS(event):
     4528                RMCPdict['useBVS'] = not RMCPdict['useBVS']
     4529                wx.CallAfter(UpdateRMC)
     4530               
     4531            def OnAddFxCN(event):
     4532                RMCPdict['FxCN'].append(['','',0.0,2.0,6,1.0,0.001])
     4533                wx.CallAfter(UpdateRMC)
     4534               
     4535            def OnAddAveCN(event):
     4536                RMCPdict['AveCN'].append(['','',0.0,2.0,6.,0.001])
     4537                wx.CallAfter(UpdateRMC)
     4538               
     4539            def OnAddAnglePot(event):
     4540                RMCPdict['Potentials']['Angles'].append(['','','',0.,0.,0.,0.])
     4541                wx.CallAfter(UpdateRMC)
     4542               
     4543            def OnAddBondPot(event):
     4544                RMCPdict['Potentials']['Stretch'].append(['','',0.,0.])
     4545                wx.CallAfter(UpdateRMC)
     4546               
     4547            def GetMetaSizer():
     4548                metalist = ['title','owner','material','phase','comment','source',]
     4549                metaSizer = wx.FlexGridSizer(0,2,5,5)
     4550                for item in metalist:
     4551                    metaSizer.Add(wx.StaticText(G2frame.FRMC,label=' Metadata item: '+item+' '),0,WACV)
     4552                    metaSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['metadata'],item),0,WACV)
     4553                return metaSizer
     4554           
     4555            def GetTimeSizer():
     4556                timeSizer = wx.BoxSizer(wx.HORIZONTAL)
     4557                timeSizer.Add(wx.StaticText(G2frame.FRMC,label=' Total running time (min): '),0,WACV)
     4558                timeSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['runTimes'],0,min=0.),0,WACV)
     4559                timeSizer.Add(wx.StaticText(G2frame.FRMC,label=' Save interval time (min): '),0,WACV)
     4560                timeSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['runTimes'],1,min=0.1,max=20.),0,WACV)
     4561                return timeSizer
     4562               
     4563            def GetSuperSizer():
     4564                superSizer = wx.BoxSizer(wx.HORIZONTAL)
     4565                axes = ['X','Y','Z']
     4566                for i,ax in enumerate(axes):
     4567                    superSizer.Add(wx.StaticText(G2frame.FRMC,label=' %s-axis: '%ax),0,WACV)
     4568                    superSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['SuperCell'],
     4569                        i,min=1,max=20,size=(50,25),OnLeave=SetRestart),0,WACV)
     4570                return superSizer
     4571           
     4572            def GetAtmChoice():
     4573               
     4574                def OnAtSel(event):
     4575                    Obj = event.GetEventObject()
     4576                    itype = Indx[Obj.GetId()]
     4577                    tid = RMCPdict['atSeq'].index(Obj.GetStringSelection())
     4578                    if itype < nTypes:
     4579                        if itype == tid:
     4580                            tid += 1
     4581                        RMCPdict['atSeq'] = G2lat.SwapItems(RMCPdict['atSeq'],itype,tid)
     4582                    wx.CallAfter(UpdateRMC)           
     4583               
     4584                def OnValSel(event):
     4585                    Obj = event.GetEventObject()
     4586                    itype = Indx[Obj.GetId()]
     4587                    RMCPdict['Oxid'][itype][0] = Obj.GetStringSelection()           
     4588                    wx.CallAfter(UpdateRMC)
     4589       
     4590                nTypes = len(RMCPdict['aTypes'])
     4591                atmChoice = wx.FlexGridSizer(nTypes+1,5,5)
     4592                atmChoice.Add(wx.StaticText(G2frame.FRMC,label=' Set atom ordering: '),0,WACV)
     4593                for iType in range(nTypes):
     4594                    atChoice = RMCPdict['atSeq'][iType:]
     4595                    atmSel = wx.ComboBox(G2frame.FRMC,choices=atChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
     4596                    atmSel.SetStringSelection(RMCPdict['atSeq'][iType])
     4597                    atmSel.Bind(wx.EVT_COMBOBOX,OnAtSel)
     4598                    Indx[atmSel.GetId()] = iType
     4599                    atmChoice.Add(atmSel,0,WACV)
     4600                if RMCPdict['useBVS']:   
     4601                    atmChoice.Add(wx.StaticText(G2frame.FRMC,label=' Select valence: '),0,WACV)
     4602                    for itype in range(nTypes):
     4603                        valChoice = atmdata.BVSoxid[RMCPdict['atSeq'][itype]]
     4604                        valSel = wx.ComboBox(G2frame.FRMC,choices=valChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
     4605                        valSel.SetStringSelection(RMCPdict['Oxid'][itype][0])
     4606                        valSel.Bind(wx.EVT_COMBOBOX,OnValSel)
     4607                        Indx[valSel.GetId()] = itype
     4608                        atmChoice.Add(valSel,0,WACV)
     4609                    atmChoice.Add(wx.StaticText(G2frame.FRMC,label=' BVS weight: '),0,WACV)
     4610                    for itype in range(nTypes):
     4611                        atmChoice.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['Oxid'][itype],1,min=0.),0,WACV)
     4612                atmChoice.Add(wx.StaticText(G2frame.FRMC,label=' Set max shift: '),0,WACV)
     4613                for iType in range(nTypes):
     4614                    atId = RMCPdict['atSeq'][iType]
     4615                    atmChoice.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['aTypes'],atId,min=0.,max=1.),0,WACV)
     4616                return atmChoice
     4617         
     4618            def GetPairSizer():
     4619                pairSizer = wx.FlexGridSizer(len(RMCPdict['Pairs'])+1,5,5)
     4620                pairSizer.Add((5,5),0)
     4621                for pair in RMCPdict['Pairs']:
     4622                    pairSizer.Add(wx.StaticText(G2frame.FRMC,label=pair),0,WACV)
     4623                pairSizer.Add(wx.StaticText(G2frame.FRMC,label='%14s'%' Hard min: '),0,WACV)
     4624                for pair in RMCPdict['Pairs']:
     4625                    pairSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['Pairs'][pair],0,min=0.,max=10.,size=(50,25)),0,WACV)
     4626                pairSizer.Add(wx.StaticText(G2frame.FRMC,label='%14s'%' Search from: '),0,WACV)
     4627                for pair in RMCPdict['Pairs']:
     4628                    pairSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['Pairs'][pair],
     4629                        1,min=0.,max=10.,size=(50,25)),0,WACV)
     4630                pairSizer.Add(wx.StaticText(G2frame.FRMC,label='%14s'%'to: '),0,WACV)
     4631                for pair in RMCPdict['Pairs']:
     4632                    pairSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['Pairs'][pair],2,min=0.,max=10.,size=(50,25)),0,WACV)
     4633                return pairSizer
     4634           
     4635            def GetBvsSizer():
     4636               
     4637                def OnResetBVS(event):
     4638                    Obj = event.GetEventObject()
     4639                    pair = Indx[Obj.GetId()]
     4640                    pId = [key for key in RMCPdict['BVS']].index(pair)+1
     4641                    nId = len(RMCPdict['BVS'])+1
     4642                    dist = G2elem.GetBVS(pair,RMCPdict['atSeq'],RMCPdict['Oxid'])
     4643                    if dist:
     4644                        RMCPdict['BVS'][pair] = [dist,0.37,3.0]
     4645                        bvsCh = bvsSizer.GetChildren()
     4646                        addr = 2*nId+pId
     4647                        bvsCh[addr].Window.SetValue('%6.3f'%dist)
     4648                        bvsCh[addr+nId].Window.SetValue('0.37')
     4649                        bvsCh[addr+2*nId].Window.SetValue('3.00')
     4650               
     4651                bvsSizer = wx.FlexGridSizer(len(RMCPdict['BVS'])+1,5,5)
     4652                bvsSizer.Add((5,5),0)
     4653                for pair in RMCPdict['BVS']:
     4654                    bvsSizer.Add(wx.StaticText(G2frame.FRMC,label=pair),0,WACV)
     4655                bvsSizer.Add(wx.StaticText(G2frame.FRMC,label=' Reset:'),0,WACV)
     4656                for pair in RMCPdict['BVS']:
     4657                    reset = wx.Button(G2frame.FRMC,label='Yes')
     4658                    bvsSizer.Add(reset,0,WACV)
     4659                    reset.Bind(wx.EVT_BUTTON,OnResetBVS)
     4660                    Indx[reset.GetId()] = pair
     4661                bvsSizer.Add(wx.StaticText(G2frame.FRMC,label=' Bond length:'),0,WACV)
     4662                for pair in RMCPdict['BVS']:
     4663                    bvsSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['BVS'][pair],0,min=0.,max=10.,size=(50,25)),0,WACV)
     4664                bvsSizer.Add(wx.StaticText(G2frame.FRMC,label=' B constant (0.37): '),0,WACV)
     4665                for pair in RMCPdict['BVS']:
     4666                    bvsSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['BVS'][pair],1,min=0.,max=10.,size=(50,25)),0,WACV)
     4667                bvsSizer.Add(wx.StaticText(G2frame.FRMC,label=' Cut off: '),0,WACV)
     4668                for pair in RMCPdict['BVS']:
     4669                    bvsSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['BVS'][pair],2,min=0.,max=10.,size=(50,25)),0,WACV)
     4670                return bvsSizer
     4671           
     4672            def GetFxcnSizer():
     4673               
     4674                def OnDelFxCN(event):
     4675                    Obj = event.GetEventObject()
     4676                    fxCN = Indx[Obj.GetId()]
     4677                    del RMCPdict['FxCN'][fxCN]
     4678                    wx.CallAfter(UpdateRMC)
     4679                   
     4680                def OnFxcnAtSel(event):
     4681                    Obj = event.GetEventObject()
     4682                    ifxCN,i = Indx[Obj.GetId()]
     4683                    RMCPdict['FxCN'][ifxCN][i] = Obj.GetStringSelection()
     4684               
     4685                fxcnSizer = wx.FlexGridSizer(8,5,5)
     4686                atChoice = RMCPdict['atSeq']
     4687                fxcnLabels = [' ','Atom-1','Atom-2','min dist','max dist','CN','fraction','weight']
     4688                for lab in fxcnLabels:
     4689                    fxcnSizer.Add(wx.StaticText(G2frame.FRMC,label=lab),0,WACV)
     4690                for ifx,fxCN in enumerate(RMCPdict['FxCN']):
     4691                    delBtn = wx.Button(G2frame.FRMC,label='Delete')
     4692                    delBtn.Bind(wx.EVT_BUTTON,OnDelFxCN)
     4693                    Indx[delBtn.GetId()] = ifx
     4694                    fxcnSizer.Add(delBtn,0,WACV)
     4695                    for i in [0,1]:
     4696                        atmSel = wx.ComboBox(G2frame.FRMC,choices=atChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
     4697                        atmSel.SetStringSelection(fxCN[i])
     4698                        atmSel.Bind(wx.EVT_COMBOBOX,OnFxcnAtSel)
     4699                        Indx[atmSel.GetId()] = [ifx,i]
     4700                        fxcnSizer.Add(atmSel,0,WACV)
     4701                    fxcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,2,min=0.,max=5.,size=(50,25)),0,WACV)
     4702                    fxcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,3,min=0.,max=5.,size=(50,25)),0,WACV)
     4703                    fxcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,4,min=1,max=12,size=(50,25)),0,WACV)
     4704                    fxcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,5,min=0.,max=1.,size=(50,25)),0,WACV)
     4705                    fxcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,6,min=0.,size=(50,25)),0,WACV)
     4706                return fxcnSizer
     4707   
     4708            def GetAvcnSizer():
     4709               
     4710                def OnDelAvCN(event):
     4711                    Obj = event.GetEventObject()
     4712                    fxCN = Indx[Obj.GetId()]
     4713                    del RMCPdict['AveCN'][fxCN]
     4714                    wx.CallAfter(UpdateRMC)
     4715                   
     4716                def OnAvcnAtSel(event):
     4717                    Obj = event.GetEventObject()
     4718                    ifxCN,i = Indx[Obj.GetId()]
     4719                    RMCPdict['AveCN'][ifxCN][i] = Obj.GetStringSelection()
     4720                               
     4721                avcnSizer = wx.FlexGridSizer(7,5,5)
     4722                atChoice = RMCPdict['atSeq']
     4723                fxcnLabels = [' ','Atom-1','Atom-2','min dist','max dist','CN','weight']
     4724                for lab in fxcnLabels:
     4725                    avcnSizer.Add(wx.StaticText(G2frame.FRMC,label=lab),0,WACV)
     4726                for ifx,fxCN in enumerate(RMCPdict['FxCN']):
     4727                    delBtn = wx.Button(G2frame.FRMC,label='Delete')
     4728                    delBtn.Bind(wx.EVT_BUTTON,OnDelAvCN)
     4729                    Indx[delBtn.GetId()] = ifx
     4730                    avcnSizer.Add(delBtn,0,WACV)
     4731                    for i in [0,1]:
     4732                        atmSel = wx.ComboBox(G2frame.FRMC,choices=atChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
     4733                        atmSel.SetStringSelection(fxCN[i])
     4734                        atmSel.Bind(wx.EVT_COMBOBOX,OnAvcnAtSel)
     4735                        Indx[atmSel.GetId()] = [ifx,i]
     4736                        avcnSizer.Add(atmSel,0,WACV)
     4737                    avcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,2,min=0.,max=5.,size=(50,25)),0,WACV)
     4738                    avcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,3,min=0.,max=5.,size=(50,25)),0,WACV)
     4739                    avcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,4,min=1.,max=12.,size=(50,25)),0,WACV)
     4740                    avcnSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,fxCN,5,min=0.,size=(50,25)),0,WACV)
     4741                return avcnSizer
     4742   
     4743            def GetAngleSizer():
     4744               
     4745                def OnDelAngle(event):
     4746                    Obj = event.GetEventObject()
     4747                    angle = Indx[Obj.GetId()]
     4748                    del RMCPdict['Potentials']['Angles'][angle]
     4749                    wx.CallAfter(UpdateRMC)
     4750                   
     4751                def OnAngleAtSel(event):
     4752                    Obj = event.GetEventObject()
     4753                    angle,i = Indx[Obj.GetId()]
     4754                    RMCPdict['Potentials']['Angles'][angle][i] = Obj.GetStringSelection()
     4755                                           
     4756                def SetRestart1(invalid,value,tc):
     4757                    RMCPdict['ReStart'][1] = True
     4758               
     4759                atChoice = RMCPdict['atSeq']
     4760                angleSizer = wx.FlexGridSizer(8,5,5)
     4761                fxcnLabels = [' ','Atom-A','Atom-B','Atom-C',' ABC angle','AB dist','BC dist','potential']
     4762                for lab in fxcnLabels:
     4763                    angleSizer.Add(wx.StaticText(G2frame.FRMC,label=lab),0,WACV)
     4764                for ifx,angle in enumerate(RMCPdict['Potentials']['Angles']):
     4765                    delBtn = wx.Button(G2frame.FRMC,label='Delete')
     4766                    delBtn.Bind(wx.EVT_BUTTON,OnDelAngle)
     4767                    Indx[delBtn.GetId()] = ifx
     4768                    angleSizer.Add(delBtn,0,WACV)
     4769                    for i in [0,1,2]:
     4770                        atmSel = wx.ComboBox(G2frame.FRMC,choices=atChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
     4771                        atmSel.SetStringSelection(angle[i])
     4772                        atmSel.Bind(wx.EVT_COMBOBOX,OnAngleAtSel)
     4773                        Indx[atmSel.GetId()] = [ifx,i]
     4774                        angleSizer.Add(atmSel,0,WACV)
     4775                    angleSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,angle,3,min=0.,max=180.,OnLeave=SetRestart1,size=(50,25)),0,WACV)
     4776                    angleSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,angle,4,min=0.5,max=5.,OnLeave=SetRestart1,size=(50,25)),0,WACV)
     4777                    angleSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,angle,5,min=0.5,max=5.,OnLeave=SetRestart1,size=(50,25)),0,WACV)
     4778                    angleSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,angle,6,min=0.,OnLeave=SetRestart1,size=(50,25)),0,WACV)
     4779                return angleSizer
     4780   
     4781            def GetBondSizer():
     4782   
     4783                def OnDelBond(event):
     4784                    Obj = event.GetEventObject()
     4785                    bond = Indx[Obj.GetId()]
     4786                    del RMCPdict['Potentials']['Stretch'][bond]
     4787                    wx.CallAfter(UpdateRMC)
     4788                   
     4789                def OnBondAtSel(event):
     4790                    Obj = event.GetEventObject()
     4791                    bond,i = Indx[Obj.GetId()]
     4792                    RMCPdict['Potentials']['Stretch'][bond][i] = Obj.GetStringSelection()
     4793                                           
     4794                def SetRestart1(invalid,value,tc):
     4795                    RMCPdict['ReStart'][1] = True
     4796               
     4797                atChoice = RMCPdict['atSeq']
     4798                bondSizer = wx.FlexGridSizer(5,5,5)
     4799                fxcnLabels = [' ','Atom-A','Atom-B',' AB dist','potential']
     4800                for lab in fxcnLabels:
     4801                    bondSizer.Add(wx.StaticText(G2frame.FRMC,label=lab),0,WACV)
     4802                for ifx,bond in enumerate(RMCPdict['Potentials']['Stretch']):
     4803                    delBtn = wx.Button(G2frame.FRMC,label='Delete')
     4804                    delBtn.Bind(wx.EVT_BUTTON,OnDelBond)
     4805                    Indx[delBtn.GetId()] = ifx
     4806                    bondSizer.Add(delBtn,0,WACV)
     4807                    for i in [0,1]:
     4808                        atmSel = wx.ComboBox(G2frame.FRMC,choices=atChoice,style=wx.CB_DROPDOWN|wx.TE_READONLY)
     4809                        atmSel.SetStringSelection(bond[i])
     4810                        atmSel.Bind(wx.EVT_COMBOBOX,OnBondAtSel)
     4811                        Indx[atmSel.GetId()] = [ifx,i]
     4812                        bondSizer.Add(atmSel,0,WACV)
     4813                    bondSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,bond,2,min=0.,max=5.,OnLeave=SetRestart1,size=(50,25)),0,WACV)
     4814                    bondSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,bond,3,min=0.,size=(50,25)),0,WACV)
     4815                return bondSizer
     4816
     4817            Indx = {}
     4818
     4819            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=' Enter metadata items:'),0,WACV)
     4820            mainSizer.Add(GetMetaSizer(),0,WACV)
     4821           
     4822            G2G.HorizontalLine(mainSizer,G2frame.FRMC)
     4823            mainSizer.Add(GetTimeSizer(),0,WACV)
     4824           
     4825            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=' Lattice multipliers; if changed will force reset of atom positions:'),0,WACV)
     4826            mainSizer.Add(GetSuperSizer(),0,WACV)
     4827           
     4828            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=' NB: be sure to set cations first && anions last in atom ordering'),0,WACV)
     4829            mainSizer.Add(GetAtmChoice(),0,WACV)
     4830           
     4831            G2G.HorizontalLine(mainSizer,G2frame.FRMC)
     4832            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=' Enter constraints && restraints:'),0,WACV)
     4833            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=' Set minimum && maximum distances for:'),0,WACV)       
     4834            mainSizer.Add(GetPairSizer(),0,WACV)
     4835           
     4836            G2G.HorizontalLine(mainSizer,G2frame.FRMC)
     4837            useBVS = wx.CheckBox(G2frame.FRMC,label=' Use bond valence sum restraints for (set to 0 for non-bonded ones):')
     4838            useBVS.SetValue(RMCPdict.get('useBVS',False))
     4839            useBVS.Bind(wx.EVT_CHECKBOX,OnUseBVS)
     4840            mainSizer.Add(useBVS,0,WACV)
     4841            if RMCPdict.get('useBVS',False):
     4842                mainSizer.Add(GetBvsSizer(),0,WACV)
     4843       
     4844            G2G.HorizontalLine(mainSizer,G2frame.FRMC)
     4845            fxcnBox = wx.BoxSizer(wx.HORIZONTAL)
     4846            fxcnAdd = wx.Button(G2frame.FRMC,label='Add')
     4847            fxcnAdd.Bind(wx.EVT_BUTTON,OnAddFxCN)
     4848            fxcnBox.Add(fxcnAdd,0,WACV)
     4849            fxcnBox.Add(wx.StaticText(G2frame.FRMC,label=' Fixed coordination number restraint: '),0,WACV)
     4850            mainSizer.Add(fxcnBox,0,WACV)       
     4851            if len(RMCPdict['FxCN']):
     4852                mainSizer.Add(GetFxcnSizer(),0,WACV)           
     4853           
     4854            G2G.HorizontalLine(mainSizer,G2frame.FRMC)
     4855            avcnBox = wx.BoxSizer(wx.HORIZONTAL)
     4856            avcnAdd = wx.Button(G2frame.FRMC,label='Add')
     4857            avcnAdd.Bind(wx.EVT_BUTTON,OnAddAveCN)
     4858            avcnBox.Add(avcnAdd,0,WACV)
     4859            avcnBox.Add(wx.StaticText(G2frame.FRMC,label=' Average coordination number restraint: '),0,WACV)
     4860            mainSizer.Add(avcnBox,0,WACV)
     4861            if len(RMCPdict['AveCN']):
     4862                mainSizer.Add(GetAvcnSizer(),0,WACV)
     4863               
     4864            G2G.HorizontalLine(mainSizer,G2frame.FRMC)
     4865            angpotBox = wx.BoxSizer(wx.HORIZONTAL)
     4866            angpotAdd = wx.Button(G2frame.FRMC,label='Add')
     4867            angpotAdd.Bind(wx.EVT_BUTTON,OnAddAnglePot)
     4868            angpotBox.Add(angpotAdd,0,WACV)
     4869            angpotBox.Add(wx.StaticText(G2frame.FRMC,label=' A-B-C angle potential restraints, search range (%): '),0,WACV)
     4870            angpotBox.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['Potentials'],'Angle search',min=0.,max=100.,size=(50,25)),0,WACV)
     4871            mainSizer.Add(angpotBox,0,WACV)
     4872            if len(RMCPdict['Potentials']['Angles']):
     4873                mainSizer.Add(GetAngleSizer(),0,WACV)
     4874               
     4875            G2G.HorizontalLine(mainSizer,G2frame.FRMC)
     4876            bondpotBox = wx.BoxSizer(wx.HORIZONTAL)
     4877            bondpotAdd = wx.Button(G2frame.FRMC,label='Add')
     4878            bondpotAdd.Bind(wx.EVT_BUTTON,OnAddBondPot)
     4879            bondpotBox.Add(bondpotAdd,0,WACV)
     4880            bondpotBox.Add(wx.StaticText(G2frame.FRMC,label=' A-B stretch potential restraints, search range (%): '),0,WACV)
     4881            bondpotBox.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['Potentials'],'Stretch search',min=0.,max=100.,size=(50,25)),0,WACV)
     4882            mainSizer.Add(bondpotBox,0,WACV)
     4883            if len(RMCPdict['Potentials']['Stretch']):
     4884                mainSizer.Add(GetBondSizer(),0,WACV)
     4885
     4886            G2G.HorizontalLine(mainSizer,G2frame.FRMC)
     4887            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=' Select data:'),0,WACV)
     4888            histograms = data['Histograms']
     4889            histNames = list(histograms.keys())
     4890            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=' Select one histogram for Bragg processing:'),0,WACV)
     4891            histoSizer = wx.BoxSizer(wx.HORIZONTAL)
     4892            histo = wx.ComboBox(G2frame.FRMC,choices=histNames,style=wx.CB_DROPDOWN|wx.TE_READONLY)
     4893            histo.SetStringSelection(RMCPdict['histogram'][0])
     4894            histo.Bind(wx.EVT_COMBOBOX,OnHisto)
     4895            histoSizer.Add(histo,0,WACV)
     4896            histoSizer.Add(wx.StaticText(G2frame.FRMC,label=' Weight '),0,WACV)
     4897            histoSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['histogram'],1,min=0.,max=10000.,size=(50,25)),0,WACV)
     4898            mainSizer.Add(histoSizer,0,WACV)
     4899           
     4900            samSizer = wx.BoxSizer(wx.HORIZONTAL)
     4901            samSize = wx.CheckBox(G2frame.FRMC,label=' Use size broadening?')
     4902            samSize.SetValue(RMCPdict['UseSampBrd'][0])
     4903            samSize.Bind(wx.EVT_CHECKBOX,OnSize)
     4904            strain = wx.CheckBox(G2frame.FRMC,label=' Use mustrain broadening?')
     4905            strain.SetValue(RMCPdict['UseSampBrd'][1])
     4906            strain.Bind(wx.EVT_CHECKBOX,OnStrain)
     4907            samSizer.Add(samSize,0,WACV)
     4908            samSizer.Add(strain,0,WACV)
     4909            mainSizer.Add(samSizer,0,WACV)
     4910            title = ' Select data for processing:'
     4911            mainSizer.Add(wx.StaticText(G2frame.FRMC,label=title),0,WACV)
     4912            fileSizer = wx.FlexGridSizer(4,5,5)
     4913            Formats = ['RMC','GUDRUN','STOG']
     4914            Heads = [' ','Format','Weight','Name']
     4915            for head in Heads:
     4916                fileSizer.Add(wx.StaticText(G2frame.FRMC,label=head),0,WACV)
     4917            for fil in RMCPdict['files']:
     4918                filSel = wx.Button(G2frame.FRMC,label='Select')
     4919                filSel.Bind(wx.EVT_BUTTON,OnFileSel)
     4920                Indx[filSel.GetId()] = fil
     4921                fileSizer.Add(filSel,0,WACV)
     4922                if RMCPdict['files'][fil][0]:
     4923                    nform = 3
     4924                    if 'Xray' in fil: nform = 1
     4925                    fileFormat = wx.ComboBox(G2frame.FRMC,choices=Formats[:nform],style=wx.CB_DROPDOWN|wx.TE_READONLY)
     4926                    fileFormat.SetStringSelection(RMCPdict['files'][fil][3])
     4927                    Indx[fileFormat.GetId()] = fil
     4928                    fileFormat.Bind(wx.EVT_COMBOBOX,OnFileFormat)
     4929                    fileSizer.Add(fileFormat,0,WACV)
     4930                    fileSizer.Add(G2G.ValidatedTxtCtrl(G2frame.FRMC,RMCPdict['files'][fil],1),0,WACV)
     4931                if not RMCPdict['files'][fil][0]:
     4932                    fileSizer.Add((5,5),0)
     4933                    fileSizer.Add((5,5),0)
     4934                fileSizer.Add(wx.StaticText(G2frame.FRMC,label=fil+RMCPdict['files'][fil][0]),0,WACV)
     4935            mainSizer.Add(fileSizer,0,WACV)
     4936   
    48504937        SetPhaseWindow(G2frame.FRMC,mainSizer)
    48514938       
     
    49064993        else:
    49074994            G2frame.dataWindow.FRMCDataEdit.Enable(G2G.wxID_RUNRMC,True)
    4908             dlg = SetUpRMCProfileDialog(G2frame,Name=pName,Phase=data)
    4909             if dlg.ShowModal() == wx.ID_OK:
    4910                 phase = dlg.GetData()
    4911                 RMCPdict = phase['RMC']['RMCProfile']
    4912                 PWId = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,RMCPdict['histogram'][0])
    4913                 if PWId:
    4914                     print(G2pwd.MakeInst(G2frame,pName,data,RMCPdict['UseSampBrd'],PWId)+ ' written')
    4915                     backfile = G2pwd.MakeBack(G2frame,pName,PWId)
    4916                     if backfile is None:
    4917                         print(' Chebyschev-1 background not used; no .back file written')
    4918                         wx.MessageDialog(G2frame,' Chebyschev-1 background not used; '+ \
    4919                             'no .back file written & RMCProfile will not run','Wrong background function',wx.OK).ShowModal()
    4920                         G2frame.dataWindow.FRMCDataEdit.Enable(G2G.wxID_RUNRMC,False)
    4921                         return
    4922                     else:
    4923                         print(backfile+ ' written')
    4924                     print(G2pwd.MakeBragg(G2frame,pName,data,PWId)+ ' written')
    4925                     if RMCPdict.get('ReStart',False):
    4926                         print(G2pwd.MakeRMC6f(G2frame,pName,data,RMCPdict,PWId)+ ' written')
    4927                     print(G2pwd.MakeRMCPdat(G2frame,pName,data,RMCPdict,PWId)+ ' written')
    4928                     print('RMCProfile file build completed')
    4929                     RMCPdict['ReStart'] = False
     4995            RMCPdict = data['RMC']['RMCProfile']
     4996            PWId = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,RMCPdict['histogram'][0])
     4997            if PWId:
     4998                print(G2pwd.MakeInst(G2frame,pName,data,RMCPdict['UseSampBrd'],PWId)+ ' written')
     4999                backfile = G2pwd.MakeBack(G2frame,pName,PWId)
     5000                if backfile is None:
     5001                    print(' Chebyschev-1 background not used; no .back file written')
     5002                    wx.MessageDialog(G2frame,' Chebyschev-1 background not used; '+ \
     5003                        'no .back file written & RMCProfile will not run','Wrong background function',wx.OK).ShowModal()
     5004                    G2frame.dataWindow.FRMCDataEdit.Enable(G2G.wxID_RUNRMC,False)
     5005                    return
    49305006                else:
    4931                     print('RMCProfile file build failed - no histogram selected')
    4932                     G2frame.dataWindow.FRMCDataEdit.Enable(G2G.wxID_RUNRMC,False)
     5007                    print(backfile+ ' written')
     5008                print(G2pwd.MakeBragg(G2frame,pName,data,PWId)+ ' written')
     5009                if RMCPdict['ReStart'][0]:
     5010                    if os.path.isfile(pName+'.his6f'):
     5011                        os.remove(pName+'.his6f')
     5012                    print(G2pwd.MakeRMC6f(G2frame,pName,data,RMCPdict,PWId)+ ' written')
     5013                print(G2pwd.MakeRMCPdat(G2frame,pName,data,RMCPdict,PWId)+ ' written')
     5014                print('RMCProfile file build completed')
     5015                RMCPdict['ReStart'] = [False,False]
    49335016            else:
    4934                 pass
    4935             dlg.Destroy()         
     5017                print('RMCProfile file build failed - no histogram selected')
     5018                G2frame.dataWindow.FRMCDataEdit.Enable(G2G.wxID_RUNRMC,False)
    49365019           
    49375020    def OnLoadRMC(event):
     
    49405023            dlg = wx.FileDialog(G2frame, 'Choose fullrmc run file to open', '.', runFile,
    49415024                wildcard='fullrmc run.py file (*.py)|*.py',style=wx.FD_OPEN| wx.FD_CHANGE_DIR)
    4942         else:
    4943             dlg = wx.FileDialog(G2frame, 'Choose RMCProfile control file to open',  '.', runFile,
    4944                 wildcard='RMCProfile control file (*.dat)|*.dat|All files (*.*)|*.*',style=wx.FD_OPEN| wx.FD_CHANGE_DIR)
    49455025        try:
    49465026            if dlg.ShowModal() == wx.ID_OK:
     
    49595039            dlg = wx.FileDialog(G2frame, 'Choose fullrmc run.py file to save',  '.', runFile,
    49605040                wildcard='fullrmc run.py file (*.py)|*.py',style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
    4961         else:
    4962             dlg = wx.FileDialog(G2frame, 'Choose RMCProfile control file to save',  '.', runFile,
    4963                 wildcard='RMCProfile control file (*.dat)|*.dat|All files (*.*)|*.*',style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
    49645041        try:
    49655042            if dlg.ShowModal() == wx.ID_OK:
     
    49755052    def OnRunRMC(event):
    49765053       
     5054        generalData = data['General']
     5055        pName = generalData['Name'].replace(' ','_')
    49775056        if G2frame.RMCchoice == 'fullrmc':
    49785057            wx.MessageBox(''' For use of fullrmc, please cite:
     
    50125091      doi: https://doi.org/10.1088/0953-8984/19/33/335218''',
    50135092      caption='RMCProfile',style=wx.ICON_INFORMATION)
     5093            if os.path.isfile(pName+'.neigh'):
     5094                os.remove(pName+'.neigh')
     5095            if os.path.isfile(pName+'.bonds'):
     5096                os.remove(pName+'.bonds')
     5097            if os.path.isfile(pName+'.triplets'):
     5098                os.remove(pName+'.triplets')
     5099            G2frame.OnFileSave(event)
     5100            print (' GSAS-II project saved')
    50145101            import subprocess as sb
    50155102            generalData = data['General']
     
    51325219                    labelY=r'$\mathsf{\chi^2}$',newPlot=True,Title='RMCP Chi^2 for '+pName,
    51335220                    lines=True,names=Names[3:])
    5134         UpdateRMC()
     5221       
     5222       
    51355223           
    51365224################################################################################
  • trunk/GSASIIpwd.py

    r4254 r4263  
    21072107        if useSamBrd[0]:
    21082108            if 'ellipsoidal' not in Size[0]:    #take the isotropic term only
    2109                 Xsb = 1.e-4*difC/Size[1][0]
     2109                Xsb = 1.e-4*difC/Size[1][0]/2.
    21102110        if useSamBrd[1]:
    21112111            if 'generalized' not in Mustrain[0]:    #take the isotropic term only
    2112                 Ysb = 1.e-6*difC*Mustrain[1][0]
     2112                Ysb = 1.e-6*difC*Mustrain[1][0]/2.
    21132113        prms = ['Bank',
    21142114                'difC','difA','Zero','2-theta',
     
    21232123        fl.write('%12.6e%14.6e%14.6e\n'%(inst[prms[5]][1],inst[prms[6]][1],inst[prms[7]][1]))
    21242124        fl.write('%12.6e%14.6e%14.6e\n'%(inst[prms[8]][1],inst[prms[9]][1],inst[prms[10]][1]))   
    2125         fl.write('%12.6e%14.6e%14.6e%14.6e%14.6e\n'%(inst[prms[11]][1],inst[prms[12]][1]+Ysb,inst[prms[13]][1]+Xsb,0.0,0.0))
     2125        fl.write('%12.6e%14.6e%14.6e%14.6e%14.6e\n'%(inst[prms[11]][1],inst[prms[12]][1]+Xsb,inst[prms[13]][1]+Ysb,0.0,0.0))
    21262126        fl.close()
    21272127    else:
     
    21292129            wave = G2mth.getWave(inst)
    21302130            if 'ellipsoidal' not in Size[0]:    #take the isotropic term only
    2131                 Xsb = 1.8*wave/(np.pi*Size[1][0])
     2131                Xsb = 1.8*wave/(np.pi*Size[1][0])/2.
    21322132        if useSamBrd[1]:
    21332133            if 'generalized' not in Mustrain[0]:    #take the isotropic term only
    2134                 Ysb = 0.018*np.pi*Mustrain[1][0]
     2134                Ysb = 0.018*np.pi*Mustrain[1][0]/2.
    21352135        prms = ['Bank',
    21362136                'Lam','Zero','Polariz.',
     
    21682168
    21692169def MakeRMC6f(G2frame,Name,Phase,RMCPdict,PWId):
     2170   
     2171    def findDup(Atoms):
     2172        Dup = []
     2173        Fracs = []
     2174        for iat1,at1 in enumerate(Atoms):
     2175            if any([at1[0] in dup for dup in Dup]):
     2176                continue
     2177            else:
     2178                Dup.append([at1[0],])
     2179                Fracs.append([at1[6],])
     2180            for iat2,at2 in enumerate(Atoms[(iat1+1):]):
     2181                if np.sum((np.array(at1[3:6])-np.array(at2[3:6]))**2) < 0.00001:
     2182                    Dup[-1] += [at2[0],]
     2183                    Fracs[-1]+= [at2[6],]
     2184        return Dup,Fracs
     2185   
    21702186    Meta = RMCPdict['metadata']
    21712187    Atseq = RMCPdict['atSeq']
     
    21732189    PWDdata = G2frame.GetPWDRdatafromTree(PWId)
    21742190    generalData = Phase['General']
     2191    Dups,Fracs = findDup(Phase['Atoms'])
     2192    Sfracs = [np.cumsum(fracs) for fracs in Fracs]
    21752193    Sample = PWDdata['Sample Parameters']
    21762194    Meta['temperature'] = Sample['Temperature']
     
    21852203    Natm = np.count_nonzero(Natm-1)
    21862204    Atoms = newPhase['Atoms']
     2205    Satoms = G2mth.sortArray(G2mth.sortArray(G2mth.sortArray(Atoms,5),4),3)
     2206    Datoms = [[atom for atom in Satoms if atom[0] in dup] for dup in Dups]
     2207    Natoms = []
     2208    for idup,dup in enumerate(Dups):
     2209        ldup = len(dup)
     2210        datoms = Datoms[idup]
     2211        natm = len(datoms)
     2212        i = 0
     2213        while i < natm:
     2214            atoms = datoms[i:i+ldup]
     2215            try:
     2216                atom = atoms[np.searchsorted(Sfracs[idup],rand.random())]
     2217                Natoms.append(atom)
     2218            except IndexError:      #what about vacancies?
     2219                pass
     2220            i += ldup
    21872221    NAtype = np.zeros(len(Atseq))
    2188     for atom in Atoms:
     2222    for atom in Natoms:
    21892223        NAtype[Atseq.index(atom[1])] += 1
    21902224    NAstr = ['%d'%i for i in NAtype]
     
    22012235    fl.write('Atom types present:             %s\n'%'    '.join(Atseq))
    22022236    fl.write('Number of each atom type:       %s\n'%'  '.join(NAstr))
    2203     fl.write('Number of atoms:                %d\n'%len(Atoms))
     2237    fl.write('Number of atoms:                %d\n'%len(Natoms))
    22042238    fl.write('%-35s%4d%4d%4d\n'%('Supercell dimensions:',Supercell[0],Supercell[1],Supercell[2]))
    22052239    fl.write('Cell (Ang/deg): %12.6f%12.6f%12.6f%12.6f%12.6f%12.6f\n'%(
     
    22122246    nat = 0
    22132247    for atm in Atseq:
    2214         for iat,atom in enumerate(Atoms):
     2248        for iat,atom in enumerate(Natoms):
    22152249            if atom[1] == atm:
    22162250                nat += 1
     
    22382272    fname = Name+'.bragg'
    22392273    fl = open(fname,'w')
    2240     fl.write('%12d%6d%15.7f%15.4f\n'%(Ifin-Ibeg-1,Bank,Scale,Vol))
     2274    fl.write('%12d%6d%15.7f%15.4f\n'%(Ifin-Ibeg-2,Bank,Scale,Vol))
    22412275    if 'T' in Inst['Type'][0]:
    22422276        fl.write('%12s%12s\n'%('   TOF,ms','  I(obs)'))
     
    22452279    else:
    22462280        fl.write('%12s%12s\n'%('   2-theta, deg','  I(obs)'))
     2281        DT = np.diff(Data[0])
    22472282        for i in range(Ibeg,Ifin-1):
    2248             fl.write('%11.6f%15.2f\n'%(Data[0][i],Data[1][i]))       
     2283            fl.write('%11.6f%15.2f\n'%(Data[0][i]-DT[i],Data[1][i]))       
    22492284    fl.close()
    22502285    return fname
     
    23092344    fl.write('INPUT_CONFIGURATION_FORMAT ::  rmc6f\n')
    23102345    fl.write('SAVE_CONFIGURATION_FORMAT  ::  rmc6f\n')
     2346    fl.write('\n')
    23112347    fl.write('DISTANCE_WINDOW ::\n')
    23122348    fl.write('  > MNDIST :: %s\n'%minD)
    23132349    fl.write('  > MXDIST :: %s\n'%maxD)
     2350    if len(RMCPdict['Potentials']['Stretch']) or len(RMCPdict['Potentials']['Stretch']):
     2351        fl.write('\n')
     2352        fl.write('POTENTIALS ::\n')
     2353        if len(RMCPdict['Potentials']['Stretch']):
     2354            fl.write('  > STRETCH_SEARCH :: %.1f%%\n'%RMCPdict['Potentials']['Stretch search'])
     2355            for bond in RMCPdict['Potentials']['Stretch']:
     2356                fl.write('  > STRETCH :: %s %s %.2f eV %.2f Ang\n'%(bond[0],bond[1],bond[3],bond[2]))       
     2357        if len(RMCPdict['Potentials']['Angles']):
     2358            fl.write('  > ANGLE_SEARCH :: %.1f%%\n'%RMCPdict['Potentials']['Angle search'])
     2359            for angle in RMCPdict['Potentials']['Angles']:
     2360                fl.write('  > ANGLE :: %s %s %s %.2f eV %.2f deg %.2f Ang %.2f Ang\n'%
     2361                    (angle[1],angle[0],angle[2],angle[6],angle[3],angle[4],angle[5]))
    23142362    if RMCPdict['useBVS']:
    23152363        fl.write('BVS ::\n')
     
    23642412                    fl.write('  > REAL_SPACE_FIT :: 1 3000 1\n')
    23652413                    fl.write('  > REAL_SPACE_PARAMETERS :: 1 3000 %.4f\n'%Files[File][1])
     2414    fl.write('\n')
    23662415    fl.write('BRAGG ::\n')
    23672416    fl.write('  > BRAGG_SHAPE :: %s\n'%gsasType)
Note: See TracChangeset for help on using the changeset viewer.