Changeset 851 for trunk/GSASIIphsGUI.py


Ignore:
Timestamp:
Feb 15, 2013 3:04:56 PM (9 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)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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)
Note: See TracChangeset for help on using the changeset viewer.