Changeset 1930


Ignore:
Timestamp:
Jul 16, 2015 1:37:20 PM (8 years ago)
Author:
vondreele
Message:

allow exclude atoms from H-atom position calcs.
hydrogen add complete(?) - needs testing
new hydrogen update implemented

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r1926 r1930  
    6767    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSVIEWADD, wxID_ATOMVIEWINSERT,
    6868    wxID_RELOADDRAWATOMS,wxID_ATOMSDISAGL,wxID_ATOMMOVE,wxID_MAKEMOLECULE,
    69     wxID_ASSIGNATMS2RB,wxID_ATOMSPDISAGL, wxID_ISODISP,wxID_ADDHATOM,
    70 ] = [wx.NewId() for item in range(16)]
     69    wxID_ASSIGNATMS2RB,wxID_ATOMSPDISAGL, wxID_ISODISP,wxID_ADDHATOM,wxID_UPDATEHATOM,
     70] = [wx.NewId() for item in range(17)]
    7171
    7272[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR,
     
    317317        self.EndModal(wx.ID_CANCEL)
    318318       
     319################################################################################
    319320class AddHatomDialog(wx.Dialog):
    320321    '''H atom addition dialog. After :meth:`ShowModal` returns, the results
     
    346347            self.Neigh[item][2] = i
    347348           
     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           
    348354        self.panel.Destroy()
    349355        self.panel = wxscroll.ScrolledPanel(self,style = wx.DEFAULT_DIALOG_STYLE)
     
    352358            0,wx.LEFT|wx.TOP,10)
    353359        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)
    355361        nHatms = ['0','1','2','3']
    356362        dataSizer = wx.FlexGridSizer(0,3,0,0)
     
    374380            dataSizer.Add(checks,0,WACV)
    375381            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)               
    378388            dataSizer.Add(lineSizer,0,WACV|wx.RIGHT,10)
    379389        mainSizer.Add(dataSizer,0,wx.LEFT,5)
     
    399409    def GetData(self):
    400410        '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]
    401416        return self.Neigh       #has #Hs to add for each entry
    402417       
     
    412427        self.EndModal(wx.ID_CANCEL)
    413428
     429################################################################################
    414430class DisAglDialog(wx.Dialog):
    415431    '''Distance/Angle Controls input dialog. After
     
    12311247        self.AtomEdit.Append(id=wxID_ADDHATOM, kind=wx.ITEM_NORMAL,text='Insert H atoms',
    12321248            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')
    12331251        self.AtomEdit.Append(id=wxID_ATOMMOVE, kind=wx.ITEM_NORMAL,text='Move atom to view point',
    12341252            help='Select single atom to move')
  • trunk/GSASIImath.py

    r1929 r1930  
    401401        if j != Orig:
    402402            if AtNames[j] != notName:
    403                 Neigh.append([AtNames[j],dist[j]])
     403                Neigh.append([AtNames[j],dist[j],True])
    404404                Ids.append(Atoms[j][cia+8])
    405405    return Neigh,[OId,Ids]
    406406   
    407407def 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]))       
    408416   
    409417    cx,ct,cs,cia = General['AtomPtrs']
     
    439447            Ratom = GetAtomsById(Atoms,AtLookUp,[AddHydId[2],])[0]
    440448            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)
    447450            a = 0.96*cosd(70.5)
    448451            b = 0.96*sind(70.5)
     
    460463            Ratom = GetAtomsById(Atoms,AtLookUp,[AddHydId[2],])[0]
    461464            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
    470471    else:   #2 bonds
    471472        if 'C' in Oatom[ct]:
     
    479480            Ratom = GetAtomsById(Atoms,AtLookUp,[AddHydId[2],])[0]
    480481            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)
    487483            a = 0.82*cosd(70.5)
    488484            b = 0.82*sind(70.5)
  • trunk/GSASIIphsGUI.py

    r1928 r1930  
    15711571                if 'C' in neigh[0] or 'N' in neigh[0]:
    15721572                    nH = 4-len(neigh[1][0])
    1573                 bonds = dict(neigh[1][0])
     1573                bonds = {item[0]:item[1:] for item in neigh[1][0]}
    15741574                nextName = ''
    15751575                if len(bonds) == 1:
     
    15771577                for bond in bonds:
    15781578                    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:
    15801580                            nH -= 1
    15811581                            break
    1582                         elif 'O' in bond and bonds[bond] < 1.3:
     1582                        elif 'O' in bond and bonds[bond][0] < 1.3:
    15831583                            nH -= 1
    15841584                            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:
    15861586                        nH -= 1
    15871587                        break
     
    15951595                    Neigh.append(neigh)
    15961596            if Neigh:
     1597                HydIds = {}
    15971598                mapError = False
    15981599                dlg = G2gd.AddHatomDialog(G2frame,Neigh,data)
     
    16071608                            continue                           
    16081609                        Hxyz = G2mth.AddHydrogens(AtLookUp,generalData,atomData,AddHydIds[ineigh])
    1609                         for X in Hxyz:
     1610                        for iX,X in enumerate(Hxyz):
    16101611                            Nat += 1
    16111612                            AtomAdd(X[0],X[1],X[2],'H','H(%d)'%(Nat))
     1613                            Id = data['Atoms'][-1][cia+8]
     1614                            HydIds[Id] = [iX,AddHydIds[ineigh]]
    16121615                if mapError:
    16131616                    G2frame.ErrorDialog('Add H atom error','Adding O-H atoms requires delt-F map')
    16141617                SetupGeneral()
     1618                data['General']['HydIds'] = HydIds
     1619                G2frame.dataFrame.AtomEdit.Enable(G2gd.wxID_UPDATEHATOM,True)
    16151620                FillAtomsGrid(Atoms)
    16161621                dlg.Destroy()
     
    16181623            else:
    16191624                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)
    16201646       
    16211647    def OnAtomMove(event):
     
    62626288        G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomViewInsert, id=G2gd.wxID_ATOMVIEWINSERT)
    62636289        G2frame.dataFrame.Bind(wx.EVT_MENU, OnHydAtomAdd, id=G2gd.wxID_ADDHATOM)
     6290        G2frame.dataFrame.Bind(wx.EVT_MENU, OnHydAtomUpdate, id=G2gd.wxID_UPDATEHATOM)
    62646291        G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomMove, id=G2gd.wxID_ATOMMOVE)
    62656292        G2frame.dataFrame.Bind(wx.EVT_MENU, AtomDelete, id=G2gd.wxID_ATOMSEDITDELETE)
     
    62726299        G2frame.dataFrame.Bind(wx.EVT_MENU, OnDistAnglePrt, id=G2gd.wxID_ATOMSPDISAGL)
    62736300        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)
    62746305        for id in G2frame.dataFrame.ReImportMenuId:     #loop over submenu items
    62756306            G2frame.dataFrame.Bind(wx.EVT_MENU, OnReImport, id=id)
Note: See TracChangeset for help on using the changeset viewer.