Changeset 1930
- Timestamp:
- Jul 16, 2015 1:37:20 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIgrid.py
r1926 r1930 67 67 wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSVIEWADD, wxID_ATOMVIEWINSERT, 68 68 wxID_RELOADDRAWATOMS,wxID_ATOMSDISAGL,wxID_ATOMMOVE,wxID_MAKEMOLECULE, 69 wxID_ASSIGNATMS2RB,wxID_ATOMSPDISAGL, wxID_ISODISP,wxID_ADDHATOM, 70 ] = [wx.NewId() for item in range(1 6)]69 wxID_ASSIGNATMS2RB,wxID_ATOMSPDISAGL, wxID_ISODISP,wxID_ADDHATOM,wxID_UPDATEHATOM, 70 ] = [wx.NewId() for item in range(17)] 71 71 72 72 [ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, … … 317 317 self.EndModal(wx.ID_CANCEL) 318 318 319 ################################################################################ 319 320 class AddHatomDialog(wx.Dialog): 320 321 '''H atom addition dialog. After :meth:`ShowModal` returns, the results … … 346 347 self.Neigh[item][2] = i 347 348 349 def OnBond(event): 350 Obj = event.GetEventObject() 351 inei,ibond = Indx[Obj.GetId()] 352 self.Neigh[inei][1][0][ibond][2] = Obj.GetValue() 353 348 354 self.panel.Destroy() 349 355 self.panel = wxscroll.ScrolledPanel(self,style = wx.DEFAULT_DIALOG_STYLE) … … 352 358 0,wx.LEFT|wx.TOP,10) 353 359 mainSizer.Add(wx.StaticText(self.panel,-1,'NB: Check selections as they may not be correct'),0,WACV|wx.LEFT,10) 354 mainSizer.Add(wx.StaticText(self.panel,-1," Atom: Add # H's Neighbors, dist"),0,wx.TOP|wx.LEFT,5)360 mainSizer.Add(wx.StaticText(self.panel,-1," Atom: Add # H's Use: Neighbors, dist"),0,wx.TOP|wx.LEFT,5) 355 361 nHatms = ['0','1','2','3'] 356 362 dataSizer = wx.FlexGridSizer(0,3,0,0) … … 374 380 dataSizer.Add(checks,0,WACV) 375 381 lineSizer = wx.BoxSizer(wx.HORIZONTAL) 376 for bond in neigh[1][0]: 377 lineSizer.Add(wx.StaticText(self.panel,-1,' %s, %.3f'%(bond[0],bond[1])),0,WACV) 382 for ib,bond in enumerate(neigh[1][0]): 383 Bond = wx.CheckBox(self.panel,-1,label=': %s, %.3f'%(bond[0],bond[1])) 384 Bond.SetValue(bond[2]) 385 Indx[Bond.GetId()] = [inei,ib] 386 Bond.Bind(wx.EVT_CHECKBOX,OnBond) 387 lineSizer.Add(Bond,0,WACV) 378 388 dataSizer.Add(lineSizer,0,WACV|wx.RIGHT,10) 379 389 mainSizer.Add(dataSizer,0,wx.LEFT,5) … … 399 409 def GetData(self): 400 410 'Returns the values from the dialog' 411 for neigh in self.Neigh: 412 for ibond,bond in enumerate(neigh[1][0]): 413 if not bond[2]: 414 neigh[1][1][1][ibond] = 0 #deselected bond 415 neigh[1][1][1] = [a for a in neigh[1][1][1] if a] 401 416 return self.Neigh #has #Hs to add for each entry 402 417 … … 412 427 self.EndModal(wx.ID_CANCEL) 413 428 429 ################################################################################ 414 430 class DisAglDialog(wx.Dialog): 415 431 '''Distance/Angle Controls input dialog. After … … 1231 1247 self.AtomEdit.Append(id=wxID_ADDHATOM, kind=wx.ITEM_NORMAL,text='Insert H atoms', 1232 1248 help='Insert H atoms in standard positions bonded to selected atoms') 1249 self.AtomEdit.Append(id=wxID_UPDATEHATOM, kind=wx.ITEM_NORMAL,text='Update H atoms', 1250 help='Update H atoms in standard positions') 1233 1251 self.AtomEdit.Append(id=wxID_ATOMMOVE, kind=wx.ITEM_NORMAL,text='Move atom to view point', 1234 1252 help='Select single atom to move') -
trunk/GSASIImath.py
r1929 r1930 401 401 if j != Orig: 402 402 if AtNames[j] != notName: 403 Neigh.append([AtNames[j],dist[j] ])403 Neigh.append([AtNames[j],dist[j],True]) 404 404 Ids.append(Atoms[j][cia+8]) 405 405 return Neigh,[OId,Ids] 406 406 407 407 def AddHydrogens(AtLookUp,General,Atoms,AddHydId): 408 409 def getTransMat(RXYZ,OXYZ,TXYZ,Amat): 410 Vec = np.inner(Amat,np.array([OXYZ-TXYZ[0],RXYZ-TXYZ[0]])).T 411 Vec /= np.sqrt(np.sum(Vec**2,axis=1))[:,np.newaxis] 412 Mat2 = np.cross(Vec[0],Vec[1]) #UxV 413 Mat2 /= np.sqrt(np.sum(Mat2**2)) 414 Mat3 = np.cross(Mat2,Vec[0]) #(UxV)xU 415 return nl.inv(np.array([Vec[0],Mat2,Mat3])) 408 416 409 417 cx,ct,cs,cia = General['AtomPtrs'] … … 439 447 Ratom = GetAtomsById(Atoms,AtLookUp,[AddHydId[2],])[0] 440 448 RXYZ = np.array(Ratom[cx:cx+3]) 441 Vec = np.inner(Amat,np.array([OXYZ-TXYZ[0],RXYZ-TXYZ[0]])).T 442 Vec /= np.sqrt(np.sum(Vec**2,axis=1))[:,np.newaxis] 443 Mat2 = np.cross(Vec[0],Vec[1]) #UxV 444 Mat2 /= np.sqrt(np.sum(Mat2**2)) 445 Mat3 = np.cross(Mat2,Vec[0]) #(UxV)xU 446 iMat = nl.inv(np.array([Vec[0],Mat2,Mat3])) 449 iMat = getTransMat(RXYZ,OXYZ,TXYZ,Amat) 447 450 a = 0.96*cosd(70.5) 448 451 b = 0.96*sind(70.5) … … 460 463 Ratom = GetAtomsById(Atoms,AtLookUp,[AddHydId[2],])[0] 461 464 RXYZ = np.array(Ratom[cx:cx+3]) 462 Vec = np.inner(Amat,np.array([OXYZ-TXYZ[0],RXYZ-TXYZ[0]])).T 463 Vec /= np.sqrt(np.sum(Vec**2,axis=1))[:,np.newaxis] 464 Mat2 = np.cross(Vec[0],Vec[1]) #UxV 465 Mat2 /= np.sqrt(np.sum(Mat2**2)) 466 Mat3 = np.cross(Mat2,Vec[0]) #(UxV)xU 467 iMat = nl.inv(np.array([Vec[0],Mat2,Mat3])) 468 print 'add 2 H' 469 return [] 465 iMat = getTransMat(RXYZ,OXYZ,TXYZ,Amat) 466 a = 0.93*cosd(60.) 467 b = 0.93*sind(60.) 468 Hpos = [[a,b,0],[a,-b,0]] 469 Hpos = np.inner(Bmat,np.inner(iMat,Hpos).T).T+OXYZ 470 return Hpos 470 471 else: #2 bonds 471 472 if 'C' in Oatom[ct]: … … 479 480 Ratom = GetAtomsById(Atoms,AtLookUp,[AddHydId[2],])[0] 480 481 RXYZ = np.array(Ratom[cx:cx+3]) 481 Vec = np.inner(Amat,np.array([OXYZ-TXYZ[0],RXYZ-TXYZ[0]])).T 482 Vec /= np.sqrt(np.sum(Vec**2,axis=1))[:,np.newaxis] 483 Mat2 = np.cross(Vec[0],Vec[1]) #UxV 484 Mat2 /= np.sqrt(np.sum(Mat2**2)) 485 Mat3 = np.cross(Mat2,Vec[0]) #(UxV)xU 486 iMat = nl.inv(np.array([Vec[0],Mat2,Mat3])) 482 iMat = getTransMat(RXYZ,OXYZ,TXYZ,Amat) 487 483 a = 0.82*cosd(70.5) 488 484 b = 0.82*sind(70.5) -
trunk/GSASIIphsGUI.py
r1928 r1930 1571 1571 if 'C' in neigh[0] or 'N' in neigh[0]: 1572 1572 nH = 4-len(neigh[1][0]) 1573 bonds = dict(neigh[1][0])1573 bonds = {item[0]:item[1:] for item in neigh[1][0]} 1574 1574 nextName = '' 1575 1575 if len(bonds) == 1: … … 1577 1577 for bond in bonds: 1578 1578 if 'C' in neigh[0]: 1579 if 'C' in bond and bonds[bond] < 1.42:1579 if 'C' in bond and bonds[bond][0] < 1.42: 1580 1580 nH -= 1 1581 1581 break 1582 elif 'O' in bond and bonds[bond] < 1.3:1582 elif 'O' in bond and bonds[bond][0] < 1.3: 1583 1583 nH -= 1 1584 1584 break 1585 elif 'O' in neigh[0] and 'C' in bonds and bonds[bond] < 1.3:1585 elif 'O' in neigh[0] and 'C' in bonds and bonds[bond][0] < 1.3: 1586 1586 nH -= 1 1587 1587 break … … 1595 1595 Neigh.append(neigh) 1596 1596 if Neigh: 1597 HydIds = {} 1597 1598 mapError = False 1598 1599 dlg = G2gd.AddHatomDialog(G2frame,Neigh,data) … … 1607 1608 continue 1608 1609 Hxyz = G2mth.AddHydrogens(AtLookUp,generalData,atomData,AddHydIds[ineigh]) 1609 for X in Hxyz:1610 for iX,X in enumerate(Hxyz): 1610 1611 Nat += 1 1611 1612 AtomAdd(X[0],X[1],X[2],'H','H(%d)'%(Nat)) 1613 Id = data['Atoms'][-1][cia+8] 1614 HydIds[Id] = [iX,AddHydIds[ineigh]] 1612 1615 if mapError: 1613 1616 G2frame.ErrorDialog('Add H atom error','Adding O-H atoms requires delt-F map') 1614 1617 SetupGeneral() 1618 data['General']['HydIds'] = HydIds 1619 G2frame.dataFrame.AtomEdit.Enable(G2gd.wxID_UPDATEHATOM,True) 1615 1620 FillAtomsGrid(Atoms) 1616 1621 dlg.Destroy() … … 1618 1623 else: 1619 1624 wx.MessageBox('No candidates found',caption='Add H atom Error',style=wx.ICON_EXCLAMATION) 1625 1626 def OnHydAtomUpdate(event): 1627 Error = '' 1628 generalData = data['General'] 1629 cx,ct,cs,cia = generalData['AtomPtrs'] 1630 atomData = data['Atoms'] 1631 AtLookUp = G2mth.FillAtomLookUp(atomData,cia+8) 1632 HydIds = data['General']['HydIds'] 1633 for HId in HydIds: 1634 hydIds = HydIds[HId] 1635 num = hydIds[0] 1636 Hxyz = G2mth.AddHydrogens(AtLookUp,generalData,atomData,hydIds[1]) 1637 try: 1638 data['Atoms'][AtLookUp[HId]][cx:cx+3] = Hxyz[num] 1639 except KeyError: 1640 Error += 'Hydrogen atom not in atom list - ignored\n' 1641 continue 1642 FillAtomsGrid(Atoms) 1643 G2plt.PlotStructure(G2frame,data) 1644 if Error: 1645 wx.MessageBox(Error,caption=' H atom update Error',style=wx.ICON_EXCLAMATION) 1620 1646 1621 1647 def OnAtomMove(event): … … 6262 6288 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomViewInsert, id=G2gd.wxID_ATOMVIEWINSERT) 6263 6289 G2frame.dataFrame.Bind(wx.EVT_MENU, OnHydAtomAdd, id=G2gd.wxID_ADDHATOM) 6290 G2frame.dataFrame.Bind(wx.EVT_MENU, OnHydAtomUpdate, id=G2gd.wxID_UPDATEHATOM) 6264 6291 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomMove, id=G2gd.wxID_ATOMMOVE) 6265 6292 G2frame.dataFrame.Bind(wx.EVT_MENU, AtomDelete, id=G2gd.wxID_ATOMSEDITDELETE) … … 6272 6299 G2frame.dataFrame.Bind(wx.EVT_MENU, OnDistAnglePrt, id=G2gd.wxID_ATOMSPDISAGL) 6273 6300 G2frame.dataFrame.Bind(wx.EVT_MENU, OnIsoDistortCalc, id=G2gd.wxID_ISODISP) 6301 if 'HydIds' in data['General']: 6302 G2frame.dataFrame.AtomEdit.Enable(G2gd.wxID_UPDATEHATOM,True) 6303 else: 6304 G2frame.dataFrame.AtomEdit.Enable(G2gd.wxID_UPDATEHATOM,False) 6274 6305 for id in G2frame.dataFrame.ReImportMenuId: #loop over submenu items 6275 6306 G2frame.dataFrame.Bind(wx.EVT_MENU, OnReImport, id=id)
Note: See TracChangeset
for help on using the changeset viewer.