Changeset 855


Ignore:
Timestamp:
Feb 23, 2013 9:58:47 PM (9 years ago)
Author:
vondreele
Message:

RB input mostly finished; now has thermal motion models

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r854 r855  
    967967                sel = Obj.GetValue()
    968968                rbData['rbRef'][iref] = atNames.index(sel)
     969                FillRefChoice(rbId,rbData)
    969970           
    970971            refAtmSizer = wx.BoxSizer(wx.HORIZONTAL)
     
    10861087            choiceIds = [i for i in range(len(rbData['rbTypes']))]
    10871088           
    1088             rbRef = rbData.get('rbRef',[0,1,2,False])
     1089            rbRef = rbData.get('rbRef',[-1,-1,-1,False])
    10891090            for i in range(3):
    10901091                choiceIds.remove(rbRef[i])
     
    11241125        AtInfo = data['Residue']['AtInfo']
    11251126        refChoice = {}
     1127        RefObjs = []
    11261128
    11271129        def rbNameSizer(rbId,rbData):
     
    12001202            def OnRefSel(event):
    12011203                Obj = event.GetEventObject()
    1202                 iref,res = Indx[Obj.GetId()]
     1204                iref,res,jref = Indx[Obj.GetId()]
    12031205                sel = Obj.GetValue()
    12041206                ind = atNames.index(sel)
    12051207                rbData['rbRef'][iref] = ind
     1208                FillRefChoice(rbId,rbData)
     1209                for i,ref in enumerate(RefObjs[jref]):
     1210                    ref.SetItems([atNames[j] for j in refChoice[rbId][i]])
     1211                    ref.SetValue(atNames[rbData['rbRef'][i]])
    12061212                if not iref:     #origin change
    12071213                    rbXYZ = rbData['rbXYZ']
     
    12531259                refAtmSizer.Add(wx.StaticText(ResidueRBDisplay,-1,
    12541260                    'Orientation reference atoms A-B-C: '),0,wx.ALIGN_CENTER_VERTICAL)
     1261                refObj = [0,0,0]
    12551262                for i in range(3):
    12561263                    choices = [atNames[j] for j in refChoice[rbId][i]]
     
    12591266                    refSel.SetValue(atNames[rbRef[i]])
    12601267                    refSel.Bind(wx.EVT_COMBOBOX, OnRefSel)
    1261                     Indx[refSel.GetId()] = [i,vecGrid]
     1268                    Indx[refSel.GetId()] = [i,vecGrid,len(RefObjs)]
     1269                    refObj[i] = refSel
    12621270                    refAtmSizer.Add(refSel,0,wx.ALIGN_CENTER_VERTICAL)
     1271                RefObjs.append(refObj)
    12631272           
    12641273            mainSizer = wx.BoxSizer(wx.VERTICAL)
  • trunk/GSASIIgrid.py

    r852 r855  
    12561256        self.RigidBodiesEdit = wx.Menu(title='')
    12571257        self.RigidBodiesMenu.Append(menu=self.RigidBodiesEdit, title='Edit')
     1258        self.RigidBodiesEdit.Append(id=wxID_ASSIGNATMS2RB, kind=wx.ITEM_NORMAL,text='Assign atoms to rigid body',
     1259            help='Select & position rigid body in structure of existing atoms')
    12581260        self.RigidBodiesEdit.Append(id=wxID_AUTOFINDRESRB, kind=wx.ITEM_NORMAL,text='Auto find residues',
    12591261            help='Auto find of residue RBs in macromolecule')
    1260         self.RigidBodiesEdit.Append(id=wxID_ASSIGNATMS2RB, kind=wx.ITEM_NORMAL,text='Assign atoms to rigid body',
    1261             help='Select & position rigid body in structure for existing atoms')
    12621262        self.RigidBodiesEdit.Append(id=wxID_GLOBALRESREFINE, kind=wx.ITEM_NORMAL,text='Global residue refine',
    12631263            help='Global setting of residue RB refinement flags')
  • trunk/GSASIImath.py

    r853 r855  
    197197        XYZ.append([parmDict[name]+parmDict[dname] for name,dname in zip(names,dnames)])
    198198    return XYZ
     199
     200def GetXYZDist(xyz,XYZ,Amat):
     201    ''' gets distance from position xyz to all XYZ, xyz & XYZ are np.array
     202        and are in crystal coordinates; Amat is crystal to Cart matrix
     203    '''
     204    return np.sqrt(np.sum(np.inner(Amat,XYZ-xyz)**2,axis=0))
     205
     206def getAtomXYZ(atoms,cx):
     207    XYZ = []
     208    for atom in atoms:
     209        XYZ.append(atom[cx:cx+3])
     210    return np.array(XYZ)
    199211
    200212def UpdateResRBAtoms(Bmat,RBObj,RBData):
  • trunk/GSASIIphsGUI.py

    r854 r855  
    753753        vecRBData = data['RBModels'].get('Vector',[])
    754754        rbAtmDict = {}
    755         for rbObj in resRBData:
     755        for rbObj in resRBData+vecRBData:
    756756            exclList = ['X' for i in range(len(rbObj['Ids']))]
    757757            rbAtmDict.update(dict(zip(rbObj['Ids'],exclList)))
     
    15381538        if 'Quaternion' not in drawingData:
    15391539            drawingData['Quaternion'] = G2mth.AV2Q(2*np.pi,np.inner(Amat,[0,0,1]))
     1540        if 'showRigidBodies' not in drawingData:
     1541            drawingData['showRigidBodies'] = True
    15401542        cx,ct,cs,ci = [0,0,0,0]
    15411543        if generalData['Type'] == 'nuclear':
     
    16401642        rbXYZ -= rbXYZ[0]
    16411643        rbId = ran.randint(0,sys.maxint)
    1642         RBData['Residue'][rbId] = {'RBname':'UNKRB','rbXYZ':rbXYZ,'rbTypes':rbType,
     1644        rbName = 'UNKRB'
     1645        dlg = wx.TextEntryDialog(G2frame,'Enter the name for the new rigid body',
     1646            'Edit rigid body name',rbName ,style=wx.OK)
     1647        if dlg.ShowModal() == wx.ID_OK:
     1648            rbName = dlg.GetValue()
     1649        dlg.Destroy()
     1650        RBData['Residue'][rbId] = {'RBname':rbName,'rbXYZ':rbXYZ,'rbTypes':rbType,
    16431651            'atNames':atNames,'rbRef':[0,1,2,False],'rbSeq':[],'SelSeq':[0,0],'useCount':0}
    16441652        G2frame.dataFrame.SetStatusText('New rigid body UNKRB added to set of Residue rigid bodies')
     
    25462554                G2plt.PlotStructure(G2frame,data)
    25472555               
     2556            def OnShowRB(event):
     2557                drawingData['showRigidBodies'] = showRB.GetValue()
     2558                FindBondsDraw()
     2559                G2plt.PlotStructure(G2frame,data)
     2560               
    25482561            def OnViewPoint(event):
    25492562                Obj = event.GetEventObject()
     
    26212634            showHydrogen.SetValue(drawingData['showHydrogen'])
    26222635            line2Sizer.Add(showHydrogen,0,wx.ALIGN_CENTER_VERTICAL)
     2636           
     2637            showRB = wx.CheckBox(dataDisplay,-1,label=' Show rigid Bodies?')
     2638            showRB.Bind(wx.EVT_CHECKBOX, OnShowRB)
     2639            showRB.SetValue(drawingData['showRigidBodies'])
     2640            line2Sizer.Add(showRB,0,wx.ALIGN_CENTER_VERTICAL)
     2641           
    26232642            showSizer.Add(line2Sizer)
    26242643            return showSizer
     
    30303049        Amat,Bmat = G2lat.cell2AB(general['Cell'][1:7])
    30313050        RBData = G2frame.PatternTree.GetItemPyData(   
    3032             G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))['Residue']
     3051            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))
    30333052        Indx = {}
    30343053       
     
    30533072                    val = float(Obj.GetValue())
    30543073                    RBObj['Torsions'][item][0] = val
    3055                     newXYZ = G2mth.UpdateResRBAtoms(Bmat,RBObj,RBData)
     3074                    newXYZ = G2mth.UpdateResRBAtoms(Bmat,RBObj,RBData['Residue'])
    30563075                    for i,id in enumerate(RBObj['Ids']):
    30573076                        data['Atoms'][AtLookUp[id]][cx:cx+3] = newXYZ[i]
     
    30643083                G2plt.PlotStructure(G2frame,data)
    30653084               
    3066             def OnDelRB(event):
    3067                 RBId = RBObj['RBId']
    3068                 RBData[RBId]['useCount'] -= 1               
    3069                 del RBObj
     3085            def OnDelResRB(event):
     3086                Obj = event.GetEventObject()
     3087                RBId = Indx[Obj.GetId()]
     3088                RBData['Residue'][RBId]['useCount'] -= 1
     3089                RBObjs = data['RBModels']['Residue']
     3090                for rbObj in RBObjs:
     3091                    if RBId == rbObj['RBId']:
     3092                       data['RBModels']['Residue'].remove(rbObj)                 
     3093                G2plt.PlotStructure(G2frame,data)
    30703094                wx.CallAfter(FillRigidBodyGrid,True)
     3095               
     3096            def OnThermSel(event):
     3097                val = thermSel.GetValue()
     3098                RBObj['ThermalMotion'] = ['None',[],[]]
     3099                if val == 'Uiso':
     3100                    RBObj['ThermalMotion'] = ['Uiso',[0.01,],[False,]]
     3101                elif val == 'T':
     3102                    RBObj['ThermalMotion'] = ['T',[0.0 for i in range(6)],[False for i in range(6)]]
     3103                elif val == 'TL':
     3104                    RBObj['ThermalMotion'] = ['TL',[0.0 for i in range(12)],[False for i in range(12)]]
     3105                elif val == 'TLS':
     3106                    RBObj['ThermalMotion'] = ['TLS',[0.0 for i in range(20)],[False for i in range(20)]] #SAA = S33-S11 & SBB = S22-S33
     3107                wx.CallAfter(FillRigidBodyGrid,True)
     3108               
     3109            def ThermDataSizer():
     3110               
     3111                def OnThermval(event):
     3112                    Obj = event.GetEventObject()
     3113                    item = Indx[Obj.GetId()]
     3114                    try:
     3115                        val = float(Obj.GetValue())
     3116                        RBObj['ThermalMotion'][1][item] = val
     3117                    except ValueError:
     3118                        pass
     3119                    Obj.SetValue('%8.4f'%(RBObj['ThermalMotion'][1][item]))
     3120                    G2plt.PlotStructure(G2frame,data)
     3121                   
     3122                def OnTLSRef(event):
     3123                    Obj = event.GetEventObject()
     3124                    item = Indx[Obj.GetId()]
     3125                    RBObj['ThermalMotion'][2][item] = Obj.GetValue()
     3126               
     3127                thermSizer = wx.FlexGridSizer(1,9,5,5)
     3128                model = RBObj['ThermalMotion']
     3129                if model[0] == 'Uiso':
     3130                    names = ['Uiso',]
     3131                elif 'T' in model[0]:
     3132                    names = ['T11','T22','T33','T12','T13','T23']
     3133                if 'L' in model[0]:
     3134                    names += ['L11','L22','L33','L12','L13','L23']
     3135                if 'S' in model[0]:
     3136                    names += ['S12','S13','S21','S23','S31','S32','SAA','SBB']
     3137                for i,name in enumerate(names):
     3138                    thermSizer.Add(wx.StaticText(RigidBodies,-1,name+': '),0,wx.ALIGN_CENTER_VERTICAL)
     3139                    thermVal = wx.TextCtrl(RigidBodies,-1,value='%8.4f'%(model[1][i]),
     3140                        style=wx.TE_PROCESS_ENTER)
     3141                    thermVal.Bind(wx.EVT_TEXT_ENTER,OnThermval)
     3142                    thermVal.Bind(wx.EVT_KILL_FOCUS,OnThermval)
     3143                    Indx[thermVal.GetId()] = i
     3144                    thermSizer.Add(thermVal)
     3145                    Tcheck = wx.CheckBox(RigidBodies,-1,'Refine?')
     3146                    Tcheck.Bind(wx.EVT_CHECKBOX,OnTLSRef)
     3147                    Tcheck.SetValue(model[2][i])
     3148                    Indx[Tcheck.GetId()] = i
     3149                    thermSizer.Add(Tcheck,0,wx.ALIGN_CENTER_VERTICAL)
     3150                return thermSizer
    30713151             
    30723152            resrbSizer = wx.BoxSizer(wx.VERTICAL)
     
    30753155            topLine.Add(wx.StaticText(RigidBodies,-1,
    30763156                'Name: '+RBObj['RBname']+RBObj['numChain']+'   '),0,wx.ALIGN_CENTER_VERTICAL)
     3157            rbId = RBObj['RBId']
    30773158            delRB = wx.CheckBox(RigidBodies,-1,'Delete?')
    3078             delRB.Bind(wx.EVT_CHECKBOX,OnDelRB)
     3159            delRB.Bind(wx.EVT_CHECKBOX,OnDelResRB)
     3160            Indx[delRB.GetId()] = rbId
    30793161            topLine.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
    30803162            resrbSizer.Add(topLine)
     
    30833165            Orien = RBObj['Orient'][0]
    30843166            topSizer.Add(wx.StaticText(RigidBodies,-1,
    3085                 ' %s %8.5f %8.5f %8.5f'%(       'Origin     :',Orig[0],Orig[1],Orig[2])))
     3167                '%s %8.5f %8.5f %8.5f'%(       'Origin     :',Orig[0],Orig[1],Orig[2])))
    30863168            Ocheck = wx.CheckBox(RigidBodies,-1,'Refine?')
    30873169            Ocheck.Bind(wx.EVT_CHECKBOX,OnOrigRef)
     
    30893171            topSizer.Add(Ocheck,0,wx.ALIGN_CENTER_VERTICAL)
    30903172            topSizer.Add(wx.StaticText(RigidBodies,-1,
    3091                 ' %s %8.5f %8.5f %8.5f %8.5f  Refine?'%('Orientation:',Orien[0], \
     3173                '%s %8.5f %8.5f %8.5f %8.5f  Refine?'%('Orientation:',Orien[0], \
    30923174                Orien[1],Orien[2],Orien[3])),0,wx.ALIGN_CENTER_VERTICAL)
    30933175            Qcheck = wx.ComboBox(RigidBodies,-1,value='',choices=[' ','A','Q'],
    30943176                style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3095             Qcheck.Bind(wx.EVT_CHECKBOX,OnOrienRef)
     3177            Qcheck.Bind(wx.EVT_COMBOBOX,OnOrienRef)
    30963178            Qcheck.SetValue(RBObj['Orient'][1])
    30973179            topSizer.Add(Qcheck)
    30983180            resrbSizer.Add(topSizer)
    3099             resrbSizer.Add(wx.StaticText(RigidBodies,-1,' Torsions:'),0,wx.ALIGN_CENTER_VERTICAL)
     3181            resrbSizer.Add(wx.StaticText(RigidBodies,-1,'Torsions:'),0,wx.ALIGN_CENTER_VERTICAL)
    31003182            torSizer = wx.FlexGridSizer(1,6,5,5)
    31013183            for itors,tors in enumerate(RBObj['Torsions']):
     
    31123194                torSizer.Add(torCheck,0,wx.ALIGN_CENTER_VERTICAL)
    31133195            resrbSizer.Add(torSizer)
    3114             return resrbSizer       
     3196            tchoice = ['None','Uiso','T','TL','TLS']
     3197            thermSizer = wx.BoxSizer(wx.HORIZONTAL)
     3198            thermSizer.Add(wx.StaticText(RigidBodies,-1,'Rigid body thermal motion model: '),0,wx.ALIGN_CENTER_VERTICAL)
     3199            thermSel = wx.ComboBox(RigidBodies,-1,value=RBObj['ThermalMotion'][0],choices=tchoice,
     3200                style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3201            thermSel.Bind(wx.EVT_COMBOBOX,OnThermSel)
     3202            thermSizer.Add(thermSel,0,wx.ALIGN_CENTER_VERTICAL)
     3203            resrbSizer.Add(thermSizer)
     3204            if RBObj['ThermalMotion'][0] != 'None':
     3205                resrbSizer.Add(ThermDataSizer())
     3206            return resrbSizer
     3207           
     3208        def VecrbSizer(RBObj):
     3209                 
     3210            def OnOrigRef(event):
     3211                RBObj['Orig'][1] = Ocheck.GetValue()
     3212             
     3213            def OnOrienRef(event):
     3214                RBObj['Orient'][1] = Qcheck.GetValue()
     3215                Qcheck.Setvalue(RBObj['Orient'][1])
     3216               
     3217            def OnDelVecRB(event):
     3218                Obj = event.GetEventObject()
     3219                RBId = Indx[Obj.GetId()]
     3220                RBData['Vector'][RBId]['useCount'] -= 1               
     3221                RBObjs = data['RBModels']['Vector']
     3222                for rbObj in RBObjs:
     3223                    if RBId == rbObj['RBId']:
     3224                       data['RBModels']['Vector'].remove(rbObj)                 
     3225                G2plt.PlotStructure(G2frame,data)
     3226                wx.CallAfter(FillRigidBodyGrid,True)
     3227             
     3228            vecrbSizer = wx.BoxSizer(wx.VERTICAL)
     3229            vecrbSizer.Add(wx.StaticText(RigidBodies,-1,120*'-'))
     3230            topLine = wx.BoxSizer(wx.HORIZONTAL)
     3231            topLine.Add(wx.StaticText(RigidBodies,-1,
     3232                'Name: '+RBObj['RBname']+'   '),0,wx.ALIGN_CENTER_VERTICAL)
     3233            rbId = RBObj['RBId']
     3234            delRB = wx.CheckBox(RigidBodies,-1,'Delete?')
     3235            delRB.Bind(wx.EVT_CHECKBOX,OnDelVecRB)
     3236            Indx[delRB.GetId()] = rbId
     3237            topLine.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
     3238            vecrbSizer.Add(topLine)
     3239            topSizer = wx.FlexGridSizer(2,2,5,5)
     3240            Orig = RBObj['Orig'][0]
     3241            Orien = RBObj['Orient'][0]
     3242            topSizer.Add(wx.StaticText(RigidBodies,-1,
     3243                '%s %8.5f %8.5f %8.5f'%(       'Origin     :',Orig[0],Orig[1],Orig[2])))
     3244            Ocheck = wx.CheckBox(RigidBodies,-1,'Refine?')
     3245            Ocheck.Bind(wx.EVT_CHECKBOX,OnOrigRef)
     3246            Ocheck.SetValue(RBObj['Orig'][1])
     3247            topSizer.Add(Ocheck,0,wx.ALIGN_CENTER_VERTICAL)
     3248            topSizer.Add(wx.StaticText(RigidBodies,-1,
     3249                '%s %8.5f %8.5f %8.5f %8.5f  Refine?'%('Orientation:',Orien[0], \
     3250                Orien[1],Orien[2],Orien[3])),0,wx.ALIGN_CENTER_VERTICAL)
     3251            Qcheck = wx.ComboBox(RigidBodies,-1,value='',choices=[' ','A','Q'],
     3252                style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3253            Qcheck.Bind(wx.EVT_COMBOBOX,OnOrienRef)
     3254            Qcheck.SetValue(RBObj['Orient'][1])
     3255            topSizer.Add(Qcheck)
     3256            vecrbSizer.Add(topSizer)
     3257            return vecrbSizer               
    31153258       
    31163259        G2frame.dataFrame.SetStatusText('')
     
    31263269            for RBObj in data['RBModels']['Residue']:
    31273270                mainSizer.Add(ResrbSizer(RBObj))
     3271        if 'Vector' in data['RBModels']:
     3272            mainSizer.Add((5,5),0)
     3273            mainSizer.Add(wx.StaticText(RigidBodies,-1,'Vector rigid bodies:'),0,wx.ALIGN_CENTER_VERTICAL)
     3274            mainSizer.Add((5,5),0)
     3275            for RBObj in data['RBModels']['Vector']:
     3276                mainSizer.Add(VecrbSizer(RBObj))
    31283277
    31293278        RigidBodies.SetSizer(mainSizer)
     
    31393288    def OnRBAssign(event):
    31403289       
    3141         rbData = G2frame.PatternTree.GetItemPyData(   
     3290        RBData = G2frame.PatternTree.GetItemPyData(   
    31423291            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))
    31433292        rbNames = {}
    3144         for rbVec in rbData['Vector']:
     3293        for rbVec in RBData['Vector']:
    31453294            if rbVec != 'AtInfo':
    3146                 rbNames[rbData['Vector'][rbVec]['RBname']] =['Vector',rbVec]
    3147         for rbRes in rbData['Residue']:
     3295                rbNames[RBData['Vector'][rbVec]['RBname']] =['Vector',rbVec]
     3296        for rbRes in RBData['Residue']:
    31483297            if rbRes != 'AtInfo':
    3149                 rbNames[rbData['Residue'][rbRes]['RBname']] = ['Residue',rbRes]
     3298                rbNames[RBData['Residue'][rbRes]['RBname']] = ['Residue',rbRes]
    31503299        if not rbNames:
    31513300            print '**** ERROR - no rigid bodies defined ****'
     
    31623311           
    31633312            def OnOk(event):
    3164                 #more stuff here substituting rigid body for atoms
     3313                rbType = data['testRBObj']['rbType']
     3314                RBObjs = data['RBModels'].get(rbType,[])
     3315                rbObj = data['testRBObj']['rbObj']
     3316                rbId = rbObj['RBId']
     3317                newXYZ = G2mth.UpdateRBAtoms(Bmat,rbObj,RBData,rbType)
     3318                Ids = []
     3319                oldXYZ = G2mth.getAtomXYZ(atomData,cx)
     3320                for xyz in newXYZ:
     3321                    dist = G2mth.GetXYZDist(xyz,oldXYZ,Amat)
     3322                    id = np.argmin(dist)
     3323                    Ids.append(atomData[id][-1])
     3324                    atomData[id][cx:cx+3] = xyz
     3325                rbObj['Ids'] = Ids
     3326                rbObj['ThermalMotion'] = ['None',[],[]] #type,values,flags
     3327                RBObjs.append(rbObj)
     3328                data['RBModels'][rbType] = RBObjs
     3329                RBData[rbType][rbId]['useCount'] += 1
    31653330                del data['testRBObj']
     3331                G2plt.PlotStructure(G2frame,data)
    31663332                FillRigidBodyGrid(True)
    31673333               
     
    31733339                selection = rbSel.GetValue()
    31743340                rbType,rbId = rbNames[selection]
    3175                 data['testRBObj']['rbAtTypes'] = rbData[rbType][rbId]['rbTypes']
    3176                 data['testRBObj']['AtInfo'] = rbData[rbType]['AtInfo']
     3341                data['testRBObj']['rbAtTypes'] = RBData[rbType][rbId]['rbTypes']
     3342                data['testRBObj']['AtInfo'] = RBData[rbType]['AtInfo']
    31773343                data['testRBObj']['rbType'] = rbType
    3178                 data['testRBObj']['rbData'] = rbData
     3344                data['testRBObj']['rbData'] = RBData
    31793345                data['testRBObj']['Sizers'] = {}
    3180                 rbRef = rbData[rbType][rbId]['rbRef']
     3346                rbRef = RBData[rbType][rbId]['rbRef']
    31813347                data['testRBObj']['rbRef'] = rbRef
    31823348                refType = []
     
    31863352                    refType.append(reftype)
    31873353                    refName.append(reftype+' '+str(rbRef[0]))
     3354                atNames,AtNames = fillAtNames(refType,atomData,ct)
     3355                data['testRBObj']['atNames'] = atNames
     3356                data['testRBObj']['AtNames'] = AtNames
     3357                data['testRBObj']['rbObj'] = {'Orig':[[0,0,0],False],
     3358                    'Orient':[[0,0,0,1.],' '],'Ids':[],'RBId':rbId,'Torsions':[],
     3359                    'numChain':'','RBname':RBData[rbType][rbId]['RBname']}
     3360                data['testRBObj']['torAtms'] = []               
     3361                for item in RBData[rbType][rbId].get('rbSeq',[]):
     3362                    data['testRBObj']['rbObj']['Torsions'].append([item[2],False])
     3363                    data['testRBObj']['torAtms'].append([-1,-1,-1])
     3364                Draw()
     3365               
     3366            def fillAtNames(refType,atomData,ct):
    31883367                atNames = [{},{},{}]
    31893368                AtNames = {}
     
    31933372                        if atom[ct] == reftype:
    31943373                            atNames[i][atom[ct-1]] = iatm
    3195                 data['testRBObj']['atNames'] = atNames
    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                 data['testRBObj']['torAtms'] = []               
    3200                 for item in rbData[rbType][rbId].get('rbSeq',[]):
    3201                     data['testRBObj']['rbObj']['Torsions'].append([item[2],False])
    3202                     data['testRBObj']['torAtms'].append([-1,-1,-1])
    3203                 Draw()
     3374                return atNames,AtNames
    32043375               
    32053376            def OnOrigX(event):
     
    32383409                    rbId = rbObj['RBId']
    32393410                    rbRef = data['testRBObj']['rbRef']
    3240                     rbXYZ = -rbData[rbType][rbId]['rbXYZ']
     3411                    rbXYZ = -RBData[rbType][rbId]['rbXYZ']
    32413412                    nref = atNames[item][atName]
    32423413                    Oxyz = np.inner(Bmat,np.array(rbXYZ[rbRef[0]]))
     
    32563427                rbId = rbObj['RBId']
    32573428                rbRef = data['testRBObj']['rbRef']
    3258                 rbXYZ = rbData[rbType][rbId]['rbXYZ']
     3429                rbXYZ = RBData[rbType][rbId]['rbXYZ']
    32593430                rbOrig = rbXYZ[rbRef[0]]
    32603431                VAR = rbXYZ[rbRef[1]]-rbOrig
     
    32813452            def OnTorAngle(event):
    32823453                Obj = event.GetEventObject()
    3283                 tor = Indx[Obj.GetId()]
     3454                [tor,torSlide] = Indx[Obj.GetId()]
    32843455                Tors = data['testRBObj']['rbObj']['Torsions'][tor]
    32853456                try:
    3286                     value = Obj.GetValue()
     3457                    value = float(Obj.GetValue())
    32873458                except ValueError:
    32883459                    value = Tors[0]
    32893460                Tors[0] = value
    32903461                Obj.SetValue('%8.3f'%(value))
     3462                torSlide.SetValue(int(value*10))
    32913463                G2plt.PlotStructure(G2frame,data)
    3292 
    3293             def OnTorAtPick(event):
     3464               
     3465            def OnTorSlide(event):
    32943466                Obj = event.GetEventObject()
    3295                 tor,ind = Indx[Obj.GetId()]
    3296                 atName = Obj.GetValue()
    3297                 data['testRBObj']['torAtms'][tor][ind] = AtNames[atName]
    3298                 if all([i > -1 for i in data['testRBObj']['torAtms'][tor]]):
    3299                     rbObj = data['testRBObj']['rbObj']
    3300                     rbId = rbObj['RBId']
    3301                     rbXYZ = rbData['Residue'][rbId]['rbXYZ']
    3302                     Oatm,Patm,Ratm = data['testRBObj']['torAtms'][tor]
    3303                     Seq = rbData['Residue'][rbId]['rbSeq'][tor]
    3304                     Tors = data['testRBObj']['rbObj']['Torsions'][tor]
    3305                     VBR = rbXYZ[Oatm]-rbXYZ[Patm]
    3306                     VAR = rbXYZ[Ratm]-rbXYZ[Patm]
    3307                     VAC = np.inner(Amat,atomData[Seq[3][0]][cx:cx+3])-np.inner(Amat,atomData[Seq[1]][cx:cx+3])
    3308                     QuatA,D = G2mth.makeQuat(VAR,VAC,VBR)
    3309                     angle = 180.*D/np.pi
    3310                     Tors[0] = angle
     3467                tor,ang = Indx[Obj.GetId()]
     3468                Tors = data['testRBObj']['rbObj']['Torsions'][tor]
     3469                val = float(Obj.GetValue())/10.
     3470                Tors[0] = val
     3471                ang.SetValue('%8.3f'%(val))
    33113472                G2plt.PlotStructure(G2frame,data)
    3312                 Draw()
    33133473
    33143474            if len(data['testRBObj']):
     
    33183478            mainSizer = wx.BoxSizer(wx.VERTICAL)
    33193479            mainSizer.Add((5,5),0)
    3320             mainSizer.Add(wx.StaticText(RigidBodies,-1,'Assign rigid body:'),0,wx.ALIGN_CENTER_VERTICAL)
    3321             mainSizer.Add((5,5),0)
    33223480            if data['testRBObj']:
    33233481                Xsizers = []
     
    33253483                OriSizer = wx.FlexGridSizer(1,6,5,5)
    33263484                rbObj = data['testRBObj']['rbObj']
     3485                rbName = rbObj['RBname']
    33273486                rbId = rbObj['RBId']
    33283487                Orig = rbObj['Orig'][0]
     
    33343493                    refName.append(data['testRBObj']['rbAtTypes'][ref]+str(ref))
    33353494                atNames = data['testRBObj']['atNames']
     3495                mainSizer.Add(wx.StaticText(RigidBodies,-1,'Locate rigid body : '+rbName),
     3496                    0,wx.ALIGN_CENTER_VERTICAL)
     3497                mainSizer.Add((5,5),0)
    33363498                OriSizer.Add(wx.StaticText(RigidBodies,-1,'Origin x,y,z: '),0,wx.ALIGN_CENTER_VERTICAL)
    33373499                for ix,x in enumerate(Orig):
     
    33433505                    Xsizers.append(origX)
    33443506                if len(atomData):
     3507                    choice = atNames[0].keys()
     3508                    choice.sort()
    33453509                    OriSizer.Add(wx.StaticText(RigidBodies,-1,'Select match to '+refName[0]+': '),0,wx.ALIGN_CENTER_VERTICAL)               
    33463510                    atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[0]][ct-1],
    3347                         choices=atNames[0].keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3511                        choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
    33483512                    atPick.Bind(wx.EVT_COMBOBOX, OnAtOrigPick)
    33493513                    Indx[atPick.GetId()] = 0
     
    33663530                    OriSizer.Add(wx.StaticText(RigidBodies,-1,'Orientation setting: '),0,wx.ALIGN_CENTER_VERTICAL)
    33673531                    for i in [1,2]:
     3532                        choice = atNames[i].keys()
     3533                        choice.sort()
    33683534                        OriSizer.Add(wx.StaticText(RigidBodies,-1,'Select match to '+refName[i]+': '),0,wx.ALIGN_CENTER_VERTICAL)
    33693535                        atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[i]][ct-1],
    3370                             choices=atNames[i].keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3536                            choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
    33713537                        atPick.Bind(wx.EVT_COMBOBOX, OnAtQPick)
    33723538                        Indx[atPick.GetId()] = i
     
    33743540                mainSizer.Add(OriSizer)
    33753541                mainSizer.Add((5,5),0)
    3376                 if Torsions:
     3542                if Torsions:                   
    33773543                    AtNames = data['testRBObj']['AtNames']
    33783544                    rbAtTypes = data['testRBObj']['rbAtTypes']
    3379                     TorSizer = wx.FlexGridSizer(1,9,5,5)
    3380                     TorAtms = data['testRBObj']['torAtms']
    3381                     rbSeq = rbData['Residue'][rbId]['rbSeq']
     3545                    rbSeq = RBData['Residue'][rbId]['rbSeq']
     3546                    TorSizer = wx.FlexGridSizer(1,4)
     3547                    TorSizer.AddGrowableCol(1,1)
    33823548                    for t,[torsion,seq] in enumerate(zip(Torsions,rbSeq)):
    3383                         torName = []
     3549                        torName = ''
    33843550                        for item in [seq[0],seq[1],seq[3][0]]:
    3385                             torName.append(data['testRBObj']['rbAtTypes'][item]+str(item))
    3386                         TorSizer.Add(wx.StaticText(RigidBodies,-1,'Side chain torsion: Select match to:'),0,wx.ALIGN_CENTER_VERTICAL)
    3387                         for i,item in enumerate([seq[0],seq[1],seq[3][0]]):
    3388                             atChoice = []
    3389                             for at in AtNames.keys():
    3390                                 if rbAtTypes[item] in at:
    3391                                     atChoice.append(at)
    3392                             Value = ''
    3393                             if TorAtms[t][i] > -1:
    3394                                 Value = atomData[TorAtms[t][i]][ct-1]
    3395                             TorSizer.Add(wx.StaticText(RigidBodies,-1,torName[i]),0,wx.ALIGN_CENTER_VERTICAL)
    3396                             torPick = wx.ComboBox(RigidBodies,-1,value=Value,
    3397                                 choices=atChoice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3398                             torPick.Bind(wx.EVT_COMBOBOX,OnTorAtPick)
    3399                             Indx[torPick.GetId()] = [t,i]
    3400                             TorSizer.Add(torPick,0,wx.ALIGN_CENTER_VERTICAL)
     3551                            torName += data['testRBObj']['rbAtTypes'][item]+str(item)+' '
     3552                        TorSizer.Add(wx.StaticText(RigidBodies,-1,'Side chain torsion for rb seq: '+torName),0,wx.ALIGN_CENTER_VERTICAL)
     3553                        torSlide = wx.Slider(RigidBodies,style=wx.SL_HORIZONTAL)
     3554                        torSlide.SetRange(0,3600)
     3555                        torSlide.SetValue(int(torsion[0]*10.))
     3556                        torSlide.Bind(wx.EVT_SLIDER, OnTorSlide)
     3557                        TorSizer.Add(torSlide,1,wx.EXPAND|wx.RIGHT)
    34013558                        TorSizer.Add(wx.StaticText(RigidBodies,-1,' Angle: '),0,wx.ALIGN_CENTER_VERTICAL)
    34023559                        ang = wx.TextCtrl(RigidBodies,-1,value='%8.3f'%(torsion[0]),style=wx.TE_PROCESS_ENTER)
    34033560                        ang.Bind(wx.EVT_TEXT_ENTER,OnTorAngle)
    34043561                        ang.Bind(wx.EVT_KILL_FOCUS,OnTorAngle)
    3405                         Indx[ang.GetId()] = t
    3406                         TorSizer.Add(ang,0,wx.ALIGN_CENTER_VERTICAL)
    3407                            
    3408                     mainSizer.Add(TorSizer)
     3562                        Indx[torSlide.GetId()] = [t,ang]
     3563                        Indx[ang.GetId()] = [t,torSlide]
     3564                        TorSizer.Add(ang,0,wx.ALIGN_CENTER_VERTICAL)                           
     3565                    mainSizer.Add(TorSizer,1,wx.EXPAND|wx.RIGHT)
    34093566                else:
    34103567                    mainSizer.Add(wx.StaticText(RigidBodies,-1,'No side chain torsions'),0,wx.ALIGN_CENTER_VERTICAL)
    34113568            else:
     3569                mainSizer.Add(wx.StaticText(RigidBodies,-1,'Assign rigid body:'),0,wx.ALIGN_CENTER_VERTICAL)
     3570                mainSizer.Add((5,5),0)
    34123571                topSizer = wx.BoxSizer(wx.HORIZONTAL)
    34133572                topSizer.Add(wx.StaticText(RigidBodies,-1,'Select rigid body model'),0,wx.ALIGN_CENTER_VERTICAL)
     
    34413600    def OnAutoFindResRB(event):
    34423601        RBData = G2frame.PatternTree.GetItemPyData(   
    3443             G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))['Residue']
    3444         rbKeys = RBData.keys()
     3602            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))
     3603        rbKeys = RBData['Residue'].keys()
    34453604        rbKeys.remove('AtInfo')
    34463605        if not len(rbKeys):
    34473606            print '**** ERROR - no residue rigid bodies are defined ****'
    34483607            return
    3449         RBNames = [RBData[k]['RBname'] for k in rbKeys]
     3608        RBNames = [RBData['Residue'][k]['RBname'] for k in rbKeys]
    34503609        RBIds = dict(zip(RBNames,rbKeys))
    34513610        general = data['General']
     
    34713630                    iatm += 1
    34723631                    continue        #skip for OXT, water molecules, etc.
    3473                 rbRes = RBData[RBIds[res]]
     3632                rbRes = RBData['Residue'][RBIds[res]]
    34743633                rbRef = rbRes['rbRef']
    34753634                VAR = rbRes['rbXYZ'][rbRef[1]]-rbRes['rbXYZ'][rbRef[0]]
     
    35123671                    for ride in Riders:
    35133672                        SXYZ[ride] = G2mth.prodQVQ(QuatA,SXYZ[ride]-SXYZ[Patm])+SXYZ[Patm]
    3514                 RBData[RBIds[res]]['useCount'] += 1
     3673                RBData['Residue'][RBIds[res]]['useCount'] += 1
    35153674                RBObjs.append(rbObj)
    35163675            data['RBModels']['Residue'] = RBObjs
    35173676            for RBObj in RBObjs:
    3518                 newXYZ = G2mth.UpdateResRBAtoms(Bmat,RBObj,RBData)
     3677                newXYZ = G2mth.UpdateResRBAtoms(Bmat,RBObj,RBData['Residue'])
    35193678                for i,id in enumerate(RBObj['Ids']):
    35203679                    data['Atoms'][AtLookUp[id]][cx:cx+3] = newXYZ[i]
  • trunk/GSASIIplot.py

    r854 r855  
    26112611        if len(mapPeaks):
    26122612            peakMax = np.max(mapPeaks.T[0])
     2613    resRBData = data['RBModels'].get('Residue',[])
     2614    vecRBData = data['RBModels'].get('Vector',[])
     2615    rbAtmDict = {}
     2616    for rbObj in resRBData+vecRBData:
     2617        exclList = ['X' for i in range(len(rbObj['Ids']))]
     2618        rbAtmDict.update(dict(zip(rbObj['Ids'],exclList)))
    26132619    testRBObj = data.get('testRBObj',{})
    26142620    rbObj = testRBObj.get('rbObj',{})
     
    33603366                atNum = -1
    33613367            CL = atom[cs+2]
    3362             color = np.array(CL)/255.
     3368            atColor = np.array(CL)/255.
     3369            if drawingData['showRigidBodies'] and atom[ci] in rbAtmDict:
     3370                bndColor = Or
     3371            else:
     3372                bndColor = atColor
    33633373            if iat in Ind and G2frame.dataDisplay.GetPageText(getSelection()) != 'Map peaks':
    3364                 color = np.array(Gr)/255.
     3374                atColor = np.array(Gr)/255.
    33653375#            color += [.25,]
    33663376            radius = 0.5
     
    33883398                    else:
    33893399                        radius = ballScale*generalData['BondRadii'][atNum]
    3390                 RenderSphere(x,y,z,radius,color)
     3400                RenderSphere(x,y,z,radius,atColor)
    33913401                if 'sticks' in atom[cs]:
    3392                     RenderBonds(x,y,z,Bonds,bondR,color)
     3402                    RenderBonds(x,y,z,Bonds,bondR,bndColor)
    33933403            elif 'ellipsoids' in atom[cs]:
    3394                 RenderBonds(x,y,z,Bonds,bondR,color)
     3404                RenderBonds(x,y,z,Bonds,bondR,bndColor)
    33953405                if atom[cs+3] == 'A':                   
    33963406                    Uij = atom[cs+5:cs+11]
     
    34033413                        pass
    34043414                    else:
    3405                         RenderEllipsoid(x,y,z,ellipseProb,E,R4,color)                   
     3415                        RenderEllipsoid(x,y,z,ellipseProb,E,R4,atColor)                   
    34063416                else:
    34073417                    if atom[ct] == 'H' and not drawingData['showHydrogen']:
     
    34093419                    else:
    34103420                        radius = ellipseProb*math.sqrt(abs(atom[cs+4]))
    3411                         RenderSphere(x,y,z,radius,color)
     3421                        RenderSphere(x,y,z,radius,atColor)
    34123422            elif 'lines' in atom[cs]:
    34133423                radius = 0.1
    3414                 RenderLines(x,y,z,Bonds,color)
     3424                RenderLines(x,y,z,Bonds,bndColor)
    34153425#                RenderBonds(x,y,z,Bonds,0.05,color,6)
    34163426            elif atom[cs] == 'sticks':
    34173427                radius = 0.1
    3418                 RenderBonds(x,y,z,Bonds,bondR,color)
     3428                RenderBonds(x,y,z,Bonds,bondR,bndColor)
    34193429            elif atom[cs] == 'polyhedra':
    3420                 RenderPolyhedra(x,y,z,Faces,color)
     3430                RenderPolyhedra(x,y,z,Faces,atColor)
    34213431            elif atom[cs] == 'backbone':
    34223432                if atom[ct-1].split()[0] in ['C','N']:
     
    34243434                        Backbones[atom[2]] = []
    34253435                    Backbones[atom[2]].append(list(np.inner(Amat,np.array([x,y,z]))))
    3426                     BackboneColor.append(list(color))
     3436                    BackboneColor.append(list(atColor))
    34273437                   
    34283438            if atom[cs+1] == 'type':
Note: See TracChangeset for help on using the changeset viewer.