Changeset 859


Ignore:
Timestamp:
Feb 28, 2013 12:59:31 PM (9 years ago)
Author:
vondreele
Message:

still more rigid body fixes
add thermal motion models
allow copy of RB parms
import of rb models from gpx files
seq refinement results fixes

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r855 r859  
    625625    '''
    626626    if not data:
    627         data.update({'Vector':{'AtInfo':{}},'Residue':{'AtInfo':{}},'Z-matrix':{'AtInfo':{}}})       #empty dict - fill it
     627        data.update({'Vector':{'AtInfo':{}},'Residue':{'AtInfo':{}}})       #empty dict - fill it
    628628           
    629629    global resList
     
    725725            AtInfo['C'] = [Info['Drad'],Info['Color']]
    726726            data['Vector'][rbId] = {'RBname':'UNKRB','VectMag':vecMag,'rbXYZ':np.zeros((nAtoms,3)),
    727                 'VectRef':vecRef,'rbTypes':rbTypes,'rbVect':vecVal,'useCount':0}
     727                'rbRef':[0,1,2,False],'VectRef':vecRef,'rbTypes':rbTypes,'rbVect':vecVal,'useCount':0}
    728728        dlg.Destroy()
    729729        UpdateVectorRB()
     
    10021002                except ValueError:
    10031003                    pass
    1004                 Obj.SetValue('%8.3f'%(val))
     1004                Obj.SetValue('%8.4f'%(val))
    10051005                wx.CallAfter(UpdateVectorRB,VectorRB.GetScrollPos(wx.VERTICAL))
    10061006                G2plt.PlotRigidBody(G2frame,'Vector',AtInfo,data['Vector'][rbId],plotDefaults)
     
    10141014            magSizer.Add(wx.StaticText(VectorRBDisplay,-1,'Translation magnitude: '),
    10151015                0,wx.ALIGN_CENTER_VERTICAL)
    1016             magValue = wx.TextCtrl(VectorRBDisplay,-1,'%8.3f'%(rbData['VectMag'][imag]))
     1016            magValue = wx.TextCtrl(VectorRBDisplay,-1,'%8.4f'%(rbData['VectMag'][imag]))
    10171017            Indx[magValue.GetId()] = [rbId,imag]
    10181018            magValue.Bind(wx.EVT_TEXT_ENTER,OnRBVectorMag)
     
    10301030
    10311031            def TypeSelect(event):
     1032                Obj = event.GetEventObject()
    10321033                AtInfo = data['Vector']['AtInfo']
    10331034                r,c = event.GetRow(),event.GetCol()
     
    10461047
    10471048            def ChangeCell(event):
     1049                Obj = event.GetEventObject()
    10481050                r,c =  event.GetRow(),event.GetCol()
    10491051                if r >= 0 and (0 <= c < 3):
     
    11181120        VectorRBDisplay.SetSize(Size)
    11191121        VectorRB.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
    1120         VectorRB.SetScrollPos(wx.VERTICAL,Scroll)
     1122        VectorRB.Scroll(0,Scroll)
    11211123        Size[1] = min(Size[1],450)
    11221124        G2frame.dataFrame.setSizePosLeft(Size)
  • trunk/GSASIIgrid.py

    r855 r859  
    112112
    113113[ wxID_RIGIDBODYADD,wxID_DRAWDEFINERB,wxID_RIGIDBODYIMPORT,wxID_RESIDUETORSSEQ,
    114     wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE,wxID_RBREMOVEALL,
    115 ] = [wx.NewId() for item in range(7)]
     114    wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE,wxID_RBREMOVEALL,wxID_COPYRBPARMS,
     115] = [wx.NewId() for item in range(8)]
    116116
    117117[ wxID_SAVESEQSEL,
     
    12601260        self.RigidBodiesEdit.Append(id=wxID_AUTOFINDRESRB, kind=wx.ITEM_NORMAL,text='Auto find residues',
    12611261            help='Auto find of residue RBs in macromolecule')
     1262        self.RigidBodiesEdit.Append(id=wxID_COPYRBPARMS, kind=wx.ITEM_NORMAL,text='Copy rigid body parms',
     1263            help='Copy rigid body location & TLS parameters')
    12621264        self.RigidBodiesEdit.Append(id=wxID_GLOBALRESREFINE, kind=wx.ITEM_NORMAL,text='Global residue refine',
    12631265            help='Global setting of residue RB refinement flags')
     
    17051707        data - dictionary
    17061708            'histNames' - list of histogram names in order as processed by Sequential Refinement
    1707             'varyList' - list of variables - identical over all refinements insequence
     1709            'varyList' - list of variables - identical over all refinements in sequence
    17081710            'histName' - dictionaries for all data sets processed:
    17091711                'variables'- result[0] from leastsq call
     
    17451747            sigList = data[name]['sig']
    17461748            if colLabels[parm] in atomList:
    1747                 sigData.append(sigList[colLabels.index(atomList[colLabels[parm]])])
     1749                sigData.append(sigList[colLabels.index(atomList[colLabels[parm]])-1])
    17481750            elif colLabels[parm] in cellList:
    1749                 sigData.append(sigList[colLabels.index(cellList[colLabels[parm]])])
     1751                sigData.append(sigList[colLabels.index(cellList[colLabels[parm]])-1])
    17501752            else:
    1751                 sigData.append(sigList[parm])
     1753                sigData.append(sigList[parm-1])
    17521754        return sigData
    17531755   
     
    17611763            for col in cols:
    17621764                plotData.append(G2frame.SeqTable.GetColValues(col))
    1763                 plotSig.append(GetSigData(col))
     1765                if col:     #not Rwp
     1766                    plotSig.append(GetSigData(col))
     1767                else:
     1768                    plotSig.append(0.0)
    17641769                plotNames.append(G2frame.SeqTable.GetColLabelValue(col))
    17651770            plotData = np.array(plotData)
    17661771            G2plt.PlotSeq(G2frame,plotData,plotSig,plotNames,sampleParms)
    17671772        elif rows:
    1768             name = histNames[rows[0]]
    1769             G2plt.PlotCovariance(G2frame,Data=data[name])
     1773            name = histNames[rows[0]]       #only does 1st one selected
     1774            G2plt.PlotCovariance(G2frame,data[name])
    17701775           
    17711776    def OnSaveSelSeq(event):       
     
    17781783            for col in cols:
    17791784                dataNames.append(G2frame.SeqTable.GetColLabelValue(col))
    1780                 saveData.append(zip(G2frame.SeqTable.GetColValues(col),GetSigData(col)))
     1785                if col:     #not Rwp
     1786                    saveData.append(zip(G2frame.SeqTable.GetColValues(col),GetSigData(col)))
     1787                else:
     1788                    saveData.append(zip(G2frame.SeqTable.GetColValues(col),0.0))
    17811789            lenName = len(saveNames[0])
    17821790            saveData = np.swapaxes(np.array(saveData),0,1)
     
    18061814    if G2frame.dataDisplay:
    18071815        G2frame.dataDisplay.Destroy()
     1816    atomList = {}
     1817    newAtomDict = data[histNames[0]]['newAtomDict']
     1818    for item in newAtomDict:
     1819        if item in data['varyList']:
     1820            atomList[newAtomDict[item][0]] = item
    18081821    cellList = {}
    18091822    newCellDict = data[histNames[0]]['newCellDict']
     
    18111824        if item in data['varyList']:
    18121825            cellList[newCellDict[item][0]] = item
    1813     atomList = {}
    1814     newAtomDict = data[histNames[0]]['newAtomDict']
    1815     for item in newAtomDict:
    1816         if item in data['varyList']:
    1817             atomList[newAtomDict[item][0]] = item
    18181826    sampleParms = GetSampleParms()
    18191827    Rwps = GetRwps()
     
    18241832    colLabels = ['Rwp',]+data['varyList']+atomList.keys()+cellList.keys()
    18251833    Types = (len(data['varyList']+atomList.keys()+cellList.keys())+1)*[wg.GRID_VALUE_FLOAT,]
    1826     seqList = [[Rwps[i],]+list(data[name]['variables']) for i,name in enumerate(histNames)]   
     1834    seqList = [[Rwps[i],]+list(data[name]['variables']) for i,name in enumerate(histNames)]
    18271835    for i,item in enumerate(seqList):
    18281836        newAtomDict = data[histNames[i]]['newAtomDict']
     
    20692077            wx.TextCtrl(parent=G2frame.dataFrame,size=G2frame.dataFrame.GetClientSize(),
    20702078                value='See plot window for covariance display'+text,style=wx.TE_MULTILINE)
    2071             G2plt.PlotCovariance(G2frame)
     2079            G2plt.PlotCovariance(G2frame,data)
    20722080        elif G2frame.PatternTree.GetItemText(item) == 'Constraints':
    20732081            data = G2frame.PatternTree.GetItemPyData(item)
  • trunk/GSASIImath.py

    r855 r859  
    197197        XYZ.append([parmDict[name]+parmDict[dname] for name,dname in zip(names,dnames)])
    198198    return XYZ
     199
     200def AtomUij2TLS(atomData,atPtrs,Amat,Bmat,rbObj):
     201    for atom in atomData:
     202        XYZ = np.inner(Amat,atom[cx:cx+3])
     203        if atom[cia] == 'A':
     204            UIJ = atom[cia+2:cia+8]
     205       
     206def AtomTLS2UIJ(atomData,atPtrs,Amat,rbObj):
     207    cx,ct,cs,cia = atPtrs
     208    TLStype,TLS = rbObj['ThermalMotion'][:2]
     209    Tmat = np.zeros((3,3))
     210    Lmat = np.zeros((3,3))
     211    Smat = np.zeros((3,3))
     212    G,g = G2lat.A2Gmat(Amat)
     213    gvec = 1./np.sqrt(np.array([g[0][0],g[1][1],g[2][2],g[0][1],g[0][2],g[1][2]]))
     214    if 'T' in TLStype:
     215        Tmat = G2lat.U6toUij(TLS[:6])
     216    if 'L' in TLStype:
     217        Lmat = G2lat.U6toUij(TLS[6:12])
     218    if 'S' in TLStype:
     219        Smat = np.array([[TLS[18],TLS[12],S[13]],[TLS[14],TLS[19],TLS[15]],[TLS[16],TLS[17],0]])
     220    for atom in atomData:
     221        XYZ = np.inner(Amat,atom[cx:cx+3])
     222        Axyz = np.array([0,XYZ[2],-XYZ[1]],[-XYZ[2],0,XYZ[0]],[XYZ[1],-XYZ[0],0])
     223        if 'U' in TSLtype:
     224            atom[cia+1] = TLS[0]
     225            atom[cia] = 'I'
     226        else:
     227            atom[cia] = 'A'
     228            Umat = Tmat+np.inner(Axyz,Smat)+np.inner(Smat.T,Axyz.T)+np.inner(np.inner(Axyz,Lmat),Axyz.T)
     229            beta = np.inner(np.inner(g,Umat),g)
     230            atom[cia+2:cia+8] = beta/gvec
    199231
    200232def GetXYZDist(xyz,XYZ,Amat):
     
    13251357   
    13261358def AV2Q(A,V):
    1327     ''' convert angle (radians -pi to pi) & vector to quaternion
     1359    ''' convert angle (radians) & vector to quaternion
    13281360        q=r+ai+bj+ck
    13291361    '''
     
    13331365        V /= d
    13341366    else:
    1335         return [1.,0.,0.,0.]    #identity
     1367        return [0.,0.,0.,1.]    #identity
    13361368    p = A/2.
    13371369    Q[0] = np.cos(p)
     
    13401372   
    13411373def AVdeg2Q(A,V):
    1342     ''' convert angle (degrees -180 to 180) & vector to quaternion
     1374    ''' convert angle (degrees) & vector to quaternion
    13431375        q=r+ai+bj+ck
    13441376    '''
     
    13531385    Q[1:4] = V*sind(p)
    13541386    return Q
    1355 
     1387   
     1388def Q2AVdeg(Q):
     1389    ''' convert quaternion to angle (degrees 0-360) & normalized vector
     1390        q=r+ai+bj+ck
     1391    '''
     1392    A = 2.*acosd(Q[0])
     1393    V = Q[1:]/nl.norm(Q[1:])
     1394    return A,V
     1395   
     1396def Q2AV(Q):
     1397    ''' convert quaternion to angle (radians 0-2pi) & normalized vector
     1398        q=r+ai+bj+ck
     1399    '''
     1400    A = 2.*np.arccos(Q[0])
     1401    V = Q[1:]/nl.norm(Q[1:])
     1402    return A,V
     1403   
    13561404def makeQuat(A,B,C):
    13571405    ''' Make quaternion from rotation of A vector to B vector about C axis
  • trunk/GSASIIphsGUI.py

    r857 r859  
    11851185        event.StopPropagation()
    11861186       
    1187     def OnRBAppend(event):
     1187    def OnRBAppend(event):          #unfinished!
    11881188        rbData = G2frame.PatternTree.GetItemPyData(   
    11891189            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies'))
     
    30493049################################################################################
    30503050
    3051     def FillRigidBodyGrid(refresh=False):
     3051    def FillRigidBodyGrid(refresh=True):
    30523052        if refresh:
    30533053            RigidBodies.DestroyChildren()
     
    30603060        Indx = {}
    30613061       
    3062         def ResrbSizer(RBObj):
     3062        def OnThermSel(event):       #needs to be seen by VecRbSizer!
     3063            Obj = event.GetEventObject()
     3064            RBObj = Indx[Obj.GetId()]
     3065            val = Obj.GetValue()
     3066            RBObj['ThermalMotion'] = ['None',[],[]]
     3067            if val == 'Uiso':
     3068                RBObj['ThermalMotion'] = ['Uiso',[0.01,],[False,]]
     3069            elif val == 'T':
     3070                RBObj['ThermalMotion'] = ['T',[0.0 for i in range(6)],[False for i in range(6)]]
     3071            elif val == 'TL':
     3072                RBObj['ThermalMotion'] = ['TL',[0.0 for i in range(12)],[False for i in range(12)]]
     3073            elif val == 'TLS':
     3074                RBObj['ThermalMotion'] = ['TLS',[0.0 for i in range(20)],[False for i in range(20)]] #SAA = S33-S11 & SBB = S22-S33
     3075            wx.CallAfter(FillRigidBodyGrid,True)
     3076           
     3077        def ThermDataSizer(RBObj):       #needs to be seen by VecRbSizer!
     3078           
     3079            def OnThermval(event):
     3080                Obj = event.GetEventObject()
     3081                item = Indx[Obj.GetId()]
     3082                try:
     3083                    val = float(Obj.GetValue())
     3084                    RBObj['ThermalMotion'][1][item] = val
     3085                except ValueError:
     3086                    pass
     3087                Obj.SetValue('%8.4f'%(RBObj['ThermalMotion'][1][item]))
     3088                G2plt.PlotStructure(G2frame,data)
     3089               
     3090            def OnTLSRef(event):
     3091                Obj = event.GetEventObject()
     3092                item = Indx[Obj.GetId()]
     3093                RBObj['ThermalMotion'][2][item] = Obj.GetValue()
     3094           
     3095            thermSizer = wx.FlexGridSizer(1,9,5,5)
     3096            model = RBObj['ThermalMotion']
     3097            if model[0] == 'Uiso':
     3098                names = ['Uiso',]
     3099            elif 'T' in model[0]:
     3100                names = ['T11','T22','T33','T12','T13','T23']
     3101            if 'L' in model[0]:
     3102                names += ['L11','L22','L33','L12','L13','L23']
     3103            if 'S' in model[0]:
     3104                names += ['S12','S13','S21','S23','S31','S32','SAA','SBB']
     3105            for i,name in enumerate(names):
     3106                thermSizer.Add(wx.StaticText(RigidBodies,-1,name+': '),0,wx.ALIGN_CENTER_VERTICAL)
     3107                thermVal = wx.TextCtrl(RigidBodies,-1,value='%8.4f'%(model[1][i]),
     3108                    style=wx.TE_PROCESS_ENTER)
     3109                thermVal.Bind(wx.EVT_TEXT_ENTER,OnThermval)
     3110                thermVal.Bind(wx.EVT_KILL_FOCUS,OnThermval)
     3111                Indx[thermVal.GetId()] = i
     3112                thermSizer.Add(thermVal)
     3113                Tcheck = wx.CheckBox(RigidBodies,-1,'Refine?')
     3114                Tcheck.Bind(wx.EVT_CHECKBOX,OnTLSRef)
     3115                Tcheck.SetValue(model[2][i])
     3116                Indx[Tcheck.GetId()] = i
     3117                thermSizer.Add(Tcheck,0,wx.ALIGN_CENTER_VERTICAL)
     3118            return thermSizer
     3119           
     3120        def LocationSizer(RBObj,rbType):
    30633121           
    30643122            def OnOrigRef(event):
     
    30673125            def OnOrienRef(event):
    30683126                RBObj['Orient'][1] = Qcheck.GetValue()
    3069                 Qcheck.Setvalue(RBObj['Orient'][1])
    3070                
     3127               
     3128            def OnOrigX(event):
     3129                Obj = event.GetEventObject()
     3130                item = Indx[Obj.GetId()]
     3131                try:
     3132                    val = float(Obj.GetValue())
     3133                    RBObj['Orig'][0][item] = val
     3134                    Obj.SetValue('%8.5f'%(val))
     3135                    newXYZ = G2mth.UpdateRBAtoms(Bmat,RBObj,RBData,rbType)
     3136                    for i,id in enumerate(RBObj['Ids']):
     3137                        data['Atoms'][AtLookUp[id]][cx:cx+3] = newXYZ[i]
     3138                    UpdateDrawAtoms()
     3139                    G2plt.PlotStructure(G2frame,data)
     3140                except ValueError:
     3141                    pass
     3142               
     3143            def OnOrien(event):
     3144                Obj = event.GetEventObject()
     3145                item = Indx[Obj.GetId()]
     3146                A,V = G2mth.Q2AVdeg(RBObj['Orient'][0])
     3147                V = np.inner(Bmat,V)
     3148                try:
     3149                    val = float(Obj.GetValue())
     3150                    if item:
     3151                        V[item-1] = val
     3152                    else:
     3153                        A = val
     3154                    Obj.SetValue('%8.5f'%(val))
     3155                    V = np.inner(Amat,V)
     3156                    Q = G2mth.AVdeg2Q(A,V)
     3157                    if not any(Q):
     3158                        raise ValueError
     3159                    RBObj['Orient'][0] = Q
     3160                    newXYZ = G2mth.UpdateRBAtoms(Bmat,RBObj,RBData,rbType)
     3161                    for i,id in enumerate(RBObj['Ids']):
     3162                        data['Atoms'][AtLookUp[id]][cx:cx+3] = newXYZ[i]
     3163                    UpdateDrawAtoms()
     3164                    G2plt.PlotStructure(G2frame,data)
     3165                except ValueError:
     3166                    pass
     3167               
     3168            topSizer = wx.FlexGridSizer(2,6,5,5)
     3169            Orig = RBObj['Orig'][0]
     3170            Orien,OrienV = G2mth.Q2AVdeg(RBObj['Orient'][0])
     3171            OrienV = np.inner(Bmat,OrienV)
     3172            Orien = [Orien,]
     3173            Orien.extend(OrienV/nl.norm(OrienV))
     3174            topSizer.Add(wx.StaticText(RigidBodies,-1,'Origin x,y,z:'),0,wx.ALIGN_CENTER_VERTICAL)
     3175            for ix,x in enumerate(Orig):
     3176                origX = wx.TextCtrl(RigidBodies,-1,value='%8.5f'%(x),style=wx.TE_PROCESS_ENTER)
     3177                origX.Bind(wx.EVT_TEXT_ENTER,OnOrigX)
     3178                origX.Bind(wx.EVT_KILL_FOCUS,OnOrigX)
     3179                Indx[origX.GetId()] = ix
     3180                topSizer.Add(origX,0,wx.ALIGN_CENTER_VERTICAL)
     3181            topSizer.Add((5,0),)
     3182            Ocheck = wx.CheckBox(RigidBodies,-1,'Refine?')
     3183            Ocheck.Bind(wx.EVT_CHECKBOX,OnOrigRef)
     3184            Ocheck.SetValue(RBObj['Orig'][1])
     3185            topSizer.Add(Ocheck,0,wx.ALIGN_CENTER_VERTICAL)
     3186            topSizer.Add(wx.StaticText(RigidBodies,-1,'Rotation angle, vector:'),0,wx.ALIGN_CENTER_VERTICAL)
     3187            for ix,x in enumerate(Orien):
     3188                orien = wx.TextCtrl(RigidBodies,-1,value='%8.4f'%(x),style=wx.TE_PROCESS_ENTER)
     3189                orien.Bind(wx.EVT_TEXT_ENTER,OnOrien)
     3190                orien.Bind(wx.EVT_KILL_FOCUS,OnOrien)
     3191                Indx[orien.GetId()] = ix
     3192                topSizer.Add(orien,0,wx.ALIGN_CENTER_VERTICAL)
     3193            Qcheck = wx.ComboBox(RigidBodies,-1,value='',choices=[' ','A','Q'],
     3194                style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3195            Qcheck.Bind(wx.EVT_COMBOBOX,OnOrienRef)
     3196            Qcheck.SetValue(RBObj['Orient'][1])
     3197            topSizer.Add(Qcheck)
     3198            return topSizer
     3199                         
     3200        def ResrbSizer(RBObj):
     3201           
    30713202            def OnTorsionRef(event):
    30723203                Obj = event.GetEventObject()
     
    31023233                wx.CallAfter(FillRigidBodyGrid,True)
    31033234               
    3104             def OnThermSel(event):
    3105                 val = thermSel.GetValue()
    3106                 RBObj['ThermalMotion'] = ['None',[],[]]
    3107                 if val == 'Uiso':
    3108                     RBObj['ThermalMotion'] = ['Uiso',[0.01,],[False,]]
    3109                 elif val == 'T':
    3110                     RBObj['ThermalMotion'] = ['T',[0.0 for i in range(6)],[False for i in range(6)]]
    3111                 elif val == 'TL':
    3112                     RBObj['ThermalMotion'] = ['TL',[0.0 for i in range(12)],[False for i in range(12)]]
    3113                 elif val == 'TLS':
    3114                     RBObj['ThermalMotion'] = ['TLS',[0.0 for i in range(20)],[False for i in range(20)]] #SAA = S33-S11 & SBB = S22-S33
    3115                 wx.CallAfter(FillRigidBodyGrid,True)
    3116                
    3117             def ThermDataSizer():
    3118                
    3119                 def OnThermval(event):
    3120                     Obj = event.GetEventObject()
    3121                     item = Indx[Obj.GetId()]
    3122                     try:
    3123                         val = float(Obj.GetValue())
    3124                         RBObj['ThermalMotion'][1][item] = val
    3125                     except ValueError:
    3126                         pass
    3127                     Obj.SetValue('%8.4f'%(RBObj['ThermalMotion'][1][item]))
    3128                     G2plt.PlotStructure(G2frame,data)
    3129                    
    3130                 def OnTLSRef(event):
    3131                     Obj = event.GetEventObject()
    3132                     item = Indx[Obj.GetId()]
    3133                     RBObj['ThermalMotion'][2][item] = Obj.GetValue()
    3134                
    3135                 thermSizer = wx.FlexGridSizer(1,9,5,5)
    3136                 model = RBObj['ThermalMotion']
    3137                 if model[0] == 'Uiso':
    3138                     names = ['Uiso',]
    3139                 elif 'T' in model[0]:
    3140                     names = ['T11','T22','T33','T12','T13','T23']
    3141                 if 'L' in model[0]:
    3142                     names += ['L11','L22','L33','L12','L13','L23']
    3143                 if 'S' in model[0]:
    3144                     names += ['S12','S13','S21','S23','S31','S32','SAA','SBB']
    3145                 for i,name in enumerate(names):
    3146                     thermSizer.Add(wx.StaticText(RigidBodies,-1,name+': '),0,wx.ALIGN_CENTER_VERTICAL)
    3147                     thermVal = wx.TextCtrl(RigidBodies,-1,value='%8.4f'%(model[1][i]),
    3148                         style=wx.TE_PROCESS_ENTER)
    3149                     thermVal.Bind(wx.EVT_TEXT_ENTER,OnThermval)
    3150                     thermVal.Bind(wx.EVT_KILL_FOCUS,OnThermval)
    3151                     Indx[thermVal.GetId()] = i
    3152                     thermSizer.Add(thermVal)
    3153                     Tcheck = wx.CheckBox(RigidBodies,-1,'Refine?')
    3154                     Tcheck.Bind(wx.EVT_CHECKBOX,OnTLSRef)
    3155                     Tcheck.SetValue(model[2][i])
    3156                     Indx[Tcheck.GetId()] = i
    3157                     thermSizer.Add(Tcheck,0,wx.ALIGN_CENTER_VERTICAL)
    3158                 return thermSizer
    3159              
    31603235            resrbSizer = wx.BoxSizer(wx.VERTICAL)
    31613236            resrbSizer.Add(wx.StaticText(RigidBodies,-1,120*'-'))
     
    31693244            topLine.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
    31703245            resrbSizer.Add(topLine)
    3171             topSizer = wx.FlexGridSizer(2,2,5,5)
    3172             Orig = RBObj['Orig'][0]
    3173             Orien = RBObj['Orient'][0]
    3174             topSizer.Add(wx.StaticText(RigidBodies,-1,
    3175                 '%s %8.5f %8.5f %8.5f'%(       'Origin     :',Orig[0],Orig[1],Orig[2])))
    3176             Ocheck = wx.CheckBox(RigidBodies,-1,'Refine?')
    3177             Ocheck.Bind(wx.EVT_CHECKBOX,OnOrigRef)
    3178             Ocheck.SetValue(RBObj['Orig'][1])
    3179             topSizer.Add(Ocheck,0,wx.ALIGN_CENTER_VERTICAL)
    3180             topSizer.Add(wx.StaticText(RigidBodies,-1,
    3181                 '%s %8.5f %8.5f %8.5f %8.5f  Refine?'%('Orientation:',Orien[0], \
    3182                 Orien[1],Orien[2],Orien[3])),0,wx.ALIGN_CENTER_VERTICAL)
    3183             Qcheck = wx.ComboBox(RigidBodies,-1,value='',choices=[' ','A','Q'],
    3184                 style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3185             Qcheck.Bind(wx.EVT_COMBOBOX,OnOrienRef)
    3186             Qcheck.SetValue(RBObj['Orient'][1])
    3187             topSizer.Add(Qcheck)
    3188             resrbSizer.Add(topSizer)
     3246            resrbSizer.Add(LocationSizer(RBObj,'Residue'))
    31893247            resrbSizer.Add(wx.StaticText(RigidBodies,-1,'Torsions:'),0,wx.ALIGN_CENTER_VERTICAL)
    31903248            torSizer = wx.FlexGridSizer(1,6,5,5)
     
    32073265            thermSel = wx.ComboBox(RigidBodies,-1,value=RBObj['ThermalMotion'][0],choices=tchoice,
    32083266                style=wx.CB_READONLY|wx.CB_DROPDOWN)
     3267            Indx[thermSel.GetId()] = RBObj
    32093268            thermSel.Bind(wx.EVT_COMBOBOX,OnThermSel)
    32103269            thermSizer.Add(thermSel,0,wx.ALIGN_CENTER_VERTICAL)
    32113270            resrbSizer.Add(thermSizer)
    32123271            if RBObj['ThermalMotion'][0] != 'None':
    3213                 resrbSizer.Add(ThermDataSizer())
     3272                resrbSizer.Add(ThermDataSizer(RBObj))
    32143273            return resrbSizer
    32153274           
    32163275        def VecrbSizer(RBObj):
    32173276                 
    3218             def OnOrigRef(event):
    3219                 RBObj['Orig'][1] = Ocheck.GetValue()
    3220              
    3221             def OnOrienRef(event):
    3222                 RBObj['Orient'][1] = Qcheck.GetValue()
    3223                 Qcheck.Setvalue(RBObj['Orient'][1])
    3224                
    32253277            def OnDelVecRB(event):
    32263278                Obj = event.GetEventObject()
     
    32453297            topLine.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
    32463298            vecrbSizer.Add(topLine)
    3247             topSizer = wx.FlexGridSizer(2,2,5,5)
    3248             Orig = RBObj['Orig'][0]
    3249             Orien = RBObj['Orient'][0]
    3250             topSizer.Add(wx.StaticText(RigidBodies,-1,
    3251                 '%s %8.5f %8.5f %8.5f'%(       'Origin     :',Orig[0],Orig[1],Orig[2])))
    3252             Ocheck = wx.CheckBox(RigidBodies,-1,'Refine?')
    3253             Ocheck.Bind(wx.EVT_CHECKBOX,OnOrigRef)
    3254             Ocheck.SetValue(RBObj['Orig'][1])
    3255             topSizer.Add(Ocheck,0,wx.ALIGN_CENTER_VERTICAL)
    3256             topSizer.Add(wx.StaticText(RigidBodies,-1,
    3257                 '%s %8.5f %8.5f %8.5f %8.5f  Refine?'%('Orientation:',Orien[0], \
    3258                 Orien[1],Orien[2],Orien[3])),0,wx.ALIGN_CENTER_VERTICAL)
    3259             Qcheck = wx.ComboBox(RigidBodies,-1,value='',choices=[' ','A','Q'],
     3299            vecrbSizer.Add(LocationSizer(RBObj,'Vector'))
     3300            tchoice = ['None','Uiso','T','TL','TLS']
     3301            thermSizer = wx.BoxSizer(wx.HORIZONTAL)
     3302            thermSizer.Add(wx.StaticText(RigidBodies,-1,'Rigid body thermal motion model: '),0,wx.ALIGN_CENTER_VERTICAL)
     3303            thermSel = wx.ComboBox(RigidBodies,-1,value=RBObj['ThermalMotion'][0],choices=tchoice,
    32603304                style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3261             Qcheck.Bind(wx.EVT_COMBOBOX,OnOrienRef)
    3262             Qcheck.SetValue(RBObj['Orient'][1])
    3263             topSizer.Add(Qcheck)
    3264             vecrbSizer.Add(topSizer)
     3305            Indx[thermSel.GetId()] = RBObj
     3306            thermSel.Bind(wx.EVT_COMBOBOX,OnThermSel)
     3307            thermSizer.Add(thermSel,0,wx.ALIGN_CENTER_VERTICAL)
     3308            vecrbSizer.Add(thermSizer)
     3309            if RBObj['ThermalMotion'][0] != 'None':
     3310                vecrbSizer.Add(ThermDataSizer(RBObj))
    32653311            return vecrbSizer               
    32663312       
     
    32933339        Size[1] = min(Size[1],450)
    32943340        G2frame.dataFrame.setSizePosLeft(Size)
     3341       
     3342    def OnRBCopyParms(event):
     3343        RBObjs = []
     3344        for rbType in ['Vector','Residue']:           
     3345            RBObjs += data['RBModels'].get(rbType,[])
     3346        if not len(RBObjs):
     3347            print '**** ERROR - no rigid bodies defined ****'
     3348            return
     3349        if len(RBObjs) == 1:
     3350            print '**** INFO - only one rigid body defined; nothing to copy to ****'
     3351            return
     3352        Source = []
     3353        sourceRB = {}
     3354        for RBObj in RBObjs:
     3355            Source.append(RBObj['RBname'])
     3356        dlg = wx.SingleChoiceDialog(G2frame,'Select source','Copy rigid body parameters',Source)
     3357        if dlg.ShowModal() == wx.ID_OK:
     3358            sel = dlg.GetSelection()
     3359            name = Source[sel]
     3360            for item in ['Orig','Orient','ThermalMotion']:
     3361                sourceRB.update({item:RBObjs[sel][item],})
     3362        dlg.Destroy()
     3363        if not sourceRB:
     3364            return
     3365        dlg = wx.MultiChoiceDialog(G2frame,'Select targets','Copy rigid body parameters',Source)
     3366        if dlg.ShowModal() == wx.ID_OK:
     3367            sel = dlg.GetSelections()
     3368            for x in sel:
     3369                RBObjs[x].update(sourceRB)
     3370        G2plt.PlotStructure(G2frame,data)
     3371        wx.CallAfter(FillRigidBodyGrid(True))
    32953372               
    32963373    def OnRBAssign(event):
     
    33333410                rbObj['Ids'] = Ids
    33343411                rbObj['ThermalMotion'] = ['None',[],[]] #type,values,flags
     3412                rbObj['RBname'] += ':'+str(RBData[rbType][rbId]['useCount'])
    33353413                RBObjs.append(rbObj)
    33363414                data['RBModels'][rbType] = RBObjs
     
    34893567                Xsizers = []
    34903568                Osizers = []
    3491                 OriSizer = wx.FlexGridSizer(1,6,5,5)
    34923569                rbObj = data['testRBObj']['rbObj']
    34933570                rbName = rbObj['RBname']
     
    35043581                    0,wx.ALIGN_CENTER_VERTICAL)
    35053582                mainSizer.Add((5,5),0)
     3583                OriSizer = wx.FlexGridSizer(1,5,5,5)
    35063584                OriSizer.Add(wx.StaticText(RigidBodies,-1,'Origin x,y,z: '),0,wx.ALIGN_CENTER_VERTICAL)
    35073585                for ix,x in enumerate(Orig):
     
    35123590                    OriSizer.Add(origX,0,wx.ALIGN_CENTER_VERTICAL)
    35133591                    Xsizers.append(origX)
     3592                OriSizer.Add((5,0),)
    35143593                if len(atomData):
    35153594                    choice = atNames[0].keys()
    35163595                    choice.sort()
    3517                     OriSizer.Add(wx.StaticText(RigidBodies,-1,'Select match to '+refName[0]+': '),0,wx.ALIGN_CENTER_VERTICAL)               
    3518                     atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[0]][ct-1],
    3519                         choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3520                     atPick.Bind(wx.EVT_COMBOBOX, OnAtOrigPick)
    3521                     Indx[atPick.GetId()] = 0
    3522                     OriSizer.Add(atPick,0,wx.ALIGN_CENTER_VERTICAL)
    35233596                    data['testRBObj']['Sizers']['Xsizers'] = Xsizers
    3524                 else:
    3525                     OriSizer.Add((5,0),)
    3526                     OriSizer.Add((5,0),)                   
    35273597                OriSizer.Add(wx.StaticText(RigidBodies,-1,'Orientation quaternion: '),0,wx.ALIGN_CENTER_VERTICAL)
    35283598                for ix,x in enumerate(Orien):
     
    35343604                    Osizers.append(orien)
    35353605                data['testRBObj']['Sizers']['Osizers'] = Osizers
    3536                 OriSizer.Add((5,0),)
     3606                mainSizer.Add(OriSizer)
     3607                mainSizer.Add((5,5),0)
     3608                RefSizer = wx.FlexGridSizer(1,7,5,5)
    35373609                if len(atomData):
    3538                     OriSizer.Add(wx.StaticText(RigidBodies,-1,'Orientation setting: '),0,wx.ALIGN_CENTER_VERTICAL)
    3539                     for i in [1,2]:
     3610                    RefSizer.Add(wx.StaticText(RigidBodies,-1,'Location setting: Select match to'),0,wx.ALIGN_CENTER_VERTICAL)
     3611                    for i in [0,1,2]:
    35403612                        choice = atNames[i].keys()
    35413613                        choice.sort()
    3542                         OriSizer.Add(wx.StaticText(RigidBodies,-1,'Select match to '+refName[i]+': '),0,wx.ALIGN_CENTER_VERTICAL)
     3614                        RefSizer.Add(wx.StaticText(RigidBodies,-1,' '+refName[i]+': '),0,wx.ALIGN_CENTER_VERTICAL)
    35433615                        atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[i]][ct-1],
    35443616                            choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
    3545                         atPick.Bind(wx.EVT_COMBOBOX, OnAtQPick)
     3617                        if i:
     3618                            atPick.Bind(wx.EVT_COMBOBOX, OnAtQPick)
     3619                        else:
     3620                            atPick.Bind(wx.EVT_COMBOBOX, OnAtOrigPick)                           
    35463621                        Indx[atPick.GetId()] = i
    3547                         OriSizer.Add(atPick,0,wx.ALIGN_CENTER_VERTICAL)
    3548                 mainSizer.Add(OriSizer)
     3622                        RefSizer.Add(atPick,0,wx.ALIGN_CENTER_VERTICAL)
     3623                mainSizer.Add(RefSizer)
    35493624                mainSizer.Add((5,5),0)
    35503625                if Torsions:                   
     
    42544329            G2frame.dataFrame.Bind(wx.EVT_MENU, OnAutoFindResRB, id=G2gd.wxID_AUTOFINDRESRB)
    42554330            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBAssign, id=G2gd.wxID_ASSIGNATMS2RB)
     4331            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBCopyParms, id=G2gd.wxID_COPYRBPARMS)           
    42564332            G2frame.dataFrame.Bind(wx.EVT_MENU, OnGlobalResRBRef, id=G2gd.wxID_GLOBALRESREFINE)
    42574333            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBRemoveAll, id=G2gd.wxID_RBREMOVEALL)
  • trunk/GSASIIplot.py

    r855 r859  
    17021702################################################################################
    17031703           
    1704 def PlotCovariance(G2frame,Data={}):
    1705     if not Data:
    1706         Data = G2frame.PatternTree.GetItemPyData(
    1707             G2gd.GetPatternTreeItemId(G2frame,G2frame.root, 'Covariance'))
     1704def PlotCovariance(G2frame,Data):
    17081705    if not Data:
    17091706        print 'No covariance matrix available'
     
    17181715    title = ' for\n'+Data['title']
    17191716    newAtomDict = Data['newAtomDict']
     1717   
    17201718
    17211719    def OnPlotKeyPress(event):
     
    17311729                G2frame.VcovColor = 'RdYlGn'
    17321730            dlg.Destroy()
    1733         PlotCovariance(G2frame)
     1731        PlotCovariance(G2frame,Data)
    17341732
    17351733    def OnMotion(event):
     
    35153513    Page.camera['viewPoint'] = np.inner(Amat,drawingData['viewPoint'][0])
    35163514    Page.camera['backColor'] = np.array(list(drawingData['backColor'])+[0,])/255.
    3517     Page.canvas.SetCurrent()
     3515    try:
     3516        Page.canvas.SetCurrent()
     3517    except:
     3518        pass
    35183519    Draw('main')
    35193520       
  • trunk/GSASIIstruct.py

    r850 r859  
    152152    return restraintDict
    153153   
     154def GetRigidBodies(GPXfile):
     155    '''Read the rigid body models from the GPX file
     156    '''
     157    fl = open(GPXfile,'rb')
     158    while True:
     159        try:
     160            data = cPickle.load(fl)
     161        except EOFError:
     162            break
     163        datum = data[0]
     164        if datum[0] == 'Rigid bodies':
     165            rigidbodyDict = datum[1]
     166    fl.close()
     167    return rigidbodyDict
     168       
    154169def GetPhaseNames(GPXfile):
    155170    ''' Returns a list of phase names found under 'Phases' in GSASII gpx file
     
    542557                line += '%10.5g'%(item)
    543558            print >>pFile,line
     559           
     560    #def PrintRBObjects()
    544561               
    545562    def PrintAtoms(General,Atoms):
     
    636653        if cell[0]:
    637654            phaseVary += cellVary(pfx,SGData)
     655        #rigid body model input here
    638656        Natoms[pfx] = 0
    639657        if Atoms and not General.get('doPawley'):
     
    706724                print >>pFile,''
    707725                for line in SGtext: print >>pFile,line
     726                #PrintRBObjects(whatever is needed here)
    708727                PrintAtoms(General,Atoms)
    709728                print >>pFile,'\n Unit cell: a =','%.5f'%(cell[1]),' b =','%.5f'%(cell[2]),' c =','%.5f'%(cell[3]), \
     
    961980                print >>pFile,sigstr
    962981               
     982    #def PrintRBObjectsAndSig()
     983               
    963984    def PrintSHtextureAndSig(textureData,SHtextureSig):
    964985        print >>pFile,'\n Spherical harmonics texture: Order:' + str(textureData['Order'])
     
    10541075                    refl[7] = 0
    10551076        else:
     1077            #new RBObj parms here, mod atoms, & PrintRBObjectsAndSig
    10561078            atomsSig = {}
    10571079            if General['Type'] == 'nuclear':        #this needs macromolecular variant!
     
    25242546def GetNewCellParms(parmDict,varyList):
    25252547    newCellDict = {}
    2526     Ddict = dict(zip(['D11','D22','D33','D12','D13','D23'],['A'+str(i) for i in range(6)]))
     2548    Anames = ['A'+str(i) for i in range(6)]
     2549    Ddict = dict(zip(['D11','D22','D33','D12','D13','D23'],Anames))
    25272550    for item in varyList:
    25282551        keys = item.split(':')
    25292552        if keys[2] in Ddict:
    2530             key = keys[0]+'::'+Ddict[keys[2]]
    2531             parm = keys[0]+'::'+keys[2]
     2553            key = keys[0]+'::'+Ddict[keys[2]]       #key is e.g. '0::A0'
     2554            parm = keys[0]+'::'+keys[2]             #parm is e.g. '0::D11'
    25322555            newCellDict[parm] = [key,parmDict[key]+parmDict[item]]
    2533     return newCellDict
     2556    return newCellDict          # is e.g. {'0::D11':A0+D11}
    25342557   
    25352558def ApplyXYZshifts(parmDict,varyList):
     
    25392562            varyList - list of variables
    25402563        returns:
    2541             newAtomDict - dictitemionary of new atomic coordinate names & values;
     2564            newAtomDict - dictionary of new atomic coordinate names & values;
    25422565                key is parameter shift name
    25432566    '''
     
    26162639   
    26172640def SHPOcalDerv(refl,g,phfx,hfx,SGData,calcControls,parmDict):
    2618     #sphericaql harmonics preferred orientation derivatives (cylindrical symmetry only)
     2641    #spherical harmonics preferred orientation derivatives (cylindrical symmetry only)
    26192642    FORPI = 12.5663706143592
    26202643    odfCor = 1.0
     
    36433666    constrDict,fixedList = GetConstraints(GPXfile)
    36443667    restraintDict = GetRestraints(GPXfile)
     3668    rigidbodyDict = GetRigidBodies(GPXfile)
    36453669    Histograms,Phases = GetUsedHistogramsAndPhases(GPXfile)
    36463670    if not Phases:
     
    38113835        raise Exception
    38123836    Natoms,atomIndx,phaseVary,phaseDict,pawleyLookup,FFtables,BLtables = GetPhaseData(Phases,restraintDict,False,printFile)
     3837    for item in phaseVary:
     3838        if '::A0' in item:
     3839            print '**** WARNING - lattice parameters should not be refined in a sequential refinement'
     3840            print '               instead use the Dij parameters for each powder histogram ****'
    38133841    if 'Seq Data' in Controls:
    38143842        histNames = Controls['Seq Data']
     
    39423970        covData = {'variables':result[0],'varyList':varyList,'sig':sig,'Rvals':Rvals,
    39433971            'covMatrix':covMatrix,'title':histogram,'newAtomDict':newAtomDict,'newCellDict':newCellDict}
     3972        # add the uncertainties into the esd dictionary (sigDict)
    39443973        SetHistogramPhaseData(parmDict,sigDict,Phases,Histo,ifPrint,printFile)
    39453974        SetHistogramData(parmDict,sigDict,Histo,ifPrint,printFile)
Note: See TracChangeset for help on using the changeset viewer.