Changeset 851
- Timestamp:
- Feb 15, 2013 3:04:56 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIconstrGUI.py
r850 r851 679 679 def getTextFile(): 680 680 defDir = os.path.join(os.path.split(__file__)[0],'GSASIImacros') 681 dlg = wx.FileDialog(G2frame,message='Choose rigid body text file', 682 defaultDir=defDir,defaultFile="",wildcard="GSAS-II text file (*.txt)|*.txt", 683 style=wx.OPEN | wx.CHANGE_DIR) 681 dlg = wx.FileDialog(G2frame,'Choose rigid body text file', '.', '', 682 "GSAS-II text file (*.txt)|*.txt|XYZ file (*.xyz)|*.xyz|" 683 "Sybyl mol2 file (*.mol2)|*.mol2|PDB file (*.pdb;*.ent)|*.pdb;*.ent", 684 wx.OPEN | wx.CHANGE_DIR) 684 685 try: 685 686 if dlg.ShowModal() == wx.ID_OK: 686 687 txtfile = dlg.GetPath() 688 ext = os.path.splitext(txtfile)[1] 687 689 text = open(txtfile,'Ur') 688 690 else: # cancel was pressed 691 ext = '' 689 692 text = [] 690 693 finally: 691 694 dlg.Destroy() 692 return text 695 if 'ent' in ext: 696 ext = '.pdb' 697 return text,ext.lower() 693 698 694 699 def OnAddRigidBody(event): … … 698 703 elif 'Residue' in G2frame.dataDisplay.GetPageText(page): 699 704 AddResidueRB() 700 elif 'Z-matrix' in G2frame.dataDisplay.GetPageText(page):701 AddZMatrixRB()702 705 703 706 def OnImportRigidBody(event): … … 707 710 elif 'Residue' in G2frame.dataDisplay.GetPageText(page): 708 711 ImportResidueRB() 709 elif 'Z-matrix' in G2frame.dataDisplay.GetPageText(page):710 pass711 712 712 713 def OnNewOrigin(event): #only for Residue RBs … … 768 769 Info = G2elem.GetAtomInfo('C') 769 770 AtInfo['C'] = [Info['Drad'],Info['Color']] 770 data['Vector'][rbId] = {'RBname':'UNKRB','VectMag':vecMag, 771 data['Vector'][rbId] = {'RBname':'UNKRB','VectMag':vecMag,'rbXYZ':np.zeros((nAtoms,3)), 771 772 'VectRef':vecRef,'rbTypes':rbTypes,'rbVect':vecVal,'useCount':0} 772 773 dlg.Destroy() … … 821 822 def ImportResidueRB(): 822 823 AtInfo = data['Residue']['AtInfo'] 823 text = getTextFile()824 text,ext = getTextFile() 824 825 if not text: 825 826 return … … 830 831 atNames = [] 831 832 txtStr = text.readline() 833 if 'xyz' in ext: 834 txtStr = text.readline() 835 txtStr = text.readline() 836 elif 'mol2' in ext: 837 while 'ATOM' not in txtStr: 838 txtStr = text.readline() 839 txtStr = text.readline() 840 elif 'pdb' in ext: 841 while 'ATOM' not in txtStr[:6] and 'HETATM' not in txtStr[:6]: 842 txtStr = text.readline() 843 print txtStr 832 844 items = txtStr.split() 833 845 while len(items): 834 atName = items[0] 835 atType = items[1] 846 if 'txt' in ext: 847 atName = items[0] 848 atType = items[1] 849 rbXYZ.append([float(items[i]) for i in [2,3,4]]) 850 elif 'xyz' in ext: 851 atType = items[0] 852 rbXYZ.append([float(items[i]) for i in [1,2,3]]) 853 atName = atType+str(len(rbXYZ)) 854 elif 'mol2' in ext: 855 atType = items[1] 856 atName = items[1]+items[0] 857 rbXYZ.append([float(items[i]) for i in [2,3,4]]) 858 elif 'pdb' in ext: 859 atType = items[-1] 860 atName = items[2] 861 xyz = txtStr[30:55].split() 862 rbXYZ.append([float(x) for x in xyz]) 836 863 atNames.append(atName) 837 rbXYZ.append([float(items[i]) for i in [2,3,4]])838 864 rbTypes.append(atType) 839 865 if atType not in AtInfo: … … 841 867 AtInfo[atType] = [Info['Drad'],Info['Color']] 842 868 txtStr = text.readline() 869 if 'mol2' in ext and 'BOND' in txtStr: 870 break 871 if 'pdb' in ext and ('ATOM' not in txtStr[:6] and 'HETATM' not in txtStr[:6]): 872 break 843 873 items = txtStr.split() 844 874 rbXYZ = np.array(rbXYZ)-np.array(rbXYZ[0]) … … 931 961 932 962 933 def AddZMatrixRB():934 pass935 936 963 def UpdateVectorRB(): 937 964 AtInfo = data['Vector']['AtInfo'] … … 1082 1109 VectorRBSizer.Add(rbVectMag(rbId,imag,rbData),0) 1083 1110 VectorRBSizer.Add(rbVectors(rbId,imag,mag,XYZ,rbData),0) 1084 VectorRBSizer.Add((5,5),0) 1111 VectorRBSizer.Add((5,5),0) 1112 data['Vector'][rbId]['rbXYZ'] = XYZ 1085 1113 VectorRBSizer.Layout() 1086 1114 VectorRBDisplay.SetSizer(VectorRBSizer,True) … … 1302 1330 G2frame.dataFrame.setSizePosLeft(Size) 1303 1331 1304 def UpdateZMatrixRB():1305 ZMatrixRB.DestroyChildren()1306 ZMatrixRBDisplay = wx.Panel(ZMatrixRB)1307 ZMatrixRBSizer = wx.BoxSizer(wx.VERTICAL)1308 ZMatrixRBSizer.Add((5,5),0)1309 # ZMatrixRBSizer.Add(ConstSizer('Phase',PhaseDisplay))1310 ZMatrixRBSizer.Layout()1311 ZMatrixRBDisplay.SetSizer(ZMatrixRBSizer,True)1312 Size = ZMatrixRBSizer.GetMinSize()1313 Size[0] += 401314 Size[1] = max(Size[1],250) + 201315 ZMatrixRBDisplay.SetSize(Size)1316 ZMatrixRB.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)1317 # Size[1] = min(Size[1],250)1318 G2frame.dataFrame.setSizePosLeft(Size)1319 1320 1332 def SetStatusLine(text): 1321 1333 Status.SetStatusText(text) … … 1342 1354 ResidueRB = wx.ScrolledWindow(G2frame.dataDisplay) 1343 1355 G2frame.dataDisplay.AddPage(ResidueRB,'Residue rigid bodies') 1344 ZMatrixRB = wx.ScrolledWindow(G2frame.dataDisplay)1345 G2frame.dataDisplay.AddPage(ZMatrixRB,'Z-matrix rigid bodies')1346 1356 UpdateVectorRB() 1347 1357 -
trunk/GSASIIgrid.py
r850 r851 112 112 113 113 [ wxID_RIGIDBODYADD,wxID_DRAWDEFINERB,wxID_RIGIDBODYIMPORT,wxID_RESIDUETORSSEQ, 114 wxID_ ZMATRIXADD,wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE,wxID_RBREMOVEALL,114 wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE,wxID_RBREMOVEALL, 115 115 wxID_RBNEWORIGIN,wxID_RBREFATMS 116 ] = [wx.NewId() for item in range( 10)]116 ] = [wx.NewId() for item in range(9)] 117 117 118 118 [ wxID_SAVESEQSEL, … … 131 131 #### GSAS-II class definitions 132 132 ################################################################################ 133 134 class GSASWizard(wz.WizardPageSimple): 135 def __init__(self,parent,title): 136 wz.WizardPageSimple.__init__(self,parent) 137 self.mainSizer = wx.BoxSizer(wx.VERTICAL) 138 self.SetSizer(self.mainSizer) 139 titleText = wx.StaticText(self,-1,title) 140 titleText.SetFont(wx.Font(16,wx.SWISS,wx.NORMAL,wx.BOLD)) 141 self.mainSizer.Add(titleText,0,wx.ALIGN_CENTRE|wx.ALL,5) 142 133 143 134 class SymOpDialog(wx.Dialog): 144 135 def __init__(self,parent,SGData,New=True,ForceUnit=False): … … 861 852 self.ResidueRBMenu.Append(id=wxID_RESIDUETORSSEQ, kind=wx.ITEM_NORMAL,text='Define sequence', 862 853 help='Define torsion sequence') 863 self.ZMatrixRBMenu = wx.Menu(title='')864 self.ZMatrixRBMenu.Append(id=wxID_ZMATRIXADD, kind=wx.ITEM_NORMAL,text='Add Z-matrix',865 help='Add Z-matrix')866 854 867 855 self.RigidBodyMenu = wx.MenuBar() … … 1147 1135 self.AtomEdit.Append(id=wxID_ATOMVIEWINSERT, kind=wx.ITEM_NORMAL,text='Insert view point', 1148 1136 help='Select atom row to insert before; inserted as an H atom') 1149 self.AtomEdit.Append(id=wxID_ASSIGNATMS2RB, kind=wx.ITEM_NORMAL,text='Assign atoms to rigid body',1150 help='Select atom row to start assignment')1151 1137 self.AtomEdit.Append(id=wxID_ATOMMOVE, kind=wx.ITEM_NORMAL,text='Move atom to view point', 1152 1138 help='Select single atom to move') … … 1277 1263 self.RigidBodiesEdit.Append(id=wxID_AUTOFINDRESRB, kind=wx.ITEM_NORMAL,text='Auto find residues', 1278 1264 help='Auto find of residue RBs in macromolecule') 1265 self.RigidBodiesEdit.Append(id=wxID_ASSIGNATMS2RB, kind=wx.ITEM_NORMAL,text='Assign atoms to rigid body', 1266 help='Select & position rigid body in structure for existing atoms') 1279 1267 self.RigidBodiesEdit.Append(id=wxID_GLOBALRESREFINE, kind=wx.ITEM_NORMAL,text='Global residue refine', 1280 1268 help='Global setting of residue RB refinement flags') -
trunk/GSASIImath.py
r849 r851 198 198 return XYZ 199 199 200 def UpdateResRBAtoms( Amat,Bmat,cx,Atoms,AtLookUp,RBObj,RBData):200 def UpdateResRBAtoms(Bmat,RBObj,RBData): 201 201 RBIds = GetResRBIds(RBData) 202 ObjIds = RBObj['Ids'] 203 RBRes = RBData[RBIds[RBObj['ResName']]] 202 RBRes = RBData[RBIds[RBObj['RBname']]] 204 203 XYZ = np.array(RBRes['rbXYZ']) 205 204 for tor,seq in zip(RBObj['Torsions'],RBRes['rbSeq']): … … 211 210 xyz = np.inner(Bmat,xyz) 212 211 xyz += RBObj['Orig'][0] 213 Atoms[AtLookUp[ObjIds[i]]][cx:cx+3] = xyz 212 XYZ[i] = xyz 213 return XYZ 214 215 def UpdateRBAtoms(Bmat,RBObj,RBData,RBType): 216 RBIds = GetResRBIds(RBData[RBType]) 217 RBRes = RBData[RBType][RBIds[RBObj['RBname']]] 218 if RBType == 'Vector': 219 vecs = RBRes['rbVect'] 220 mags = RBRes['VectMag'] 221 XYZ = np.zeros_like(vecs[0]) 222 for vec,mag in zip(vecs,mags): 223 XYZ += vec*mag 224 elif RBType == 'Residue': 225 XYZ = np.array(RBRes['rbXYZ']) 226 for tor,seq in zip(RBObj['Torsions'],RBRes['rbSeq']): 227 QuatA = AVdeg2Q(tor[0],XYZ[seq[0]]-XYZ[seq[1]]) 228 for ride in seq[3]: 229 XYZ[ride] = prodQVQ(QuatA,XYZ[ride]-XYZ[seq[1]])+XYZ[seq[1]] 230 for i,xyz in enumerate(XYZ): 231 xyz = prodQVQ(RBObj['Orient'][0],xyz) 232 xyz = np.inner(Bmat,xyz) 233 xyz += RBObj['Orig'][0] 234 XYZ[i] = xyz 235 return XYZ 214 236 215 237 def GetResRBIds(RBData): -
trunk/GSASIIphsGUI.py
r850 r851 1182 1182 general = data['General'] 1183 1183 atomData = data['Atoms'] 1184 1185 def OnRBAssign(event): 1186 1187 RBObjs = [] 1188 rbType = '' 1189 rbName = '' 1190 rbId = None 1191 1192 def OnSelectRB(event): 1193 rbName = selectRB.GetValue() 1194 rbType,rbId = rbNames[rbName] 1195 RBObjs = data['RBModels'].get(rbType,[]) 1196 page2.mainSizer.Add(wx.StaticText(page2,-1,'Select origin for '+rbName)) 1197 1198 rbData = G2frame.PatternTree.GetItemPyData( 1199 G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies')) 1200 RBwizard = wz.Wizard(G2frame.dataFrame,-1,"Rigid body assign wizard") 1184 Amat,Bmat = G2lat.cell2AB(general['Cell'][1:7]) 1201 1185 rbNames = {} 1202 1186 for rbVec in rbData['Vector']: … … 1209 1193 print '**** ERROR - no rigid bodies defined ****' 1210 1194 return 1211 page1 = G2gd.GSASWizard(RBwizard,"Select rigid body")1212 page1.mainSizer.Add(wx.StaticText(page1,-1,'Select rigid body'))1213 selectRB = wx.ComboBox(page1,-1,value=' ',choices=rbNames.keys(),1214 style=wx.CB_READONLY|wx.CB_DROPDOWN)1215 selectRB.Bind(wx.EVT_COMBOBOX,OnSelectRB)1216 page1.mainSizer.Add(selectRB)1217 1195 1218 page2 = G2gd.GSASWizard(RBwizard,"Select origin")1219 page3 = G2gd.GSASWizard(RBwizard,"Select 1st reference atom")1220 page4 = G2gd.GSASWizard(RBwizard,"Select 2nd reference atom")1221 page3.mainSizer.Add(wx.StaticText(page3,-1,'Select 1st reference atom'))1222 page3.mainSizer.Add(wx.StaticText(page4,-1,'Select 2nd reference atom'))1223 wz.WizardPageSimple_Chain(page1,page2)1224 wz.WizardPageSimple_Chain(page2,page3)1225 wz.WizardPageSimple_Chain(page3,page4)1226 RBwizard.FitToPage(page1)1227 if RBwizard.RunWizard(page1):1228 print 'done'1229 1230 1196 def OnAtomMove(event): 1231 1197 drawData = data['Drawing'] … … 3074 3040 def OnOrienRef(event): 3075 3041 RBObj['Orient'][1] = Qcheck.GetValue() 3042 Qcheck.Setvalue(RBObj['Orient'][1]) 3076 3043 3077 3044 def OnTorsionRef(event): … … 3086 3053 val = float(Obj.GetValue()) 3087 3054 RBObj['Torsions'][item][0] = val 3088 G2mth.UpdateResRBAtoms(Amat,Bmat,cx,data['Atoms'],AtLookUp,RBObj,RBData) 3055 newXYZ = G2mth.UpdateResRBAtoms(Bmat,RBObj,RBData) 3056 for i,id in enumerate(RBObj['Ids']): 3057 data['Atoms'][AtLookUp[id]][cx:cx+3] = newXYZ[i] 3089 3058 except ValueError: 3090 3059 pass … … 3105 3074 topLine = wx.BoxSizer(wx.HORIZONTAL) 3106 3075 topLine.Add(wx.StaticText(RigidBodies,-1, 3107 'Name: '+RBObj['R esName']+RBObj['numChain']+' '),0,wx.ALIGN_CENTER_VERTICAL)3076 'Name: '+RBObj['RBname']+RBObj['numChain']+' '),0,wx.ALIGN_CENTER_VERTICAL) 3108 3077 delRB = wx.CheckBox(RigidBodies,-1,'Delete?') 3109 3078 delRB.Bind(wx.EVT_CHECKBOX,OnDelRB) … … 3120 3089 topSizer.Add(Ocheck,0,wx.ALIGN_CENTER_VERTICAL) 3121 3090 topSizer.Add(wx.StaticText(RigidBodies,-1, 3122 ' %s %8.5f %8.5f %8.5f %8.5f '%('Orientation:',Orien[0],Orien[1],Orien[2],Orien[3]))) 3123 Qcheck = wx.CheckBox(RigidBodies,-1,'Refine?') 3091 ' %s %8.5f %8.5f %8.5f %8.5f Refine?'%('Orientation:',Orien[0], \ 3092 Orien[1],Orien[2],Orien[3])),0,wx.ALIGN_CENTER_VERTICAL) 3093 Qcheck = wx.ComboBox(RigidBodies,-1,value='',choices=[' ','A','Q'], 3094 style=wx.CB_READONLY|wx.CB_DROPDOWN) 3124 3095 Qcheck.Bind(wx.EVT_CHECKBOX,OnOrienRef) 3125 3096 Qcheck.SetValue(RBObj['Orient'][1]) 3126 topSizer.Add(Qcheck ,0,wx.ALIGN_CENTER_VERTICAL)3097 topSizer.Add(Qcheck) 3127 3098 resrbSizer.Add(topSizer) 3128 3099 resrbSizer.Add(wx.StaticText(RigidBodies,-1,' Torsions:'),0,wx.ALIGN_CENTER_VERTICAL) … … 3145 3116 G2frame.dataFrame.SetStatusText('') 3146 3117 mainSizer = wx.BoxSizer(wx.VERTICAL) 3118 if not data['RBModels']: 3119 mainSizer.Add((5,5),0) 3120 mainSizer.Add(wx.StaticText(RigidBodies,-1,'No rigid body models:'),0,wx.ALIGN_CENTER_VERTICAL) 3121 mainSizer.Add((5,5),0) 3147 3122 if 'Residue' in data['RBModels']: 3148 3123 mainSizer.Add((5,5),0) … … 3162 3137 G2frame.dataFrame.setSizePosLeft(Size) 3163 3138 3139 def OnRBAssign(event): 3140 3141 rbData = G2frame.PatternTree.GetItemPyData( 3142 G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Rigid bodies')) 3143 rbNames = {} 3144 for rbVec in rbData['Vector']: 3145 if rbVec != 'AtInfo': 3146 rbNames[rbData['Vector'][rbVec]['RBname']] =['Vector',rbVec] 3147 for rbRes in rbData['Residue']: 3148 if rbRes != 'AtInfo': 3149 rbNames[rbData['Residue'][rbRes]['RBname']] = ['Residue',rbRes] 3150 if not rbNames: 3151 print '**** ERROR - no rigid bodies defined ****' 3152 return 3153 general = data['General'] 3154 Amat,Bmat = G2lat.cell2AB(general['Cell'][1:7]) 3155 cx,ct = general['AtomPtrs'][:2] 3156 atomData = data['Atoms'] 3157 Indx = {} 3158 atInd = [0,1,2] 3159 data['testRBObj'] = {} 3160 3161 def Draw(): 3162 3163 def OnOk(event): 3164 #more stuff here substituting rigid body for atoms 3165 del data['testRBObj'] 3166 FillRigidBodyGrid(True) 3167 3168 def OnCancel(event): 3169 del data['testRBObj'] 3170 FillRigidBodyGrid(True) 3171 3172 def OnRBSel(event): 3173 selection = rbSel.GetValue() 3174 rbType,rbId = rbNames[selection] 3175 data['testRBObj']['rbAtTypes'] = rbData[rbType][rbId]['rbTypes'] 3176 data['testRBObj']['AtInfo'] = rbData[rbType]['AtInfo'] 3177 data['testRBObj']['rbType'] = rbType 3178 data['testRBObj']['rbData'] = rbData 3179 data['testRBObj']['Sizers'] = {} 3180 if rbType == 'Vector': 3181 rbRef = [0,1,2] 3182 elif rbType == 'Residue': 3183 rbRef = rbData[rbType][rbId]['rbRef'] 3184 data['testRBObj']['rbRef'] = rbRef 3185 refType = [] 3186 refName = [] 3187 for ref in rbRef: 3188 reftype = data['testRBObj']['rbAtTypes'][ref] 3189 refType.append(reftype) 3190 refName.append(reftype+' '+str(rbRef[0])) 3191 atNames = [{},{},{}] 3192 for iatm,atom in enumerate(atomData): 3193 for i,reftype in enumerate(refType): 3194 if atom[ct] == reftype: 3195 atNames[i][atom[ct-1]] = iatm 3196 data['testRBObj']['atNames'] = atNames 3197 data['testRBObj']['rbObj'] = {'Orig':[[0,0,0],False],'Orient':[[0,0,0,1.],' '], 3198 'RBId':rbId,'Torsions':[],'numChain':'','RBname':rbData[rbType][rbId]['RBname']} 3199 for item in rbData[rbType][rbId].get('rbSeq',[]): 3200 data['testRBObj']['rbObj']['Torsions'].append([0.0,False]) 3201 Draw() 3202 3203 def OnOrigX(event): 3204 Obj = event.GetEventObject() 3205 item = Indx[Obj.GetId()] 3206 try: 3207 val = float(Obj.GetValue()) 3208 data['testRBObj']['rbObj']['Orig'][0][item] = val 3209 except ValueError: 3210 pass 3211 Draw() 3212 3213 def OnOrien(event): 3214 Obj = event.GetEventObject() 3215 item = Indx[Obj.GetId()] 3216 Q = data['testRBObj']['rbObj']['Orient'][0] 3217 try: 3218 val = float(Obj.GetValue()) 3219 Q[item] = val 3220 if not any(Q): 3221 raise ValueError 3222 Q = G2mth.normQ(Q) 3223 data['testRBObj']['rbObj']['Orient'][0] = Q 3224 except ValueError: 3225 pass 3226 Draw() 3227 3228 def OnAtOrigPick(event): 3229 Obj = event.GetEventObject() 3230 item = Indx[Obj.GetId()] 3231 atName = Obj.GetValue() 3232 atInd[0] = atNames[item][atName] 3233 data['testRBObj']['rbObj']['Orig'][0] = atomData[atNames[item][atName]][cx:cx+3] 3234 Draw() 3235 3236 def OnAtQPick(event): 3237 Obj = event.GetEventObject() 3238 item = Indx[Obj.GetId()] 3239 atName = Obj.GetValue() 3240 atInd[item] = atNames[item][atName] 3241 rbType = data['testRBObj']['rbType'] 3242 rbObj = data['testRBObj']['rbObj'] 3243 rbId = rbObj['RBId'] 3244 rbRef = data['testRBObj']['rbRef'] 3245 rbXYZ = rbData[rbType][rbId]['rbXYZ'] 3246 VAR = rbXYZ[rbRef[1]]-rbXYZ[rbRef[0]] 3247 VBR = rbXYZ[rbRef[2]]-rbXYZ[rbRef[0]] 3248 Orig = np.array(data['testRBObj']['rbObj']['Orig'][0]) 3249 VAC = np.inner(Amat,np.array(atomData[atInd[1]][cx:cx+3])-Orig) 3250 VBC = np.inner(Amat,np.array(atomData[atInd[2]][cx:cx+3])-Orig) 3251 VCC = np.cross(VAR,VAC) 3252 QuatA = G2mth.makeQuat(VAR,VAC,VCC)[0] 3253 VAR = G2mth.prodQVQ(QuatA,VAR) 3254 VBR = G2mth.prodQVQ(QuatA,VBR) 3255 QuatB = G2mth.makeQuat(VBR,VBC,VAR)[0] 3256 QuatC = G2mth.prodQQ(QuatB,QuatA) 3257 data['testRBObj']['rbObj']['Orient'] = [QuatC,' '] 3258 Draw() 3259 3260 if len(data['testRBObj']): 3261 G2plt.PlotStructure(G2frame,data) 3262 3263 RigidBodies.DestroyChildren() 3264 mainSizer = wx.BoxSizer(wx.VERTICAL) 3265 mainSizer.Add((5,5),0) 3266 mainSizer.Add(wx.StaticText(RigidBodies,-1,'Assign rigid body:'),0,wx.ALIGN_CENTER_VERTICAL) 3267 mainSizer.Add((5,5),0) 3268 if data['testRBObj']: 3269 Xsizers = [] 3270 Osizers = [] 3271 OriSizer = wx.FlexGridSizer(1,6,5,5) 3272 Orig = data['testRBObj']['rbObj']['Orig'][0] 3273 Orien = data['testRBObj']['rbObj']['Orient'][0] 3274 rbRef = data['testRBObj']['rbRef'] 3275 refName = [] 3276 for ref in rbRef: 3277 refName.append(data['testRBObj']['rbAtTypes'][ref]+str(ref)) 3278 atNames = data['testRBObj']['atNames'] 3279 OriSizer.Add(wx.StaticText(RigidBodies,-1,'Origin x,y,z: '),0,wx.ALIGN_CENTER_VERTICAL) 3280 for ix,x in enumerate(Orig): 3281 origX = wx.TextCtrl(RigidBodies,-1,value='%10.5f'%(x),style=wx.TE_PROCESS_ENTER) 3282 origX.Bind(wx.EVT_TEXT_ENTER,OnOrigX) 3283 origX.Bind(wx.EVT_KILL_FOCUS,OnOrigX) 3284 Indx[origX.GetId()] = ix 3285 OriSizer.Add(origX,0,wx.ALIGN_CENTER_VERTICAL) 3286 Xsizers.append(origX) 3287 if len(atomData): 3288 OriSizer.Add(wx.StaticText(RigidBodies,-1,'Select match to '+refName[0]+': '),0,wx.ALIGN_CENTER_VERTICAL) 3289 atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[0]][ct-1], 3290 choices=atNames[0].keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN) 3291 atPick.Bind(wx.EVT_COMBOBOX, OnAtOrigPick) 3292 Indx[atPick.GetId()] = 0 3293 OriSizer.Add(atPick,0,wx.ALIGN_CENTER_VERTICAL) 3294 data['testRBObj']['Sizers']['Xsizers'] = Xsizers 3295 else: 3296 OriSizer.Add((5,0),) 3297 OriSizer.Add((5,0),) 3298 OriSizer.Add(wx.StaticText(RigidBodies,-1,'Orientation quaternion: '),0,wx.ALIGN_CENTER_VERTICAL) 3299 for ix,x in enumerate(Orien): 3300 orien = wx.TextCtrl(RigidBodies,-1,value='%8.4f'%(x),style=wx.TE_PROCESS_ENTER) 3301 orien.Bind(wx.EVT_TEXT_ENTER,OnOrien) 3302 orien.Bind(wx.EVT_KILL_FOCUS,OnOrien) 3303 Indx[orien.GetId()] = ix 3304 OriSizer.Add(orien,0,wx.ALIGN_CENTER_VERTICAL) 3305 Osizers.append(orien) 3306 data['testRBObj']['Sizers']['Osizers'] = Osizers 3307 OriSizer.Add((5,0),) 3308 if len(atomData): 3309 OriSizer.Add(wx.StaticText(RigidBodies,-1,'Orientation setting: '),0,wx.ALIGN_CENTER_VERTICAL) 3310 for i in [1,2]: 3311 OriSizer.Add(wx.StaticText(RigidBodies,-1,'Select match to '+refName[i]+': '),0,wx.ALIGN_CENTER_VERTICAL) 3312 atPick = wx.ComboBox(RigidBodies,-1,value=atomData[atInd[i]][ct-1], 3313 choices=atNames[i].keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN) 3314 atPick.Bind(wx.EVT_COMBOBOX, OnAtQPick) 3315 Indx[atPick.GetId()] = i 3316 OriSizer.Add(atPick,0,wx.ALIGN_CENTER_VERTICAL) 3317 mainSizer.Add(OriSizer) 3318 mainSizer.Add((5,5),0) 3319 3320 else: 3321 topSizer = wx.BoxSizer(wx.HORIZONTAL) 3322 topSizer.Add(wx.StaticText(RigidBodies,-1,'Select rigid body model'),0,wx.ALIGN_CENTER_VERTICAL) 3323 rbSel = wx.ComboBox(RigidBodies,-1,value='',choices=rbNames.keys(), 3324 style=wx.CB_READONLY|wx.CB_DROPDOWN) 3325 rbSel.Bind(wx.EVT_COMBOBOX, OnRBSel) 3326 topSizer.Add((5,5),0) 3327 topSizer.Add(rbSel,0,wx.ALIGN_CENTER_VERTICAL) 3328 mainSizer.Add(topSizer) 3329 3330 3331 OkBtn = wx.Button(RigidBodies,-1,"Ok") 3332 OkBtn.Bind(wx.EVT_BUTTON, OnOk) 3333 CancelBtn = wx.Button(RigidBodies,-1,'Cancel') 3334 CancelBtn.Bind(wx.EVT_BUTTON, OnCancel) 3335 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 3336 btnSizer.Add((20,20),1) 3337 btnSizer.Add(OkBtn) 3338 btnSizer.Add(CancelBtn) 3339 btnSizer.Add((20,20),1) 3340 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 3341 RigidBodies.SetSizer(mainSizer) 3342 mainSizer.FitInside(RigidBodies) 3343 Size = mainSizer.GetMinSize() 3344 Size[0] += 40 3345 Size[1] = max(Size[1],290) + 35 3346 RigidBodies.SetSize(Size) 3347 RigidBodies.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1) 3348 Size[1] = min(Size[1],450) 3349 G2frame.dataFrame.setSizePosLeft(Size) 3350 3351 Draw() 3352 3164 3353 def OnAutoFindResRB(event): 3165 3354 RBData = G2frame.PatternTree.GetItemPyData( … … 3198 3387 VAR = rbRes['rbXYZ'][rbRef[1]]-rbRes['rbXYZ'][rbRef[0]] 3199 3388 VBR = rbRes['rbXYZ'][rbRef[2]]-rbRes['rbXYZ'][rbRef[0]] 3200 rbObj = {'R esName':rbRes['RBname'],'numChain':numChain}3389 rbObj = {'RBname':rbRes['RBname'],'numChain':numChain} 3201 3390 rbAtoms = [] 3202 3391 rbIds = [] … … 3219 3408 QuatB = G2mth.makeQuat(VBR,VBC,VAR)[0] 3220 3409 QuatC = G2mth.prodQQ(QuatB,QuatA) 3221 rbObj['Orient'] = [QuatC, False]3410 rbObj['Orient'] = [QuatC,' '] 3222 3411 SXYZ = [] 3223 3412 TXYZ = [] … … 3239 3428 data['RBModels']['Residue'] = RBObjs 3240 3429 for RBObj in RBObjs: 3241 G2mth.UpdateResRBAtoms(Amat,Bmat,cx,Atoms,AtLookUp,RBObj,RBData) 3430 newXYZ = G2mth.UpdateResRBAtoms(Bmat,RBObj,RBData) 3431 for i,id in enumerate(RBObj['Ids']): 3432 data['Atoms'][AtLookUp[id]][cx:cx+3] = newXYZ[i] 3242 3433 finally: 3243 3434 wx.EndBusyCursor() … … 3245 3436 3246 3437 def OnRBRemoveAll(event): 3247 print 'remove all RBs' 3248 3438 data['RBModels']['Residue'] = [] 3439 data['RBModels']['Vector'] = [] 3440 FillRigidBodyGrid(True) 3249 3441 3250 3442 def OnGlobalResRBRef(event): … … 3269 3461 rbObj['Orig'][1] = False 3270 3462 if 'Orientation' in parms: 3271 rbObj['Orient'][1] = True3463 rbObj['Orient'][1] = 'Q' 3272 3464 else: 3273 rbObj['Orient'][1] = False3465 rbObj['Orient'][1] = ' ' 3274 3466 for i in range(len(rbObj['Torsions'])): 3275 3467 if 'Torsion '+str(i) in parms: … … 3756 3948 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomInsert, id=G2gd.wxID_ATOMSEDITINSERT) 3757 3949 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomViewInsert, id=G2gd.wxID_ATOMVIEWINSERT) 3758 G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBAssign, id=G2gd.wxID_ASSIGNATMS2RB)3759 3950 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAtomMove, id=G2gd.wxID_ATOMMOVE) 3760 3951 G2frame.dataFrame.Bind(wx.EVT_MENU, AtomDelete, id=G2gd.wxID_ATOMSEDITDELETE) … … 3808 3999 G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.RigidBodiesMenu) 3809 4000 G2frame.dataFrame.Bind(wx.EVT_MENU, OnAutoFindResRB, id=G2gd.wxID_AUTOFINDRESRB) 4001 G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBAssign, id=G2gd.wxID_ASSIGNATMS2RB) 3810 4002 G2frame.dataFrame.Bind(wx.EVT_MENU, OnGlobalResRBRef, id=G2gd.wxID_GLOBALRESREFINE) 3811 4003 G2frame.dataFrame.Bind(wx.EVT_MENU, OnRBRemoveAll, id=G2gd.wxID_RBREMOVEALL) -
trunk/GSASIIplot.py
r843 r851 2605 2605 atomData = data['Atoms'] 2606 2606 mapPeaks = [] 2607 drawingData = data['Drawing'] 2607 2608 if 'Map Peaks' in data: 2608 2609 mapPeaks = np.array(data['Map Peaks']) … … 2610 2611 if len(mapPeaks): 2611 2612 peakMax = np.max(mapPeaks.T[0]) 2612 drawingData = data['Drawing'] 2613 2614 try: 2615 drawAtoms = drawingData['Atoms'] 2616 except KeyError: 2617 drawAtoms = [] 2613 testRBObj = data.get('testRBObj',{}) 2614 rbObj = testRBObj.get('rbObj',{}) 2615 drawAtoms = drawingData.get('Atoms',[]) 2618 2616 mapData = {} 2619 2617 flipData = {} … … 2791 2789 else: 2792 2790 drawingData['oldxy'] = list(xy) 2793 # Draw()2794 2791 2795 2792 def OnMouseMove(event): … … 2797 2794 return 2798 2795 newxy = event.GetPosition() 2799 page = getSelection()2800 2796 2801 if event.Dragging() and not event.ControlDown(): 2802 if event.LeftIsDown(): 2803 SetRotation(newxy) 2804 Q = drawingData['Quaternion'] 2805 G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1) 2806 elif event.RightIsDown(): 2807 SetTranslation(newxy) 2808 Tx,Ty,Tz = drawingData['viewPoint'][0] 2809 G2frame.G2plotNB.status.SetStatusText('New view point: %.4f, %.4f, %.4f'%(Tx,Ty,Tz),1) 2810 elif event.MiddleIsDown(): 2811 SetRotationZ(newxy) 2812 Q = drawingData['Quaternion'] 2813 G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1) 2814 Draw('move') 2797 if event.Dragging(): 2798 if event.AltDown(): 2799 if event.LeftIsDown(): 2800 SetRBRotation(newxy) 2801 Q = rbObj['Orient'][0] 2802 G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1) 2803 elif event.RightIsDown(): 2804 SetRBTranslation(newxy) 2805 Tx,Ty,Tz = rbObj['Orig'][0] 2806 G2frame.G2plotNB.status.SetStatusText('New view point: %.4f, %.4f, %.4f'%(Tx,Ty,Tz),1) 2807 elif event.MiddleIsDown(): 2808 SetRBRotationZ(newxy) 2809 Q = rbObj['Orient'][0] 2810 G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1) 2811 Draw('move') 2812 elif not event.ControlDown(): 2813 if event.LeftIsDown(): 2814 SetRotation(newxy) 2815 Q = drawingData['Quaternion'] 2816 G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1) 2817 elif event.RightIsDown(): 2818 SetTranslation(newxy) 2819 Tx,Ty,Tz = drawingData['viewPoint'][0] 2820 G2frame.G2plotNB.status.SetStatusText('New view point: %.4f, %.4f, %.4f'%(Tx,Ty,Tz),1) 2821 elif event.MiddleIsDown(): 2822 SetRotationZ(newxy) 2823 Q = drawingData['Quaternion'] 2824 G2frame.G2plotNB.status.SetStatusText('New quaternion: %.2f+, %.2fi+ ,%.2fj+, %.2fk'%(Q[0],Q[1],Q[2],Q[3]),1) 2825 Draw('move') 2826 2815 2827 2816 2828 def OnMouseWheel(event): … … 2843 2855 names = [child.GetName() for child in panel] 2844 2856 panel[names.index('viewPoint')].SetValue('%.3f %.3f %.3f'%(VP[0],VP[1],VP[2])) 2857 2858 def SetRBOrigText(): 2859 page = getSelection() 2860 if page: 2861 if G2frame.dataDisplay.GetPageText(page) == 'RB Models': 2862 for i,sizer in enumerate(testRBObj['Sizers']['Xsizers']): 2863 sizer.SetValue('%8.5f'%(testRBObj['rbObj']['Orig'][0][i])) 2864 2865 def SetRBOrienText(): 2866 page = getSelection() 2867 if page: 2868 if G2frame.dataDisplay.GetPageText(page) == 'RB Models': 2869 for i,sizer in enumerate(testRBObj['Sizers']['Osizers']): 2870 sizer.SetValue('%8.5f'%(testRBObj['rbObj']['Orient'][0][i])) 2845 2871 2846 2872 def SetViewDirText(VD): … … 2952 2978 SetViewPointText([Tx,Ty,Tz]) 2953 2979 2980 def SetRBTranslation(newxy): 2981 #first get translation vector in screen coords. 2982 oldxy = drawingData['oldxy'] 2983 if not len(oldxy): oldxy = list(newxy) 2984 dxy = newxy-oldxy 2985 drawingData['oldxy'] = list(newxy) 2986 V = np.array([-dxy[0],dxy[1],0.]) 2987 #then transform to rotated crystal coordinates & apply to RB origin 2988 Q = drawingData['Quaternion'] 2989 V = np.inner(Bmat,G2mth.prodQVQ(G2mth.invQ(Q),V)) 2990 Tx,Ty,Tz = rbObj['Orig'][0] 2991 Tx -= V[0]*0.01 2992 Ty -= V[1]*0.01 2993 Tz -= V[2]*0.01 2994 drawingData['oldxy'] = list(newxy) 2995 rbObj['Orig'][0] = Tx,Ty,Tz 2996 SetRBOrigText() 2997 2954 2998 def SetRotation(newxy): 2955 2999 #first get rotation vector in screen coords. & angle increment … … 2997 3041 Q = G2mth.prodQQ(Q,Qy) 2998 3042 drawingData['Quaternion'] = Q 3043 3044 def SetRBRotation(newxy): 3045 #first get rotation vector in screen coords. & angle increment 3046 oldxy = drawingData['oldxy'] 3047 if not len(oldxy): oldxy = list(newxy) 3048 dxy = newxy-oldxy 3049 drawingData['oldxy'] = list(newxy) 3050 V = np.array([dxy[1],dxy[0],0.]) 3051 A = 0.25*np.sqrt(dxy[0]**2+dxy[1]**2) 3052 # next transform vector back to xtal coordinates via inverse quaternion 3053 # & make new quaternion 3054 Q = rbObj['Orient'][0] #rotate RB to Cart 3055 QC = drawingData['Quaternion'] #rotate Cart to drawing 3056 V = G2mth.prodQVQ(G2mth.invQ(QC),V) 3057 V = G2mth.prodQVQ(G2mth.invQ(Q),V) 3058 DQ = G2mth.AVdeg2Q(A,V) 3059 Q = G2mth.prodQQ(Q,DQ) 3060 rbObj['Orient'][0] = Q 3061 SetRBOrienText() 3062 3063 def SetRBRotationZ(newxy): 3064 #first get rotation vector (= view vector) in screen coords. & angle increment 3065 View = glGetIntegerv(GL_VIEWPORT) 3066 cent = [View[2]/2,View[3]/2] 3067 oldxy = drawingData['oldxy'] 3068 if not len(oldxy): oldxy = list(newxy) 3069 dxy = newxy-oldxy 3070 drawingData['oldxy'] = list(newxy) 3071 V = drawingData['viewDir'] 3072 A = [0,0] 3073 A[0] = dxy[1]*.25 3074 A[1] = dxy[0]*.25 3075 if newxy[0] < cent[0]: 3076 A[0] *= -1 3077 if newxy[1] > cent[1]: 3078 A[1] *= -1 3079 # next transform vector back to RB coordinates & make new quaternion 3080 Q = rbObj['Orient'][0] #rotate RB to cart 3081 V = np.inner(Amat,V) 3082 V = -G2mth.prodQVQ(G2mth.invQ(Q),V) 3083 Qx = G2mth.AVdeg2Q(A[0],V) 3084 Qy = G2mth.AVdeg2Q(A[1],V) 3085 Q = G2mth.prodQQ(Q,Qx) 3086 Q = G2mth.prodQQ(Q,Qy) 3087 rbObj['Orient'][0] = Q 3088 SetRBOrienText() 2999 3089 3000 3090 def RenderBox(): … … 3155 3245 glDisable(GL_COLOR_MATERIAL) 3156 3246 3157 def RenderLabel(x,y,z,label,r ):3247 def RenderLabel(x,y,z,label,r,color): 3158 3248 glPushMatrix() 3159 3249 glTranslate(x,y,z) 3160 3250 glMultMatrixf(B4mat.T) 3161 3251 glDisable(GL_LIGHTING) 3162 glColor3f (0,1.,0)3252 glColor3fv(color) 3163 3253 glRasterPos3f(r,r,r) 3164 3254 for c in list(label): … … 3336 3426 3337 3427 if atom[cs+1] == 'type': 3338 RenderLabel(x,y,z,atom[ct],radius )3428 RenderLabel(x,y,z,atom[ct],radius,Gr) 3339 3429 elif atom[cs+1] == 'name': 3340 RenderLabel(x,y,z,atom[ct-1],radius )3430 RenderLabel(x,y,z,atom[ct-1],radius,Gr) 3341 3431 elif atom[cs+1] == 'number': 3342 RenderLabel(x,y,z,str(iat),radius )3432 RenderLabel(x,y,z,str(iat),radius,Gr) 3343 3433 elif atom[cs+1] == 'residue' and atom[ct-1] == 'CA': 3344 RenderLabel(x,y,z,atom[ct-4],radius )3434 RenderLabel(x,y,z,atom[ct-4],radius,Gr) 3345 3435 elif atom[cs+1] == '1-letter' and atom[ct-1] == 'CA': 3346 RenderLabel(x,y,z,atom[ct-3],radius )3436 RenderLabel(x,y,z,atom[ct-3],radius,Gr) 3347 3437 elif atom[cs+1] == 'chain' and atom[ct-1] == 'CA': 3348 RenderLabel(x,y,z,atom[ct-2],radius )3438 RenderLabel(x,y,z,atom[ct-2],radius,Gr) 3349 3439 # glDisable(GL_BLEND) 3350 3440 if len(rhoXYZ): … … 3360 3450 if showBonds: 3361 3451 RenderLines(x,y,z,mapBonds[ind],Wt) 3452 if len(testRBObj) and pageName == 'RB Models': 3453 XYZ = G2mth.UpdateRBAtoms(Bmat,testRBObj['rbObj'],testRBObj['rbData'],testRBObj['rbType']) 3454 rbBonds = FindPeaksBonds(XYZ) 3455 for ind,[x,y,z] in enumerate(XYZ): 3456 aType = testRBObj['rbAtTypes'][ind] 3457 name = aType+str(ind) 3458 color = np.array(testRBObj['AtInfo'][aType][1]) 3459 RenderSphere(x,y,z,0.2,color/255.) 3460 # RenderMapPeak(x,y,z,color,1.0) 3461 RenderBonds(x,y,z,rbBonds[ind],0.03,Gr) 3462 RenderLabel(x,y,z,name,0.2,Bl) 3362 3463 if Backbones: 3363 3464 for chain in Backbones:
Note: See TracChangeset
for help on using the changeset viewer.