Changeset 849


Ignore:
Timestamp:
Feb 8, 2013 1:58:51 PM (9 years ago)
Author:
vondreele
Message:

more work on rigid bodies - now put into crystal structures,
atom edit restrictions for atoms in rigid bodies

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r848 r849  
    720720            AtInfo['C'] = [Info['Drad'],Info['Color']]
    721721            data['Vector'][rbId] = {'RBname':'UNKRB','VectMag':vecMag,
    722                 'VectRef':vecRef,'rbTypes':rbTypes,'rbVect':vecVal}
     722                'VectRef':vecRef,'rbTypes':rbTypes,'rbVect':vecVal,'useCount':0}
    723723        dlg.Destroy()
    724724        UpdateVectorRB()
     
    763763                        rbSeq.append([iBeg,iFin,angle,iMove])
    764764                data['Residue'][rbId] = {'RBname':rbName,'rbXYZ':rbXYZ,'rbTypes':rbTypes,
    765                     'atNames':atNames,'rbRef':[nOrig-1,mRef-1,nRef-1],'rbSeq':rbSeq,'SelSeq':[0,0]}
     765                    'atNames':atNames,'rbRef':[nOrig-1,mRef-1,nRef-1],'rbSeq':rbSeq,
     766                    'SelSeq':[0,0],'useCount':0}
    766767                print 'Rigid body '+rbName+' added'
    767768            macStr = macro.readline()
     
    794795        rbXYZ = np.array(rbXYZ)-np.array(rbXYZ[0])
    795796        data['Residue'][rbId] = {'RBname':'UNKRB','rbXYZ':rbXYZ,'rbTypes':rbTypes,
    796             'atNames':atNames,'rbRef':[0,1,2],'rbSeq':[],'SelSeq':[0,0]}
     797            'atNames':atNames,'rbRef':[0,1,2],'rbSeq':[],'SelSeq':[0,0],'useCount':0}
    797798        print 'Rigid body UNKRB added'
    798799        text.close()
     
    920921            nameSizer.Add(plotRB,0,wx.ALIGN_CENTER_VERTICAL)
    921922            nameSizer.Add((5,0),)
    922             delRB = wx.CheckBox(VectorRBDisplay,-1,'Delete?')
    923             Indx[delRB.GetId()] = rbId
    924             delRB.Bind(wx.EVT_CHECKBOX,OnDelRB)
    925             nameSizer.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
     923            if not rbData['useCount']:
     924                delRB = wx.CheckBox(VectorRBDisplay,-1,'Delete?')
     925                Indx[delRB.GetId()] = rbId
     926                delRB.Bind(wx.EVT_CHECKBOX,OnDelRB)
     927                nameSizer.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
    926928            return nameSizer
    927929           
     
    10791081            nameSizer.Add(plotRB,0,wx.ALIGN_CENTER_VERTICAL)
    10801082            nameSizer.Add((5,0),)
    1081             delRB = wx.CheckBox(ResidueRBDisplay,-1,'Delete?')
    1082             Indx[delRB.GetId()] = rbId
    1083             delRB.Bind(wx.EVT_CHECKBOX,OnDelRB)
    1084             nameSizer.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
     1083            if not rbData['useCount']:
     1084                delRB = wx.CheckBox(ResidueRBDisplay,-1,'Delete?')
     1085                Indx[delRB.GetId()] = rbId
     1086                delRB.Bind(wx.EVT_CHECKBOX,OnDelRB)
     1087                nameSizer.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
    10851088            return nameSizer
    10861089           
  • trunk/GSASIIgrid.py

    r848 r849  
    106106
    107107[ wxID_RIGIDBODYADD,wxID_DRAWDEFINERB,wxID_RIGIDBODYIMPORT,wxID_RESIDUETORSSEQ,
    108     wxID_ZMATRIXADD,wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE
    109 ] = [wx.NewId() for item in range(7)]
     108    wxID_ZMATRIXADD,wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE,wxID_RBREMOVEALL
     109] = [wx.NewId() for item in range(8)]
    110110
    111111[ wxID_SAVESEQSEL,
     
    11941194        self.RigidBodiesEdit.Append(id=wxID_GLOBALRESREFINE, kind=wx.ITEM_NORMAL,text='Global residue refine',
    11951195            help='Global setting of residue RB refinement flags')
    1196 
     1196        self.RigidBodiesEdit.Append(id=wxID_RBREMOVEALL, kind=wx.ITEM_NORMAL,text='Remove all rigid bodies',
     1197            help='Remove all rigid body assignment for atoms')
    11971198        self.PostfillDataMenu()
    11981199           
  • trunk/GSASIIimage.py

    r762 r849  
    293293        return elcent,phi,radii
    294294    else:
     295        print 'bad ellipse - radii:',radii
    295296        return False
    296297       
     
    463464    outE = FitRing(ring,True)
    464465    if outE:
    465 #        print 'start ellipse:',outE
     466        print 'start ellipse:',outE
    466467        ellipse = outE
    467468    else:
     
    477478        print '1st ring not sufficiently complete to proceed'
    478479        return False
    479 #    print 'inner ring:',ellipse
     480    print 'inner ring:',ellipse     #cent,phi,radii
    480481    data['center'] = copy.copy(ellipse[0])           #not right!! (but useful for now)
    481482    data['ellipses'].append(ellipse[:]+('r',))
  • trunk/GSASIImath.py

    r848 r849  
    198198    return XYZ
    199199
     200def UpdateResRBAtoms(Amat,Bmat,cx,Atoms,AtLookUp,RBObj,RBData):
     201    RBIds = GetResRBIds(RBData)
     202    ObjIds = RBObj['Ids']
     203    RBRes = RBData[RBIds[RBObj['ResName']]]
     204    XYZ = np.array(RBRes['rbXYZ'])
     205    for tor,seq in zip(RBObj['Torsions'],RBRes['rbSeq']):
     206        QuatA = AVdeg2Q(tor[0],XYZ[seq[0]]-XYZ[seq[1]])
     207        for ride in seq[3]:
     208            XYZ[ride] = prodQVQ(QuatA,XYZ[ride]-XYZ[seq[1]])+XYZ[seq[1]]
     209    for i,xyz in enumerate(XYZ):
     210        xyz = prodQVQ(RBObj['Orient'][0],xyz)
     211        xyz = np.inner(Bmat,xyz)
     212        xyz += RBObj['Orig'][0]
     213        Atoms[AtLookUp[ObjIds[i]]][cx:cx+3] = xyz
     214   
     215def GetResRBIds(RBData):   
     216    rbKeys = RBData.keys()
     217    rbKeys.remove('AtInfo')
     218    if not len(rbKeys):
     219        return {}
     220    RBNames = [RBData[k]['RBname'] for k in rbKeys]
     221    return dict(zip(RBNames,rbKeys))
     222   
    200223def GetSHCoeff(pId,parmDict,SHkeys):
    201224    SHCoeff = {}
     
    12031226    except KeyError:
    12041227        return Parms['Lam1'][1]
    1205 
    1206 def UpdateResRBAtoms(Amat,Bmat,Atoms,AtLookUp,RBObj,RBData):
    1207     RBIds = GetResRBIds(RBData)
    1208     RBRes = RBData[RBIds[RBObj['ResName']]]
    1209     XYZ = np.array(RBRes['rbXYZ'])
    1210     for tor,seq in zip(RBObj['Torsions'],RBRes['rbSeq']):
    1211         QuatA = AVdeg2Q(tor[0],XYZ[seq[0]]-XYZ[seq[1]])
    1212         for ride in seq[3]:
    1213             VB = prodQVQ(QuatA,XYZ[ride]-XYZ[seq[1]])
    1214             XYZ[ride] += VB
    1215     for i,xyz in enumerate(XYZ):
    1216         xyz = prodQVQ(RBObj['Orient'][0],xyz)
    1217         xyz = np.inner(Bmat,xyz)
    1218         xyz += RBObj['Orig'][0]
    1219         XYZ[i] = xyz
    1220     Atxyz = GetAtomsById(Atoms,AtLookUp,RBObj['Ids'])
    1221    
    1222 def GetResRBIds(RBData):   
    1223     rbKeys = RBData.keys()
    1224     rbKeys.remove('AtInfo')
    1225     if not len(rbKeys):
    1226         return {}
    1227     RBNames = [RBData[k]['RBname'] for k in rbKeys]
    1228     return dict(zip(RBNames,rbKeys))
    1229    
    12301228   
    12311229def prodQQ(QA,QB):
     
    13041302    p = A/2.
    13051303    Q[0] = np.cos(p)
    1306     s = np.sin(p)
    1307     Q[1:4] = V*s
     1304    Q[1:4] = V*np.sin(p)
    13081305    return Q
    13091306   
     
    13201317    p = A/2.
    13211318    Q[0] = cosd(p)
    1322     S = sind(p)
    1323     Q[1:4] = V*S
     1319    Q[1:4] = V*sind(p)
    13241320    return Q
    13251321
     
    13281324        A,B,C are np.array Cartesian 3-vectors
    13291325    Returns quaternion & rotation angle in radians
     1326        q=r+ai+bj+ck
    13301327    '''
    13311328
  • trunk/GSASIIphsGUI.py

    r848 r849  
    5353        data['RBModels'] = {}
    5454#end patch   
    55    
    56 #    Atoms = []         #not needed??
     55
     56    global rbAtmDict   
     57    rbAtmDict = {}
    5758    if G2frame.dataDisplay:
    5859        G2frame.dataDisplay.Destroy()
     
    748749        atomData = data['Atoms']
    749750        DData = data['Drawing']
     751        resRBData = data['RBModels'].get('Residue',[])
     752        vecRBData = data['RBModels'].get('Vector',[])
     753        rbAtmDict = {}
     754        for rbObj in resRBData:
     755            exclList = ['X' for i in range(len(rbObj['Ids']))]
     756            rbAtmDict.update(dict(zip(rbObj['Ids'],exclList)))
     757        # for vector one exclList will be 'x' or 'xu' if TLS used in RB
    750758        Items = [G2gd.wxID_ATOMSEDITINSERT,G2gd.wxID_ATOMSEDITDELETE,G2gd.wxID_ATOMSREFINE,
    751759            G2gd.wxID_ATOMSMODIFY,G2gd.wxID_ATOMSTRANSFORM,G2gd.wxID_ATOMVIEWINSERT,G2gd.wxID_ATOMMOVE]
     
    901909                                    atomData[r][ci] = 0.0
    902910                                    Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True)
    903                         atomData[r][c] = parms
     911                        if not Atoms.IsReadOnly(r,c):
     912                            if Atoms.GetColLabelValue(c) == 'refine':
     913                                atomData[r][c] = parms.replace(rbAtmDict.get(atomData[r][-1],''),'')
     914                            else:
     915                                atomData[r][c] = parms
    904916                        if 'Atoms' in data['Drawing']:
    905917                            DrawAtomsReplaceByID(data['Drawing'],atomData[r],ID)
     
    966978                        if iUij == CSI[0][i]:
    967979                            atomData[r][i+colLabels.index('U11')] = value*CSI[1][i]
     980                elif Atoms.GetColLabelValue(c) == 'refine':
     981                    atomData[r][c] = atomData[r][c].replace(rbAtmDict.get(atomData[r][-1],''),'')
    968982                if 'Atoms' in data['Drawing']:
    969983                    DrawAtomsReplaceByID(data['Drawing'],atomData[r],ID)
     
    10171031                        Atoms.SelectRow(row,True)
    10181032                elif event.AltDown():
    1019                     if Atoms.frm < 0:           #pick atom to be moved
    1020                         Atoms.frm = r
    1021                         Atoms.SelectRow(r,True)
    1022                         n = colLabels.index('Name')
    1023                         G2frame.dataFrame.SetStatusText('Atom '+atomData[r][n]+' is to be moved')
    1024                     else:                       #move it
    1025                         item = atomData.pop(Atoms.frm)
    1026                         atomData.insert(r,item)
     1033                    if atomData[r][-1] in rbAtmDict:
     1034                        G2frame.dataFrame.SetStatusText('**** ERROR - atom is in a rigid body and can not be moved ****')
    10271035                        Atoms.frm = -1
    1028                         G2frame.dataFrame.SetStatusText('')
    1029                         wx.CallAfter(Paint)
     1036                        Atoms.ClearSelection()
     1037                    else:   
     1038                        if Atoms.frm < 0:           #pick atom to be moved
     1039                            Atoms.frm = r
     1040                            Atoms.SelectRow(r,True)
     1041                            n = colLabels.index('Name')
     1042                            G2frame.dataFrame.SetStatusText('Atom '+atomData[r][n]+' is to be moved')
     1043                        else:                       #move it
     1044                            item = atomData.pop(Atoms.frm)
     1045                            atomData.insert(r,item)
     1046                            Atoms.frm = -1
     1047                            G2frame.dataFrame.SetStatusText('')
     1048                            wx.CallAfter(Paint)
    10301049                else:
    10311050                    Atoms.ClearSelection()
     
    10581077            Atoms.frm = -1           
    10591078            colType = colLabels.index('Type')
     1079            colR = colLabels.index('refine')
    10601080            colSS = colLabels.index('site sym')
    10611081            colX = colLabels.index('x')
     
    10711091                Atoms.SetColSize(i,50)           
    10721092            for row in range(Atoms.GetNumberRows()):
     1093                atId = atomData[row][-1]
     1094                if 'X' in rbAtmDict.get(atId,''):
     1095                    for c in range(0,colX+3):
     1096                        if c != colR:
     1097                            Atoms.SetCellStyle(row,c,VERY_LIGHT_GREY,True)                       
    10731098                Atoms.SetReadOnly(row,colType,True)
    10741099                Atoms.SetReadOnly(row,colSS,True)                         #site sym
     
    11671192        if len(indx) != 1:
    11681193            print '**** ERROR - only one atom can be moved ****'
     1194        elif atomData[indx[0]][-1] in rbAtmDict:
     1195            print '**** ERROR - Atoms in rigid bodies can not be moved ****'
    11691196        else:
    11701197            atomData[indx[0]][cx:cx+3] = [x,y,z]
     
    12501277            for ind in indx:
    12511278                atom = atomData[ind]
    1252                 IDs.append(atom[-1])
    1253                 del atomData[ind]
     1279                if atom[-1] in rbAtmDict:
     1280                    G2frame.dataFrame.SetStatusText('**** ERROR - atom is in a rigid body and can not be deleted ****')
     1281                else:
     1282                    IDs.append(atom[-1])
     1283                    del atomData[ind]
    12541284            if 'Atoms' in data['Drawing']:
    12551285                DrawAtomsDeleteByIDs(IDs)
     
    12781308                    parms += choice[x][0]
    12791309                for r in indx:
    1280                     atomData[r][c] = parms
     1310                    if not Atoms.IsReadOnly(r,c):
     1311                        atomData[r][c] = parms
    12811312                Atoms.ForceRefresh()
    12821313            dlg.Destroy()
     
    13021333                        El = dlg.Elem.strip()
    13031334                        for r in indx:                       
    1304                             atomData[r][cid] = El
    1305                             if len(El) in [2,4]:
    1306                                 atomData[r][cid-1] = El[:2]+'(%d)'%(r+1)
    1307                             else:
    1308                                 atomData[r][cid-1] = El[:1]+'(%d)'%(r+1)
     1335                            if not Atoms.IsReadOnly(r,cid):
     1336                                atomData[r][cid] = El
     1337                                if len(El) in [2,4]:
     1338                                    atomData[r][cid-1] = El[:2]+'(%d)'%(r+1)
     1339                                else:
     1340                                    atomData[r][cid-1] = El[:1]+'(%d)'%(r+1)
    13091341                        SetupGeneral()
    13101342                        if 'Atoms' in data['Drawing']:
     
    13211353                    if result == wx.ID_YES:
    13221354                        for r in indx:
    1323                             El = atomData[r][cid+1]
    1324                             if len(El) in [2,4]:
    1325                                 atomData[r][cid] = El[:2]+'(%d)'%(r+1)
    1326                             else:
    1327                                 atomData[r][cid] = El[:1]+'(%d)'%(r+1)
     1355                            if not Atoms.IsReadOnly(r,cid+1):
     1356                                El = atomData[r][cid+1]
     1357                                if len(El) in [2,4]:
     1358                                    atomData[r][cid] = El[:2]+'(%d)'%(r+1)
     1359                                else:
     1360                                    atomData[r][cid] = El[:1]+'(%d)'%(r+1)
    13281361                    FillAtomsGrid(Atoms)
    13291362                finally:
     
    13371370                    parm = choices[sel][0]
    13381371                    for r in indx:                       
    1339                         atomData[r][cid] = parm
     1372                        if not Atoms.IsReadOnly(r,cid):
     1373                            atomData[r][cid] = parm
    13401374                    FillAtomsGrid(Atoms)
    13411375                dlg.Destroy()
     
    13501384                    parm = dlg.GetValue()
    13511385                    for r in indx:                       
    1352                         atomData[r][cid] = parm
     1386                        if not Atoms.IsReadOnly(r,cid):
     1387                            atomData[r][cid] = parm
    13531388                    SetupGeneral()
    13541389                    FillAtomsGrid(Atoms)
     
    13611396                    parm = dlg.GetValue()
    13621397                    for r in indx:                       
    1363                         atomData[r][cid] += parm
     1398                        if not Atoms.IsReadOnly(r,cid):
     1399                            atomData[r][cid] += parm
    13641400                    SetupGeneral()
    13651401                    FillAtomsGrid(Atoms)
     
    15681604            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Restraints'),restData)
    15691605
    1570     def OnDefineRB(event):
     1606    def OnDefineRB(event):      #suppose this made a residue type RB instead?
    15711607        indx = drawAtoms.GetSelectedRows()
    15721608        RBData = G2frame.PatternTree.GetItemPyData(   
     
    29733009################################################################################
    29743010
    2975     def FillRigidBodyGrid():
     3011    def FillRigidBodyGrid(refresh=False):
     3012        if refresh:
     3013            RigidBodies.DestroyChildren()
    29763014        AtLookUp = G2mth.FillAtomLookUp(data['Atoms'])
    29773015        general = data['General']
     3016        cx = general['AtomPtrs'][0]
    29783017        Amat,Bmat = G2lat.cell2AB(general['Cell'][1:7])
     3018        RBData = G2frame.PatternTree.GetItemPyData(   
     3019            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))['Residue']
    29793020        Indx = {}
    29803021       
     
    29983039                    val = float(Obj.GetValue())
    29993040                    RBObj['Torsions'][item][0] = val
    3000                     RBData = G2frame.PatternTree.GetItemPyData(   
    3001                         G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))['Residue']
    3002                     G2mth.UpdateResRBAtoms(Amat,Bmat,data['Atoms'],AtLookUp,RBObj,RBData)
     3041                    G2mth.UpdateResRBAtoms(Amat,Bmat,cx,data['Atoms'],AtLookUp,RBObj,RBData)
    30033042                except ValueError:
    30043043                    pass
    30053044                Obj.SetValue("%10.3f"%(RBObj['Torsions'][item][0]))               
     3045                data['Drawing']['Atoms'] = []
     3046                UpdateDrawAtoms()
     3047                drawAtoms.ClearSelection()
     3048                G2plt.PlotStructure(G2frame,data)
     3049               
     3050            def OnDelRB(event):
     3051                RBId = RBObj['RBId']
     3052                RBData[RBId]['useCount'] -= 1               
     3053                del RBObj
     3054                wx.CallAfter(FillRigidBodyGrid,True)
    30063055             
    30073056            resrbSizer = wx.BoxSizer(wx.VERTICAL)
    30083057            resrbSizer.Add(wx.StaticText(RigidBodies,-1,120*'-'))
    3009             resrbSizer.Add(wx.StaticText(RigidBodies,-1,
    3010                 'Name: '+RBObj['ResName']+RBObj['numChain']),0,wx.ALIGN_CENTER_VERTICAL)
     3058            topLine = wx.BoxSizer(wx.HORIZONTAL)
     3059            topLine.Add(wx.StaticText(RigidBodies,-1,
     3060                'Name: '+RBObj['ResName']+RBObj['numChain']+'   '),0,wx.ALIGN_CENTER_VERTICAL)
     3061            delRB = wx.CheckBox(RigidBodies,-1,'Delete?')
     3062            delRB.Bind(wx.EVT_CHECKBOX,OnDelRB)
     3063            topLine.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
     3064            resrbSizer.Add(topLine)
    30113065            topSizer = wx.FlexGridSizer(2,2,5,5)
    30123066            Orig = RBObj['Orig'][0]
     
    30903144                res = atom[1].strip()
    30913145                numChain = ' %s %s'%(atom[0],atom[2])
    3092                 if res not in RBIds:
     3146                if res not in RBIds or atom[ct-1] == 'OXT':
    30933147                    iatm += 1
    3094                     continue        #for water molecules, etc.
     3148                    continue        #skip for OXT, water molecules, etc.
    30953149                rbRes = RBData[RBIds[res]]
    30963150                rbRef = rbRes['rbRef']
     
    31053159                    iatm += 1    #puts this at beginning of next residue?
    31063160                Orig = rbAtoms[rbRef[0]]
     3161                rbObj['RBId'] = RBIds[res]
    31073162                rbObj['Ids'] = rbIds
    31083163                rbObj['Orig'] = [Orig,False]
    3109     #            print ' residue '+rbRes['RBname']+str(atom[0]).strip()+ \
    3110     #                ' origin at: ','%.5f %.5f %.5f'%(Orig[0],Orig[1],Orig[2])
     3164#                print ' residue '+rbRes['RBname']+str(atom[0]).strip()+ \
     3165#                    ' origin at: ','%.5f %.5f %.5f'%(Orig[0],Orig[1],Orig[2])
    31113166                VAC = np.inner(Amat,rbAtoms[rbRef[1]]-Orig)
    31123167                VBC = np.inner(Amat,rbAtoms[rbRef[2]]-Orig)
     
    31333188                    for ride in Riders:
    31343189                        SXYZ[ride] = G2mth.prodQVQ(QuatA,SXYZ[ride]-SXYZ[Patm])+SXYZ[Patm]
     3190                RBData[RBIds[res]]['useCount'] += 1
    31353191                RBObjs.append(rbObj)
    31363192            data['RBModels']['Residue'] = RBObjs
    31373193            for RBObj in RBObjs:
    3138                 G2mth.UpdateResRBAtoms(Amat,Bmat,Atoms,AtLookUp,RBObj,RBData)
     3194                G2mth.UpdateResRBAtoms(Amat,Bmat,cx,Atoms,AtLookUp,RBObj,RBData)
    31393195        finally:
    31403196            wx.EndBusyCursor()
    3141         FillRigidBodyGrid()
     3197        wx.CallAfter(FillRigidBodyGrid,True)
     3198       
     3199    def OnRBRemoveAll(event):
     3200        print 'remove all RBs'
     3201       
    31423202       
    31433203    def OnGlobalResRBRef(event):
     
    37023762            G2frame.dataFrame.Bind(wx.EVT_MENU, OnAutoFindResRB, id=G2gd.wxID_AUTOFINDRESRB)
    37033763            G2frame.dataFrame.Bind(wx.EVT_MENU, OnGlobalResRBRef, id=G2gd.wxID_GLOBALRESREFINE)
     3764            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBRemoveAll, id=G2gd.wxID_RBREMOVEALL)
    37043765            FillRigidBodyGrid()
    37053766        elif text == 'Pawley reflections':
Note: See TracChangeset for help on using the changeset viewer.