Changeset 851


Ignore:
Timestamp:
Feb 15, 2013 3:04:56 PM (11 years ago)
Author:
vondreele
Message:

more rigid body stuff, plotting, RB placement, import of more types of coordinate files
Z-matrix RB deleted (it will be imported & converted)

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r850 r851  
    679679    def getTextFile():
    680680        defDir = os.path.join(os.path.split(__file__)[0],'GSASIImacros')
    681         dlg = wx.FileDialog(G2frame,message='Choose rigid body text file',
    682             defaultDir=defDir,defaultFile="",wildcard="GSAS-II text file (*.txt)|*.txt",
    683             style=wx.OPEN | wx.CHANGE_DIR)
     681        dlg = wx.FileDialog(G2frame,'Choose rigid body text file', '.', '',
     682            "GSAS-II text file (*.txt)|*.txt|XYZ file (*.xyz)|*.xyz|"
     683            "Sybyl mol2 file (*.mol2)|*.mol2|PDB file (*.pdb;*.ent)|*.pdb;*.ent",
     684            wx.OPEN | wx.CHANGE_DIR)
    684685        try:
    685686            if dlg.ShowModal() == wx.ID_OK:
    686687                txtfile = dlg.GetPath()
     688                ext = os.path.splitext(txtfile)[1]
    687689                text = open(txtfile,'Ur')
    688690            else: # cancel was pressed
     691                ext = ''
    689692                text = []
    690693        finally:
    691694            dlg.Destroy()
    692         return text
     695        if 'ent' in ext:
     696            ext = '.pdb'
     697        return text,ext.lower()
    693698       
    694699    def OnAddRigidBody(event):
     
    698703        elif 'Residue' in G2frame.dataDisplay.GetPageText(page):
    699704            AddResidueRB()
    700         elif 'Z-matrix' in G2frame.dataDisplay.GetPageText(page):
    701             AddZMatrixRB()
    702705           
    703706    def OnImportRigidBody(event):
     
    707710        elif 'Residue' in G2frame.dataDisplay.GetPageText(page):
    708711            ImportResidueRB()
    709         elif 'Z-matrix' in G2frame.dataDisplay.GetPageText(page):
    710             pass
    711712           
    712713    def OnNewOrigin(event): #only for Residue RBs
     
    768769            Info = G2elem.GetAtomInfo('C')
    769770            AtInfo['C'] = [Info['Drad'],Info['Color']]
    770             data['Vector'][rbId] = {'RBname':'UNKRB','VectMag':vecMag,
     771            data['Vector'][rbId] = {'RBname':'UNKRB','VectMag':vecMag,'rbXYZ':np.zeros((nAtoms,3)),
    771772                'VectRef':vecRef,'rbTypes':rbTypes,'rbVect':vecVal,'useCount':0}
    772773        dlg.Destroy()
     
    821822    def ImportResidueRB():
    822823        AtInfo = data['Residue']['AtInfo']
    823         text = getTextFile()
     824        text,ext = getTextFile()
    824825        if not text:
    825826            return
     
    830831        atNames = []
    831832        txtStr = text.readline()
     833        if 'xyz' in ext:
     834            txtStr = text.readline()
     835            txtStr = text.readline()
     836        elif 'mol2' in ext:
     837            while 'ATOM' not in txtStr:
     838                txtStr = text.readline()
     839            txtStr = text.readline()
     840        elif 'pdb' in ext:
     841            while 'ATOM' not in txtStr[:6] and 'HETATM' not in txtStr[:6]:
     842                txtStr = text.readline()
     843                print txtStr
    832844        items = txtStr.split()
    833845        while len(items):
    834             atName = items[0]
    835             atType = items[1]
     846            if 'txt' in ext:
     847                atName = items[0]
     848                atType = items[1]
     849                rbXYZ.append([float(items[i]) for i in [2,3,4]])
     850            elif 'xyz' in ext:
     851                atType = items[0]
     852                rbXYZ.append([float(items[i]) for i in [1,2,3]])
     853                atName = atType+str(len(rbXYZ))
     854            elif 'mol2' in ext:
     855                atType = items[1]
     856                atName = items[1]+items[0]
     857                rbXYZ.append([float(items[i]) for i in [2,3,4]])
     858            elif 'pdb' in ext:
     859                atType = items[-1]
     860                atName = items[2]
     861                xyz = txtStr[30:55].split()                   
     862                rbXYZ.append([float(x) for x in xyz])
    836863            atNames.append(atName)
    837             rbXYZ.append([float(items[i]) for i in [2,3,4]])
    838864            rbTypes.append(atType)
    839865            if atType not in AtInfo:
     
    841867                AtInfo[atType] = [Info['Drad'],Info['Color']]
    842868            txtStr = text.readline()
     869            if 'mol2' in ext and 'BOND' in txtStr:
     870                break
     871            if 'pdb' in ext and ('ATOM' not in txtStr[:6] and 'HETATM' not in txtStr[:6]):
     872                break
    843873            items = txtStr.split()
    844874        rbXYZ = np.array(rbXYZ)-np.array(rbXYZ[0])
     
    931961       
    932962
    933     def AddZMatrixRB():
    934         pass
    935 
    936963    def UpdateVectorRB():
    937964        AtInfo = data['Vector']['AtInfo']
     
    10821109                    VectorRBSizer.Add(rbVectMag(rbId,imag,rbData),0)
    10831110                    VectorRBSizer.Add(rbVectors(rbId,imag,mag,XYZ,rbData),0)
    1084                 VectorRBSizer.Add((5,5),0)       
     1111                VectorRBSizer.Add((5,5),0)
     1112                data['Vector'][rbId]['rbXYZ'] = XYZ       
    10851113        VectorRBSizer.Layout()   
    10861114        VectorRBDisplay.SetSizer(VectorRBSizer,True)
     
    13021330        G2frame.dataFrame.setSizePosLeft(Size)
    13031331       
    1304     def UpdateZMatrixRB():
    1305         ZMatrixRB.DestroyChildren()
    1306         ZMatrixRBDisplay = wx.Panel(ZMatrixRB)
    1307         ZMatrixRBSizer = wx.BoxSizer(wx.VERTICAL)
    1308         ZMatrixRBSizer.Add((5,5),0)       
    1309 #        ZMatrixRBSizer.Add(ConstSizer('Phase',PhaseDisplay))
    1310         ZMatrixRBSizer.Layout()   
    1311         ZMatrixRBDisplay.SetSizer(ZMatrixRBSizer,True)
    1312         Size = ZMatrixRBSizer.GetMinSize()
    1313         Size[0] += 40
    1314         Size[1] = max(Size[1],250) + 20
    1315         ZMatrixRBDisplay.SetSize(Size)
    1316         ZMatrixRB.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
    1317 #        Size[1] = min(Size[1],250)
    1318         G2frame.dataFrame.setSizePosLeft(Size)
    1319 
    13201332    def SetStatusLine(text):
    13211333        Status.SetStatusText(text)                                     
     
    13421354    ResidueRB = wx.ScrolledWindow(G2frame.dataDisplay)
    13431355    G2frame.dataDisplay.AddPage(ResidueRB,'Residue rigid bodies')
    1344     ZMatrixRB = wx.ScrolledWindow(G2frame.dataDisplay)
    1345     G2frame.dataDisplay.AddPage(ZMatrixRB,'Z-matrix rigid bodies')
    13461356    UpdateVectorRB()
    13471357   
  • trunk/GSASIIgrid.py

    r850 r851  
    112112
    113113[ wxID_RIGIDBODYADD,wxID_DRAWDEFINERB,wxID_RIGIDBODYIMPORT,wxID_RESIDUETORSSEQ,
    114     wxID_ZMATRIXADD,wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE,wxID_RBREMOVEALL,
     114    wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE,wxID_RBREMOVEALL,
    115115    wxID_RBNEWORIGIN,wxID_RBREFATMS
    116 ] = [wx.NewId() for item in range(10)]
     116] = [wx.NewId() for item in range(9)]
    117117
    118118[ wxID_SAVESEQSEL,
     
    131131#### GSAS-II class definitions
    132132################################################################################
    133 
    134 class GSASWizard(wz.WizardPageSimple):
    135     def __init__(self,parent,title):
    136         wz.WizardPageSimple.__init__(self,parent)
    137         self.mainSizer = wx.BoxSizer(wx.VERTICAL)
    138         self.SetSizer(self.mainSizer)
    139         titleText = wx.StaticText(self,-1,title)
    140         titleText.SetFont(wx.Font(16,wx.SWISS,wx.NORMAL,wx.BOLD))
    141         self.mainSizer.Add(titleText,0,wx.ALIGN_CENTRE|wx.ALL,5)
    142 
     133       
    143134class SymOpDialog(wx.Dialog):
    144135    def __init__(self,parent,SGData,New=True,ForceUnit=False):
     
    861852        self.ResidueRBMenu.Append(id=wxID_RESIDUETORSSEQ, kind=wx.ITEM_NORMAL,text='Define sequence',
    862853            help='Define torsion sequence')
    863         self.ZMatrixRBMenu = wx.Menu(title='')
    864         self.ZMatrixRBMenu.Append(id=wxID_ZMATRIXADD, kind=wx.ITEM_NORMAL,text='Add Z-matrix',
    865             help='Add Z-matrix')
    866854           
    867855        self.RigidBodyMenu = wx.MenuBar()
     
    11471135        self.AtomEdit.Append(id=wxID_ATOMVIEWINSERT, kind=wx.ITEM_NORMAL,text='Insert view point',
    11481136            help='Select atom row to insert before; inserted as an H atom')
    1149         self.AtomEdit.Append(id=wxID_ASSIGNATMS2RB, kind=wx.ITEM_NORMAL,text='Assign atoms to rigid body',
    1150             help='Select atom row to start assignment')
    11511137        self.AtomEdit.Append(id=wxID_ATOMMOVE, kind=wx.ITEM_NORMAL,text='Move atom to view point',
    11521138            help='Select single atom to move')
     
    12771263        self.RigidBodiesEdit.Append(id=wxID_AUTOFINDRESRB, kind=wx.ITEM_NORMAL,text='Auto find residues',
    12781264            help='Auto find of residue RBs in macromolecule')
     1265        self.RigidBodiesEdit.Append(id=wxID_ASSIGNATMS2RB, kind=wx.ITEM_NORMAL,text='Assign atoms to rigid body',
     1266            help='Select & position rigid body in structure for existing atoms')
    12791267        self.RigidBodiesEdit.Append(id=wxID_GLOBALRESREFINE, kind=wx.ITEM_NORMAL,text='Global residue refine',
    12801268            help='Global setting of residue RB refinement flags')
  • trunk/GSASIImath.py

    r849 r851  
    198198    return XYZ
    199199
    200 def UpdateResRBAtoms(Amat,Bmat,cx,Atoms,AtLookUp,RBObj,RBData):
     200def UpdateResRBAtoms(Bmat,RBObj,RBData):
    201201    RBIds = GetResRBIds(RBData)
    202     ObjIds = RBObj['Ids']
    203     RBRes = RBData[RBIds[RBObj['ResName']]]
     202    RBRes = RBData[RBIds[RBObj['RBname']]]
    204203    XYZ = np.array(RBRes['rbXYZ'])
    205204    for tor,seq in zip(RBObj['Torsions'],RBRes['rbSeq']):
     
    211210        xyz = np.inner(Bmat,xyz)
    212211        xyz += RBObj['Orig'][0]
    213         Atoms[AtLookUp[ObjIds[i]]][cx:cx+3] = xyz
     212        XYZ[i] = xyz
     213    return XYZ
     214   
     215def UpdateRBAtoms(Bmat,RBObj,RBData,RBType):
     216    RBIds = GetResRBIds(RBData[RBType])
     217    RBRes = RBData[RBType][RBIds[RBObj['RBname']]]
     218    if RBType == 'Vector':
     219        vecs = RBRes['rbVect']
     220        mags = RBRes['VectMag']
     221        XYZ = np.zeros_like(vecs[0])
     222        for vec,mag in zip(vecs,mags):
     223            XYZ += vec*mag
     224    elif RBType == 'Residue':
     225        XYZ = np.array(RBRes['rbXYZ'])
     226        for tor,seq in zip(RBObj['Torsions'],RBRes['rbSeq']):
     227            QuatA = AVdeg2Q(tor[0],XYZ[seq[0]]-XYZ[seq[1]])
     228            for ride in seq[3]:
     229                XYZ[ride] = prodQVQ(QuatA,XYZ[ride]-XYZ[seq[1]])+XYZ[seq[1]]
     230    for i,xyz in enumerate(XYZ):
     231        xyz = prodQVQ(RBObj['Orient'][0],xyz)
     232        xyz = np.inner(Bmat,xyz)
     233        xyz += RBObj['Orig'][0]
     234        XYZ[i] = xyz
     235    return XYZ   
    214236   
    215237def GetResRBIds(RBData):   
  • trunk/GSASIIphsGUI.py

    r850 r851  
    11821182        general = data['General']
    11831183        atomData = data['Atoms']
    1184        
    1185     def OnRBAssign(event):
    1186        
    1187         RBObjs = []
    1188         rbType = ''
    1189         rbName = ''
    1190         rbId = None
    1191        
    1192         def OnSelectRB(event):
    1193             rbName = selectRB.GetValue()
    1194             rbType,rbId = rbNames[rbName]
    1195             RBObjs = data['RBModels'].get(rbType,[])
    1196             page2.mainSizer.Add(wx.StaticText(page2,-1,'Select origin for '+rbName))
    1197            
    1198         rbData = G2frame.PatternTree.GetItemPyData(   
    1199             G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))
    1200         RBwizard = wz.Wizard(G2frame.dataFrame,-1,"Rigid body assign wizard")
     1184        Amat,Bmat = G2lat.cell2AB(general['Cell'][1:7])
    12011185        rbNames = {}
    12021186        for rbVec in rbData['Vector']:
     
    12091193            print '**** ERROR - no rigid bodies defined ****'
    12101194            return
    1211         page1 = G2gd.GSASWizard(RBwizard,"Select rigid body")
    1212         page1.mainSizer.Add(wx.StaticText(page1,-1,'Select rigid body'))
    1213         selectRB = wx.ComboBox(page1,-1,value=' ',choices=rbNames.keys(),
    1214             style=wx.CB_READONLY|wx.CB_DROPDOWN)
    1215         selectRB.Bind(wx.EVT_COMBOBOX,OnSelectRB)
    1216         page1.mainSizer.Add(selectRB)
    12171195       
    1218         page2 = G2gd.GSASWizard(RBwizard,"Select origin")
    1219         page3 = G2gd.GSASWizard(RBwizard,"Select 1st reference atom")
    1220         page4 = G2gd.GSASWizard(RBwizard,"Select 2nd reference atom")
    1221         page3.mainSizer.Add(wx.StaticText(page3,-1,'Select 1st reference atom'))
    1222         page3.mainSizer.Add(wx.StaticText(page4,-1,'Select 2nd reference atom'))
    1223         wz.WizardPageSimple_Chain(page1,page2)
    1224         wz.WizardPageSimple_Chain(page2,page3)
    1225         wz.WizardPageSimple_Chain(page3,page4)
    1226         RBwizard.FitToPage(page1)
    1227         if RBwizard.RunWizard(page1):
    1228             print 'done'
    1229 
    12301196    def OnAtomMove(event):
    12311197        drawData = data['Drawing']
     
    30743040            def OnOrienRef(event):
    30753041                RBObj['Orient'][1] = Qcheck.GetValue()
     3042                Qcheck.Setvalue(RBObj['Orient'][1])
    30763043               
    30773044            def OnTorsionRef(event):
     
    30863053                    val = float(Obj.GetValue())
    30873054                    RBObj['Torsions'][item][0] = val
    3088                     G2mth.UpdateResRBAtoms(Amat,Bmat,cx,data['Atoms'],AtLookUp,RBObj,RBData)
     3055                    newXYZ = G2mth.UpdateResRBAtoms(Bmat,RBObj,RBData)
     3056                    for i,id in enumerate(RBObj['Ids']):
     3057                        data['Atoms'][AtLookUp[id]][cx:cx+3] = newXYZ[i]
    30893058                except ValueError:
    30903059                    pass
     
    31053074            topLine = wx.BoxSizer(wx.HORIZONTAL)
    31063075            topLine.Add(wx.StaticText(RigidBodies,-1,
    3107                 'Name: '+RBObj['ResName']+RBObj['numChain']+'   '),0,wx.ALIGN_CENTER_VERTICAL)
     3076                'Name: '+RBObj['RBname']+RBObj['numChain']+'   '),0,wx.ALIGN_CENTER_VERTICAL)
    31083077            delRB = wx.CheckBox(RigidBodies,-1,'Delete?')
    31093078            delRB.Bind(wx.EVT_CHECKBOX,OnDelRB)
     
    31203089            topSizer.Add(Ocheck,0,wx.ALIGN_CENTER_VERTICAL)
    31213090            topSizer.Add(wx.StaticText(RigidBodies,-1,
    3122                 ' %s %8.5f %8.5f %8.5f %8.5f '%('Orientation:',Orien[0],Orien[1],Orien[2],Orien[3])))
    3123             Qcheck = wx.CheckBox(RigidBodies,-1,'Refine?')
     3091                ' %s %8.5f %8.5f %8.5f %8.5f  Refine?'%('Orientation:',Orien[0], \
     3092                Orien[1],Orien[2],Orien[3])),0,wx.ALIGN_CENTER_VERTICAL)
     3093            Qcheck = wx.ComboBox(RigidBodies,-1,value='',choices=[' ','A','Q'],
     3094                style=wx.CB_READONLY|wx.CB_DROPDOWN)
    31243095            Qcheck.Bind(wx.EVT_CHECKBOX,OnOrienRef)
    31253096            Qcheck.SetValue(RBObj['Orient'][1])
    3126             topSizer.Add(Qcheck,0,wx.ALIGN_CENTER_VERTICAL)
     3097            topSizer.Add(Qcheck)
    31273098            resrbSizer.Add(topSizer)
    31283099            resrbSizer.Add(wx.StaticText(RigidBodies,-1,' Torsions:'),0,wx.ALIGN_CENTER_VERTICAL)
     
    31453116        G2frame.dataFrame.SetStatusText('')
    31463117        mainSizer = wx.BoxSizer(wx.VERTICAL)
     3118        if not data['RBModels']:
     3119            mainSizer.Add((5,5),0)
     3120            mainSizer.Add(wx.StaticText(RigidBodies,-1,'No rigid body models:'),0,wx.ALIGN_CENTER_VERTICAL)
     3121            mainSizer.Add((5,5),0)
    31473122        if 'Residue' in data['RBModels']:
    31483123            mainSizer.Add((5,5),0)
     
    31623137        G2frame.dataFrame.setSizePosLeft(Size)
    31633138               
     3139    def OnRBAssign(event):
     3140       
     3141        rbData = G2frame.PatternTree.GetItemPyData(   
     3142            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))
     3143        rbNames = {}
     3144        for rbVec in rbData['Vector']:
     3145            if rbVec != 'AtInfo':
     3146                rbNames[rbData['Vector'][rbVec]['RBname']] =['Vector',rbVec]
     3147        for rbRes in rbData['Residue']:
     3148            if rbRes != 'AtInfo':
     3149                rbNames[rbData['Residue'][rbRes]['RBname']] = ['Residue',rbRes]
     3150        if not rbNames:
     3151            print '**** ERROR - no rigid bodies defined ****'
     3152            return
     3153        general = data['General']
     3154        Amat,Bmat = G2lat.cell2AB(general['Cell'][1:7])
     3155        cx,ct = general['AtomPtrs'][:2]
     3156        atomData = data['Atoms']
     3157        Indx = {}
     3158        atInd = [0,1,2]
     3159        data['testRBObj'] = {}
     3160           
     3161        def Draw():
     3162           
     3163            def OnOk(event):
     3164                #more stuff here substituting rigid body for atoms
     3165                del data['testRBObj']
     3166                FillRigidBodyGrid(True)
     3167               
     3168            def OnCancel(event):
     3169                del data['testRBObj']
     3170                FillRigidBodyGrid(True)
     3171               
     3172            def OnRBSel(event):
     3173                selection = rbSel.GetValue()
     3174                rbType,rbId = rbNames[selection]
     3175                data['testRBObj']['rbAtTypes'] = rbData[rbType][rbId]['rbTypes']
     3176                data['testRBObj']['AtInfo'] = rbData[rbType]['AtInfo']
     3177                data['testRBObj']['rbType'] = rbType
     3178                data['testRBObj']['rbData'] = rbData
     3179                data['testRBObj']['Sizers'] = {}
     3180                if rbType == 'Vector':
     3181                    rbRef = [0,1,2]
     3182                elif rbType == 'Residue':
     3183                    rbRef = rbData[rbType][rbId]['rbRef']
     3184                data['testRBObj']['rbRef'] = rbRef
     3185                refType = []
     3186                refName = []
     3187                for ref in rbRef:
     3188                    reftype = data['testRBObj']['rbAtTypes'][ref]
     3189                    refType.append(reftype)
     3190                    refName.append(reftype+' '+str(rbRef[0]))
     3191                atNames = [{},{},{}]
     3192                for iatm,atom in enumerate(atomData):
     3193                    for i,reftype in enumerate(refType):
     3194                        if atom[ct] == reftype:
     3195                            atNames[i][atom[ct-1]] = iatm
     3196                data['testRBObj']['atNames'] = atNames
     3197                data['testRBObj']['rbObj'] = {'Orig':[[0,0,0],False],'Orient':[[0,0,0,1.],' '],
     3198                    'RBId':rbId,'Torsions':[],'numChain':'','RBname':rbData[rbType][rbId]['RBname']}               
     3199                for item in rbData[rbType][rbId].get('rbSeq',[]):
     3200                    data['testRBObj']['rbObj']['Torsions'].append([0.0,False])
     3201                Draw()
     3202               
     3203            def OnOrigX(event):
     3204                Obj = event.GetEventObject()
     3205                item = Indx[Obj.GetId()]
     3206                try:
     3207                    val = float(Obj.GetValue())
     3208                    data['testRBObj']['rbObj']['Orig'][0][item] = val
     3209                except ValueError:
     3210                    pass
     3211                Draw()
     3212               
     3213            def OnOrien(event):
     3214                Obj = event.GetEventObject()
     3215                item = Indx[Obj.GetId()]
     3216                Q = data['testRBObj']['rbObj']['Orient'][0]
     3217                try:
     3218                    val = float(Obj.GetValue())
     3219                    Q[item] = val
     3220                    if not any(Q):
     3221                        raise ValueError
     3222                    Q = G2mth.normQ(Q)
     3223                    data['testRBObj']['rbObj']['Orient'][0] = Q
     3224                except ValueError:
     3225                    pass
     3226                Draw()               
     3227               
     3228            def OnAtOrigPick(event):
     3229                Obj = event.GetEventObject()
     3230                item = Indx[Obj.GetId()]
     3231                atName = Obj.GetValue()
     3232                atInd[0] = atNames[item][atName]
     3233                data['testRBObj']['rbObj']['Orig'][0] = atomData[atNames[item][atName]][cx:cx+3]
     3234                Draw()
     3235               
     3236            def OnAtQPick(event):
     3237                Obj = event.GetEventObject()
     3238                item = Indx[Obj.GetId()]
     3239                atName = Obj.GetValue()
     3240                atInd[item] = atNames[item][atName]
     3241                rbType = data['testRBObj']['rbType']
     3242                rbObj = data['testRBObj']['rbObj']
     3243                rbId = rbObj['RBId']
     3244                rbRef = data['testRBObj']['rbRef']
     3245                rbXYZ = rbData[rbType][rbId]['rbXYZ']
     3246                VAR = rbXYZ[rbRef[1]]-rbXYZ[rbRef[0]]
     3247                VBR = rbXYZ[rbRef[2]]-rbXYZ[rbRef[0]]
     3248                Orig = np.array(data['testRBObj']['rbObj']['Orig'][0])               
     3249                VAC = np.inner(Amat,np.array(atomData[atInd[1]][cx:cx+3])-Orig)
     3250                VBC = np.inner(Amat,np.array(atomData[atInd[2]][cx:cx+3])-Orig)
     3251                VCC = np.cross(VAR,VAC)
     3252                QuatA = G2mth.makeQuat(VAR,VAC,VCC)[0]
     3253                VAR = G2mth.prodQVQ(QuatA,VAR)
     3254                VBR = G2mth.prodQVQ(QuatA,VBR)
     3255                QuatB = G2mth.makeQuat(VBR,VBC,VAR)[0]
     3256                QuatC = G2mth.prodQQ(QuatB,QuatA)
     3257                data['testRBObj']['rbObj']['Orient'] = [QuatC,' ']
     3258                Draw()
     3259
     3260            if len(data['testRBObj']):
     3261                G2plt.PlotStructure(G2frame,data)
     3262                   
     3263            RigidBodies.DestroyChildren()
     3264            mainSizer = wx.BoxSizer(wx.VERTICAL)
     3265            mainSizer.Add((5,5),0)
     3266            mainSizer.Add(wx.StaticText(RigidBodies,-1,'Assign rigid body:'),0,wx.ALIGN_CENTER_VERTICAL)
     3267            mainSizer.Add((5,5),0)
     3268            if data['testRBObj']:
     3269                Xsizers = []
     3270                Osizers = []
     3271                OriSizer = wx.FlexGridSizer(1,6,5,5)
     3272                Orig = data['testRBObj']['rbObj']['Orig'][0]
     3273                Orien = data['testRBObj']['rbObj']['Orient'][0]
     3274                rbRef = data['testRBObj']['rbRef']
     3275                refName = []
     3276                for ref in rbRef:
     3277                    refName.append(data['testRBObj']['rbAtTypes'][ref]+str(ref))
     3278                atNames = data['testRBObj']['atNames']
     3279                OriSizer.Add(wx.StaticText(RigidBodies,-1,'Origin x,y,z: '),0,wx.ALIGN_CENTER_VERTICAL)
     3280                for ix,x in enumerate(Orig):
     3281                    origX = wx.TextCtrl(RigidBodies,-1,value='%10.5f'%(x),style=wx.TE_PROCESS_ENTER)
     3282                    origX.Bind(wx.EVT_TEXT_ENTER,OnOrigX)
     3283                    origX.Bind(wx.EVT_KILL_FOCUS,OnOrigX)
     3284                    Indx[origX.GetId()] = ix
     3285                    OriSizer.Add(origX,0,wx.ALIGN_CENTER_VERTICAL)
     3286                    Xsizers.append(origX)
     3287                if len(atomData):
     3288                    OriSizer.Add(wx.StaticText(RigidBodies,-1,'Select match to '+refName[0]+': '),0,wx.ALIGN_CENTER_VERTICAL)               
     3289                    atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[0]][ct-1],
     3290                        choices=atNames[0].keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3291                    atPick.Bind(wx.EVT_COMBOBOX, OnAtOrigPick)
     3292                    Indx[atPick.GetId()] = 0
     3293                    OriSizer.Add(atPick,0,wx.ALIGN_CENTER_VERTICAL)
     3294                    data['testRBObj']['Sizers']['Xsizers'] = Xsizers
     3295                else:
     3296                    OriSizer.Add((5,0),)
     3297                    OriSizer.Add((5,0),)                   
     3298                OriSizer.Add(wx.StaticText(RigidBodies,-1,'Orientation quaternion: '),0,wx.ALIGN_CENTER_VERTICAL)
     3299                for ix,x in enumerate(Orien):
     3300                    orien = wx.TextCtrl(RigidBodies,-1,value='%8.4f'%(x),style=wx.TE_PROCESS_ENTER)
     3301                    orien.Bind(wx.EVT_TEXT_ENTER,OnOrien)
     3302                    orien.Bind(wx.EVT_KILL_FOCUS,OnOrien)
     3303                    Indx[orien.GetId()] = ix
     3304                    OriSizer.Add(orien,0,wx.ALIGN_CENTER_VERTICAL)
     3305                    Osizers.append(orien)
     3306                data['testRBObj']['Sizers']['Osizers'] = Osizers
     3307                OriSizer.Add((5,0),)
     3308                if len(atomData):
     3309                    OriSizer.Add(wx.StaticText(RigidBodies,-1,'Orientation setting: '),0,wx.ALIGN_CENTER_VERTICAL)
     3310                    for i in [1,2]:
     3311                        OriSizer.Add(wx.StaticText(RigidBodies,-1,'Select match to '+refName[i]+': '),0,wx.ALIGN_CENTER_VERTICAL)
     3312                        atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[i]][ct-1],
     3313                            choices=atNames[i].keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3314                        atPick.Bind(wx.EVT_COMBOBOX, OnAtQPick)
     3315                        Indx[atPick.GetId()] = i
     3316                        OriSizer.Add(atPick,0,wx.ALIGN_CENTER_VERTICAL)
     3317                mainSizer.Add(OriSizer)
     3318                mainSizer.Add((5,5),0)
     3319               
     3320            else:
     3321                topSizer = wx.BoxSizer(wx.HORIZONTAL)
     3322                topSizer.Add(wx.StaticText(RigidBodies,-1,'Select rigid body model'),0,wx.ALIGN_CENTER_VERTICAL)
     3323                rbSel = wx.ComboBox(RigidBodies,-1,value='',choices=rbNames.keys(),
     3324                    style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3325                rbSel.Bind(wx.EVT_COMBOBOX, OnRBSel)
     3326                topSizer.Add((5,5),0)
     3327                topSizer.Add(rbSel,0,wx.ALIGN_CENTER_VERTICAL)
     3328                mainSizer.Add(topSizer)
     3329               
     3330               
     3331            OkBtn = wx.Button(RigidBodies,-1,"Ok")
     3332            OkBtn.Bind(wx.EVT_BUTTON, OnOk)
     3333            CancelBtn = wx.Button(RigidBodies,-1,'Cancel')
     3334            CancelBtn.Bind(wx.EVT_BUTTON, OnCancel)
     3335            btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     3336            btnSizer.Add((20,20),1)
     3337            btnSizer.Add(OkBtn)
     3338            btnSizer.Add(CancelBtn)
     3339            btnSizer.Add((20,20),1)
     3340            mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
     3341            RigidBodies.SetSizer(mainSizer)
     3342            mainSizer.FitInside(RigidBodies)
     3343            Size = mainSizer.GetMinSize()
     3344            Size[0] += 40
     3345            Size[1] = max(Size[1],290) + 35
     3346            RigidBodies.SetSize(Size)
     3347            RigidBodies.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
     3348            Size[1] = min(Size[1],450)
     3349            G2frame.dataFrame.setSizePosLeft(Size)
     3350           
     3351        Draw()
     3352       
    31643353    def OnAutoFindResRB(event):
    31653354        RBData = G2frame.PatternTree.GetItemPyData(   
     
    31983387                VAR = rbRes['rbXYZ'][rbRef[1]]-rbRes['rbXYZ'][rbRef[0]]
    31993388                VBR = rbRes['rbXYZ'][rbRef[2]]-rbRes['rbXYZ'][rbRef[0]]
    3200                 rbObj = {'ResName':rbRes['RBname'],'numChain':numChain}
     3389                rbObj = {'RBname':rbRes['RBname'],'numChain':numChain}
    32013390                rbAtoms = []
    32023391                rbIds = []
     
    32193408                QuatB = G2mth.makeQuat(VBR,VBC,VAR)[0]
    32203409                QuatC = G2mth.prodQQ(QuatB,QuatA)
    3221                 rbObj['Orient'] = [QuatC,False]
     3410                rbObj['Orient'] = [QuatC,' ']
    32223411                SXYZ = []
    32233412                TXYZ = []
     
    32393428            data['RBModels']['Residue'] = RBObjs
    32403429            for RBObj in RBObjs:
    3241                 G2mth.UpdateResRBAtoms(Amat,Bmat,cx,Atoms,AtLookUp,RBObj,RBData)
     3430                newXYZ = G2mth.UpdateResRBAtoms(Bmat,RBObj,RBData)
     3431                for i,id in enumerate(RBObj['Ids']):
     3432                    data['Atoms'][AtLookUp[id]][cx:cx+3] = newXYZ[i]
    32423433        finally:
    32433434            wx.EndBusyCursor()
     
    32453436       
    32463437    def OnRBRemoveAll(event):
    3247         print 'remove all RBs'
    3248        
     3438        data['RBModels']['Residue'] = []
     3439        data['RBModels']['Vector'] = []
     3440        FillRigidBodyGrid(True)
    32493441       
    32503442    def OnGlobalResRBRef(event):
     
    32693461                        rbObj['Orig'][1] = False
    32703462                    if 'Orientation' in parms:
    3271                         rbObj['Orient'][1] = True
     3463                        rbObj['Orient'][1] = 'Q'
    32723464                    else:
    3273                         rbObj['Orient'][1] = False
     3465                        rbObj['Orient'][1] = ' '
    32743466                    for i in range(len(rbObj['Torsions'])):
    32753467                        if 'Torsion '+str(i) in parms:
     
    37563948            G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomInsert, id=G2gd.wxID_ATOMSEDITINSERT)
    37573949            G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomViewInsert, id=G2gd.wxID_ATOMVIEWINSERT)
    3758             G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBAssign, id=G2gd.wxID_ASSIGNATMS2RB)
    37593950            G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomMove, id=G2gd.wxID_ATOMMOVE)
    37603951            G2frame.dataFrame.Bind(wx.EVT_MENU, AtomDelete, id=G2gd.wxID_ATOMSEDITDELETE)
     
    38083999            G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.RigidBodiesMenu)
    38094000            G2frame.dataFrame.Bind(wx.EVT_MENU, OnAutoFindResRB, id=G2gd.wxID_AUTOFINDRESRB)
     4001            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBAssign, id=G2gd.wxID_ASSIGNATMS2RB)
    38104002            G2frame.dataFrame.Bind(wx.EVT_MENU, OnGlobalResRBRef, id=G2gd.wxID_GLOBALRESREFINE)
    38114003            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBRemoveAll, id=G2gd.wxID_RBREMOVEALL)
  • trunk/GSASIIplot.py

    r843 r851  
    26052605    atomData = data['Atoms']
    26062606    mapPeaks = []
     2607    drawingData = data['Drawing']   
    26072608    if 'Map Peaks' in data:
    26082609        mapPeaks = np.array(data['Map Peaks'])
     
    26102611        if len(mapPeaks):
    26112612            peakMax = np.max(mapPeaks.T[0])
    2612     drawingData = data['Drawing']
    2613    
    2614     try:
    2615         drawAtoms = drawingData['Atoms']
    2616     except KeyError:
    2617         drawAtoms = []
     2613    testRBObj = data.get('testRBObj',{})
     2614    rbObj = testRBObj.get('rbObj',{})
     2615    drawAtoms = drawingData.get('Atoms',[])
    26182616    mapData = {}
    26192617    flipData = {}
     
    27912789        else:
    27922790            drawingData['oldxy'] = list(xy)
    2793 #        Draw()
    27942791       
    27952792    def OnMouseMove(event):
     
    27972794            return
    27982795        newxy = event.GetPosition()
    2799         page = getSelection()
    28002796                               
    2801         if event.Dragging() and not event.ControlDown():
    2802             if event.LeftIsDown():
    2803                 SetRotation(newxy)
    2804                 Q = drawingData['Quaternion']
    2805                 G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1)
    2806             elif event.RightIsDown():
    2807                 SetTranslation(newxy)
    2808                 Tx,Ty,Tz = drawingData['viewPoint'][0]
    2809                 G2frame.G2plotNB.status.SetStatusText('New view point: %.4f, %.4f, %.4f'%(Tx,Ty,Tz),1)
    2810             elif event.MiddleIsDown():
    2811                 SetRotationZ(newxy)
    2812                 Q = drawingData['Quaternion']
    2813                 G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1)
    2814             Draw('move')
     2797        if event.Dragging():
     2798            if event.AltDown():
     2799                if event.LeftIsDown():
     2800                    SetRBRotation(newxy)
     2801                    Q = rbObj['Orient'][0]
     2802                    G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1)
     2803                elif event.RightIsDown():
     2804                    SetRBTranslation(newxy)
     2805                    Tx,Ty,Tz = rbObj['Orig'][0]
     2806                    G2frame.G2plotNB.status.SetStatusText('New view point: %.4f, %.4f, %.4f'%(Tx,Ty,Tz),1)
     2807                elif event.MiddleIsDown():
     2808                    SetRBRotationZ(newxy)
     2809                    Q = rbObj['Orient'][0]
     2810                    G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1)
     2811                Draw('move')
     2812            elif not event.ControlDown():
     2813                if event.LeftIsDown():
     2814                    SetRotation(newxy)
     2815                    Q = drawingData['Quaternion']
     2816                    G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1)
     2817                elif event.RightIsDown():
     2818                    SetTranslation(newxy)
     2819                    Tx,Ty,Tz = drawingData['viewPoint'][0]
     2820                    G2frame.G2plotNB.status.SetStatusText('New view point: %.4f, %.4f, %.4f'%(Tx,Ty,Tz),1)
     2821                elif event.MiddleIsDown():
     2822                    SetRotationZ(newxy)
     2823                    Q = drawingData['Quaternion']
     2824                    G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1)
     2825                Draw('move')
     2826           
    28152827       
    28162828    def OnMouseWheel(event):
     
    28432855                names = [child.GetName() for child in panel]
    28442856                panel[names.index('viewPoint')].SetValue('%.3f %.3f %.3f'%(VP[0],VP[1],VP[2]))
     2857               
     2858    def SetRBOrigText():
     2859        page = getSelection()
     2860        if page:
     2861            if G2frame.dataDisplay.GetPageText(page) == 'RB Models':
     2862                for i,sizer in enumerate(testRBObj['Sizers']['Xsizers']):
     2863                    sizer.SetValue('%8.5f'%(testRBObj['rbObj']['Orig'][0][i]))
     2864                   
     2865    def SetRBOrienText():
     2866        page = getSelection()
     2867        if page:
     2868            if G2frame.dataDisplay.GetPageText(page) == 'RB Models':
     2869                for i,sizer in enumerate(testRBObj['Sizers']['Osizers']):
     2870                    sizer.SetValue('%8.5f'%(testRBObj['rbObj']['Orient'][0][i]))
    28452871               
    28462872    def SetViewDirText(VD):
     
    29522978        SetViewPointText([Tx,Ty,Tz])
    29532979       
     2980    def SetRBTranslation(newxy):
     2981#first get translation vector in screen coords.       
     2982        oldxy = drawingData['oldxy']
     2983        if not len(oldxy): oldxy = list(newxy)
     2984        dxy = newxy-oldxy
     2985        drawingData['oldxy'] = list(newxy)
     2986        V = np.array([-dxy[0],dxy[1],0.])
     2987#then transform to rotated crystal coordinates & apply to RB origin       
     2988        Q = drawingData['Quaternion']
     2989        V = np.inner(Bmat,G2mth.prodQVQ(G2mth.invQ(Q),V))
     2990        Tx,Ty,Tz = rbObj['Orig'][0]
     2991        Tx -= V[0]*0.01
     2992        Ty -= V[1]*0.01
     2993        Tz -= V[2]*0.01
     2994        drawingData['oldxy'] = list(newxy)
     2995        rbObj['Orig'][0] =  Tx,Ty,Tz
     2996        SetRBOrigText()
     2997       
    29542998    def SetRotation(newxy):
    29552999#first get rotation vector in screen coords. & angle increment       
     
    29973041        Q = G2mth.prodQQ(Q,Qy)
    29983042        drawingData['Quaternion'] = Q
     3043
     3044    def SetRBRotation(newxy):
     3045#first get rotation vector in screen coords. & angle increment       
     3046        oldxy = drawingData['oldxy']
     3047        if not len(oldxy): oldxy = list(newxy)
     3048        dxy = newxy-oldxy
     3049        drawingData['oldxy'] = list(newxy)
     3050        V = np.array([dxy[1],dxy[0],0.])
     3051        A = 0.25*np.sqrt(dxy[0]**2+dxy[1]**2)
     3052# next transform vector back to xtal coordinates via inverse quaternion
     3053# & make new quaternion
     3054        Q = rbObj['Orient'][0]              #rotate RB to Cart
     3055        QC = drawingData['Quaternion']      #rotate Cart to drawing
     3056        V = G2mth.prodQVQ(G2mth.invQ(QC),V)
     3057        V = G2mth.prodQVQ(G2mth.invQ(Q),V)
     3058        DQ = G2mth.AVdeg2Q(A,V)
     3059        Q = G2mth.prodQQ(Q,DQ)
     3060        rbObj['Orient'][0] = Q
     3061        SetRBOrienText()
     3062       
     3063    def SetRBRotationZ(newxy):                       
     3064#first get rotation vector (= view vector) in screen coords. & angle increment       
     3065        View = glGetIntegerv(GL_VIEWPORT)
     3066        cent = [View[2]/2,View[3]/2]
     3067        oldxy = drawingData['oldxy']
     3068        if not len(oldxy): oldxy = list(newxy)
     3069        dxy = newxy-oldxy
     3070        drawingData['oldxy'] = list(newxy)
     3071        V = drawingData['viewDir']
     3072        A = [0,0]
     3073        A[0] = dxy[1]*.25
     3074        A[1] = dxy[0]*.25
     3075        if newxy[0] < cent[0]:
     3076            A[0] *= -1
     3077        if newxy[1] > cent[1]:
     3078            A[1] *= -1       
     3079# next transform vector back to RB coordinates & make new quaternion
     3080        Q = rbObj['Orient'][0]              #rotate RB to cart
     3081        V = np.inner(Amat,V)
     3082        V = -G2mth.prodQVQ(G2mth.invQ(Q),V)
     3083        Qx = G2mth.AVdeg2Q(A[0],V)
     3084        Qy = G2mth.AVdeg2Q(A[1],V)
     3085        Q = G2mth.prodQQ(Q,Qx)
     3086        Q = G2mth.prodQQ(Q,Qy)
     3087        rbObj['Orient'][0] = Q
     3088        SetRBOrienText()
    29993089
    30003090    def RenderBox():
     
    31553245        glDisable(GL_COLOR_MATERIAL)
    31563246       
    3157     def RenderLabel(x,y,z,label,r):       
     3247    def RenderLabel(x,y,z,label,r,color):       
    31583248        glPushMatrix()
    31593249        glTranslate(x,y,z)
    31603250        glMultMatrixf(B4mat.T)
    31613251        glDisable(GL_LIGHTING)
    3162         glColor3f(0,1.,0)
     3252        glColor3fv(color)
    31633253        glRasterPos3f(r,r,r)
    31643254        for c in list(label):
     
    33363426                   
    33373427            if atom[cs+1] == 'type':
    3338                 RenderLabel(x,y,z,atom[ct],radius)
     3428                RenderLabel(x,y,z,atom[ct],radius,Gr)
    33393429            elif atom[cs+1] == 'name':
    3340                 RenderLabel(x,y,z,atom[ct-1],radius)
     3430                RenderLabel(x,y,z,atom[ct-1],radius,Gr)
    33413431            elif atom[cs+1] == 'number':
    3342                 RenderLabel(x,y,z,str(iat),radius)
     3432                RenderLabel(x,y,z,str(iat),radius,Gr)
    33433433            elif atom[cs+1] == 'residue' and atom[ct-1] == 'CA':
    3344                 RenderLabel(x,y,z,atom[ct-4],radius)
     3434                RenderLabel(x,y,z,atom[ct-4],radius,Gr)
    33453435            elif atom[cs+1] == '1-letter' and atom[ct-1] == 'CA':
    3346                 RenderLabel(x,y,z,atom[ct-3],radius)
     3436                RenderLabel(x,y,z,atom[ct-3],radius,Gr)
    33473437            elif atom[cs+1] == 'chain' and atom[ct-1] == 'CA':
    3348                 RenderLabel(x,y,z,atom[ct-2],radius)
     3438                RenderLabel(x,y,z,atom[ct-2],radius,Gr)
    33493439#        glDisable(GL_BLEND)
    33503440        if len(rhoXYZ):
     
    33603450                if showBonds:
    33613451                    RenderLines(x,y,z,mapBonds[ind],Wt)
     3452        if len(testRBObj) and pageName == 'RB Models':
     3453            XYZ = G2mth.UpdateRBAtoms(Bmat,testRBObj['rbObj'],testRBObj['rbData'],testRBObj['rbType'])
     3454            rbBonds = FindPeaksBonds(XYZ)
     3455            for ind,[x,y,z] in enumerate(XYZ):
     3456                aType = testRBObj['rbAtTypes'][ind]
     3457                name = aType+str(ind)
     3458                color = np.array(testRBObj['AtInfo'][aType][1])
     3459                RenderSphere(x,y,z,0.2,color/255.)
     3460#                RenderMapPeak(x,y,z,color,1.0)
     3461                RenderBonds(x,y,z,rbBonds[ind],0.03,Gr)
     3462                RenderLabel(x,y,z,name,0.2,Bl)
    33623463        if Backbones:
    33633464            for chain in Backbones:
Note: See TracChangeset for help on using the changeset viewer.