Changeset 859
- Timestamp:
- Feb 28, 2013 12:59:31 PM (10 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIconstrGUI.py
r855 r859 625 625 ''' 626 626 if not data: 627 data.update({'Vector':{'AtInfo':{}},'Residue':{'AtInfo':{}} ,'Z-matrix':{'AtInfo':{}}}) #empty dict - fill it627 data.update({'Vector':{'AtInfo':{}},'Residue':{'AtInfo':{}}}) #empty dict - fill it 628 628 629 629 global resList … … 725 725 AtInfo['C'] = [Info['Drad'],Info['Color']] 726 726 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} 728 728 dlg.Destroy() 729 729 UpdateVectorRB() … … 1002 1002 except ValueError: 1003 1003 pass 1004 Obj.SetValue('%8. 3f'%(val))1004 Obj.SetValue('%8.4f'%(val)) 1005 1005 wx.CallAfter(UpdateVectorRB,VectorRB.GetScrollPos(wx.VERTICAL)) 1006 1006 G2plt.PlotRigidBody(G2frame,'Vector',AtInfo,data['Vector'][rbId],plotDefaults) … … 1014 1014 magSizer.Add(wx.StaticText(VectorRBDisplay,-1,'Translation magnitude: '), 1015 1015 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])) 1017 1017 Indx[magValue.GetId()] = [rbId,imag] 1018 1018 magValue.Bind(wx.EVT_TEXT_ENTER,OnRBVectorMag) … … 1030 1030 1031 1031 def TypeSelect(event): 1032 Obj = event.GetEventObject() 1032 1033 AtInfo = data['Vector']['AtInfo'] 1033 1034 r,c = event.GetRow(),event.GetCol() … … 1046 1047 1047 1048 def ChangeCell(event): 1049 Obj = event.GetEventObject() 1048 1050 r,c = event.GetRow(),event.GetCol() 1049 1051 if r >= 0 and (0 <= c < 3): … … 1118 1120 VectorRBDisplay.SetSize(Size) 1119 1121 VectorRB.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1) 1120 VectorRB.S etScrollPos(wx.VERTICAL,Scroll)1122 VectorRB.Scroll(0,Scroll) 1121 1123 Size[1] = min(Size[1],450) 1122 1124 G2frame.dataFrame.setSizePosLeft(Size) -
trunk/GSASIIgrid.py
r855 r859 112 112 113 113 [ 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)] 116 116 117 117 [ wxID_SAVESEQSEL, … … 1260 1260 self.RigidBodiesEdit.Append(id=wxID_AUTOFINDRESRB, kind=wx.ITEM_NORMAL,text='Auto find residues', 1261 1261 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') 1262 1264 self.RigidBodiesEdit.Append(id=wxID_GLOBALRESREFINE, kind=wx.ITEM_NORMAL,text='Global residue refine', 1263 1265 help='Global setting of residue RB refinement flags') … … 1705 1707 data - dictionary 1706 1708 'histNames' - list of histogram names in order as processed by Sequential Refinement 1707 'varyList' - list of variables - identical over all refinements in sequence1709 'varyList' - list of variables - identical over all refinements in sequence 1708 1710 'histName' - dictionaries for all data sets processed: 1709 1711 'variables'- result[0] from leastsq call … … 1745 1747 sigList = data[name]['sig'] 1746 1748 if colLabels[parm] in atomList: 1747 sigData.append(sigList[colLabels.index(atomList[colLabels[parm]]) ])1749 sigData.append(sigList[colLabels.index(atomList[colLabels[parm]])-1]) 1748 1750 elif colLabels[parm] in cellList: 1749 sigData.append(sigList[colLabels.index(cellList[colLabels[parm]]) ])1751 sigData.append(sigList[colLabels.index(cellList[colLabels[parm]])-1]) 1750 1752 else: 1751 sigData.append(sigList[parm ])1753 sigData.append(sigList[parm-1]) 1752 1754 return sigData 1753 1755 … … 1761 1763 for col in cols: 1762 1764 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) 1764 1769 plotNames.append(G2frame.SeqTable.GetColLabelValue(col)) 1765 1770 plotData = np.array(plotData) 1766 1771 G2plt.PlotSeq(G2frame,plotData,plotSig,plotNames,sampleParms) 1767 1772 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]) 1770 1775 1771 1776 def OnSaveSelSeq(event): … … 1778 1783 for col in cols: 1779 1784 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)) 1781 1789 lenName = len(saveNames[0]) 1782 1790 saveData = np.swapaxes(np.array(saveData),0,1) … … 1806 1814 if G2frame.dataDisplay: 1807 1815 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 1808 1821 cellList = {} 1809 1822 newCellDict = data[histNames[0]]['newCellDict'] … … 1811 1824 if item in data['varyList']: 1812 1825 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]] = item1818 1826 sampleParms = GetSampleParms() 1819 1827 Rwps = GetRwps() … … 1824 1832 colLabels = ['Rwp',]+data['varyList']+atomList.keys()+cellList.keys() 1825 1833 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)] 1827 1835 for i,item in enumerate(seqList): 1828 1836 newAtomDict = data[histNames[i]]['newAtomDict'] … … 2069 2077 wx.TextCtrl(parent=G2frame.dataFrame,size=G2frame.dataFrame.GetClientSize(), 2070 2078 value='See plot window for covariance display'+text,style=wx.TE_MULTILINE) 2071 G2plt.PlotCovariance(G2frame )2079 G2plt.PlotCovariance(G2frame,data) 2072 2080 elif G2frame.PatternTree.GetItemText(item) == 'Constraints': 2073 2081 data = G2frame.PatternTree.GetItemPyData(item) -
trunk/GSASIImath.py
r855 r859 197 197 XYZ.append([parmDict[name]+parmDict[dname] for name,dname in zip(names,dnames)]) 198 198 return XYZ 199 200 def 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 206 def 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 199 231 200 232 def GetXYZDist(xyz,XYZ,Amat): … … 1325 1357 1326 1358 def AV2Q(A,V): 1327 ''' convert angle (radians -pi to pi) & vector to quaternion1359 ''' convert angle (radians) & vector to quaternion 1328 1360 q=r+ai+bj+ck 1329 1361 ''' … … 1333 1365 V /= d 1334 1366 else: 1335 return [ 1.,0.,0.,0.] #identity1367 return [0.,0.,0.,1.] #identity 1336 1368 p = A/2. 1337 1369 Q[0] = np.cos(p) … … 1340 1372 1341 1373 def AVdeg2Q(A,V): 1342 ''' convert angle (degrees -180 to 180) & vector to quaternion1374 ''' convert angle (degrees) & vector to quaternion 1343 1375 q=r+ai+bj+ck 1344 1376 ''' … … 1353 1385 Q[1:4] = V*sind(p) 1354 1386 return Q 1355 1387 1388 def 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 1396 def 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 1356 1404 def makeQuat(A,B,C): 1357 1405 ''' Make quaternion from rotation of A vector to B vector about C axis -
trunk/GSASIIphsGUI.py
r857 r859 1185 1185 event.StopPropagation() 1186 1186 1187 def OnRBAppend(event): 1187 def OnRBAppend(event): #unfinished! 1188 1188 rbData = G2frame.PatternTree.GetItemPyData( 1189 1189 G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies')) … … 3049 3049 ################################################################################ 3050 3050 3051 def FillRigidBodyGrid(refresh= False):3051 def FillRigidBodyGrid(refresh=True): 3052 3052 if refresh: 3053 3053 RigidBodies.DestroyChildren() … … 3060 3060 Indx = {} 3061 3061 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): 3063 3121 3064 3122 def OnOrigRef(event): … … 3067 3125 def OnOrienRef(event): 3068 3126 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 3071 3202 def OnTorsionRef(event): 3072 3203 Obj = event.GetEventObject() … … 3102 3233 wx.CallAfter(FillRigidBodyGrid,True) 3103 3234 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-S333115 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] = val3125 except ValueError:3126 pass3127 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()] = i3152 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()] = i3157 thermSizer.Add(Tcheck,0,wx.ALIGN_CENTER_VERTICAL)3158 return thermSizer3159 3160 3235 resrbSizer = wx.BoxSizer(wx.VERTICAL) 3161 3236 resrbSizer.Add(wx.StaticText(RigidBodies,-1,120*'-')) … … 3169 3244 topLine.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL) 3170 3245 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')) 3189 3247 resrbSizer.Add(wx.StaticText(RigidBodies,-1,'Torsions:'),0,wx.ALIGN_CENTER_VERTICAL) 3190 3248 torSizer = wx.FlexGridSizer(1,6,5,5) … … 3207 3265 thermSel = wx.ComboBox(RigidBodies,-1,value=RBObj['ThermalMotion'][0],choices=tchoice, 3208 3266 style=wx.CB_READONLY|wx.CB_DROPDOWN) 3267 Indx[thermSel.GetId()] = RBObj 3209 3268 thermSel.Bind(wx.EVT_COMBOBOX,OnThermSel) 3210 3269 thermSizer.Add(thermSel,0,wx.ALIGN_CENTER_VERTICAL) 3211 3270 resrbSizer.Add(thermSizer) 3212 3271 if RBObj['ThermalMotion'][0] != 'None': 3213 resrbSizer.Add(ThermDataSizer( ))3272 resrbSizer.Add(ThermDataSizer(RBObj)) 3214 3273 return resrbSizer 3215 3274 3216 3275 def VecrbSizer(RBObj): 3217 3276 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 3225 3277 def OnDelVecRB(event): 3226 3278 Obj = event.GetEventObject() … … 3245 3297 topLine.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL) 3246 3298 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, 3260 3304 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)) 3265 3311 return vecrbSizer 3266 3312 … … 3293 3339 Size[1] = min(Size[1],450) 3294 3340 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)) 3295 3372 3296 3373 def OnRBAssign(event): … … 3333 3410 rbObj['Ids'] = Ids 3334 3411 rbObj['ThermalMotion'] = ['None',[],[]] #type,values,flags 3412 rbObj['RBname'] += ':'+str(RBData[rbType][rbId]['useCount']) 3335 3413 RBObjs.append(rbObj) 3336 3414 data['RBModels'][rbType] = RBObjs … … 3489 3567 Xsizers = [] 3490 3568 Osizers = [] 3491 OriSizer = wx.FlexGridSizer(1,6,5,5)3492 3569 rbObj = data['testRBObj']['rbObj'] 3493 3570 rbName = rbObj['RBname'] … … 3504 3581 0,wx.ALIGN_CENTER_VERTICAL) 3505 3582 mainSizer.Add((5,5),0) 3583 OriSizer = wx.FlexGridSizer(1,5,5,5) 3506 3584 OriSizer.Add(wx.StaticText(RigidBodies,-1,'Origin x,y,z: '),0,wx.ALIGN_CENTER_VERTICAL) 3507 3585 for ix,x in enumerate(Orig): … … 3512 3590 OriSizer.Add(origX,0,wx.ALIGN_CENTER_VERTICAL) 3513 3591 Xsizers.append(origX) 3592 OriSizer.Add((5,0),) 3514 3593 if len(atomData): 3515 3594 choice = atNames[0].keys() 3516 3595 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()] = 03522 OriSizer.Add(atPick,0,wx.ALIGN_CENTER_VERTICAL)3523 3596 data['testRBObj']['Sizers']['Xsizers'] = Xsizers 3524 else:3525 OriSizer.Add((5,0),)3526 OriSizer.Add((5,0),)3527 3597 OriSizer.Add(wx.StaticText(RigidBodies,-1,'Orientation quaternion: '),0,wx.ALIGN_CENTER_VERTICAL) 3528 3598 for ix,x in enumerate(Orien): … … 3534 3604 Osizers.append(orien) 3535 3605 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) 3537 3609 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]: 3540 3612 choice = atNames[i].keys() 3541 3613 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) 3543 3615 atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[i]][ct-1], 3544 3616 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) 3546 3621 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) 3549 3624 mainSizer.Add((5,5),0) 3550 3625 if Torsions: … … 4254 4329 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAutoFindResRB, id=G2gd.wxID_AUTOFINDRESRB) 4255 4330 G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBAssign, id=G2gd.wxID_ASSIGNATMS2RB) 4331 G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBCopyParms, id=G2gd.wxID_COPYRBPARMS) 4256 4332 G2frame.dataFrame.Bind(wx.EVT_MENU, OnGlobalResRBRef, id=G2gd.wxID_GLOBALRESREFINE) 4257 4333 G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBRemoveAll, id=G2gd.wxID_RBREMOVEALL) -
trunk/GSASIIplot.py
r855 r859 1702 1702 ################################################################################ 1703 1703 1704 def PlotCovariance(G2frame,Data={}): 1705 if not Data: 1706 Data = G2frame.PatternTree.GetItemPyData( 1707 G2gd.GetPatternTreeItemId(G2frame,G2frame.root, 'Covariance')) 1704 def PlotCovariance(G2frame,Data): 1708 1705 if not Data: 1709 1706 print 'No covariance matrix available' … … 1718 1715 title = ' for\n'+Data['title'] 1719 1716 newAtomDict = Data['newAtomDict'] 1717 1720 1718 1721 1719 def OnPlotKeyPress(event): … … 1731 1729 G2frame.VcovColor = 'RdYlGn' 1732 1730 dlg.Destroy() 1733 PlotCovariance(G2frame )1731 PlotCovariance(G2frame,Data) 1734 1732 1735 1733 def OnMotion(event): … … 3515 3513 Page.camera['viewPoint'] = np.inner(Amat,drawingData['viewPoint'][0]) 3516 3514 Page.camera['backColor'] = np.array(list(drawingData['backColor'])+[0,])/255. 3517 Page.canvas.SetCurrent() 3515 try: 3516 Page.canvas.SetCurrent() 3517 except: 3518 pass 3518 3519 Draw('main') 3519 3520 -
trunk/GSASIIstruct.py
r850 r859 152 152 return restraintDict 153 153 154 def 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 154 169 def GetPhaseNames(GPXfile): 155 170 ''' Returns a list of phase names found under 'Phases' in GSASII gpx file … … 542 557 line += '%10.5g'%(item) 543 558 print >>pFile,line 559 560 #def PrintRBObjects() 544 561 545 562 def PrintAtoms(General,Atoms): … … 636 653 if cell[0]: 637 654 phaseVary += cellVary(pfx,SGData) 655 #rigid body model input here 638 656 Natoms[pfx] = 0 639 657 if Atoms and not General.get('doPawley'): … … 706 724 print >>pFile,'' 707 725 for line in SGtext: print >>pFile,line 726 #PrintRBObjects(whatever is needed here) 708 727 PrintAtoms(General,Atoms) 709 728 print >>pFile,'\n Unit cell: a =','%.5f'%(cell[1]),' b =','%.5f'%(cell[2]),' c =','%.5f'%(cell[3]), \ … … 961 980 print >>pFile,sigstr 962 981 982 #def PrintRBObjectsAndSig() 983 963 984 def PrintSHtextureAndSig(textureData,SHtextureSig): 964 985 print >>pFile,'\n Spherical harmonics texture: Order:' + str(textureData['Order']) … … 1054 1075 refl[7] = 0 1055 1076 else: 1077 #new RBObj parms here, mod atoms, & PrintRBObjectsAndSig 1056 1078 atomsSig = {} 1057 1079 if General['Type'] == 'nuclear': #this needs macromolecular variant! … … 2524 2546 def GetNewCellParms(parmDict,varyList): 2525 2547 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)) 2527 2550 for item in varyList: 2528 2551 keys = item.split(':') 2529 2552 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' 2532 2555 newCellDict[parm] = [key,parmDict[key]+parmDict[item]] 2533 return newCellDict 2556 return newCellDict # is e.g. {'0::D11':A0+D11} 2534 2557 2535 2558 def ApplyXYZshifts(parmDict,varyList): … … 2539 2562 varyList - list of variables 2540 2563 returns: 2541 newAtomDict - dicti temionary of new atomic coordinate names & values;2564 newAtomDict - dictionary of new atomic coordinate names & values; 2542 2565 key is parameter shift name 2543 2566 ''' … … 2616 2639 2617 2640 def SHPOcalDerv(refl,g,phfx,hfx,SGData,calcControls,parmDict): 2618 #spherica ql harmonics preferred orientation derivatives (cylindrical symmetry only)2641 #spherical harmonics preferred orientation derivatives (cylindrical symmetry only) 2619 2642 FORPI = 12.5663706143592 2620 2643 odfCor = 1.0 … … 3643 3666 constrDict,fixedList = GetConstraints(GPXfile) 3644 3667 restraintDict = GetRestraints(GPXfile) 3668 rigidbodyDict = GetRigidBodies(GPXfile) 3645 3669 Histograms,Phases = GetUsedHistogramsAndPhases(GPXfile) 3646 3670 if not Phases: … … 3811 3835 raise Exception 3812 3836 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 ****' 3813 3841 if 'Seq Data' in Controls: 3814 3842 histNames = Controls['Seq Data'] … … 3942 3970 covData = {'variables':result[0],'varyList':varyList,'sig':sig,'Rvals':Rvals, 3943 3971 'covMatrix':covMatrix,'title':histogram,'newAtomDict':newAtomDict,'newCellDict':newCellDict} 3972 # add the uncertainties into the esd dictionary (sigDict) 3944 3973 SetHistogramPhaseData(parmDict,sigDict,Phases,Histo,ifPrint,printFile) 3945 3974 SetHistogramData(parmDict,sigDict,Histo,ifPrint,printFile)
Note: See TracChangeset
for help on using the changeset viewer.