Changeset 885
- Timestamp:
- Apr 13, 2013 1:38:32 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIIO.py
r871 r885 387 387 Value = st.unpack(byteOrd+nVal*'f',File.read(nVal*4)) 388 388 IFD[Tag] = [Type,nVal,Value] 389 print Tag,IFD[Tag]389 # print Tag,IFD[Tag] 390 390 sizexy = [IFD[256][2][0],IFD[257][2][0]] 391 391 [nx,ny] = sizexy -
trunk/GSASIIconstrGUI.py
r883 r885 97 97 ''' 98 98 if not data: 99 data.update({'Hist':[],'HAP':[],'Phase':[]}) #empty dict - fill it 99 data.update({'Hist':[],'HAP':[],'Phase':[],'Global':[]}) #empty dict - fill it 100 if 'Global' not in data: #patch 101 data['Global'] = [] 100 102 Histograms,Phases = G2frame.GetUsedHistogramsAndPhasesfromTree() 101 103 rigidbodyDict = G2frame.PatternTree.GetItemPyData( … … 103 105 rbIds = rigidbodyDict.get('RBIds',{'Vector':[],'Residue':[]}) 104 106 rbVary,rbDict = G2str.GetRigidBodyModels(rigidbodyDict,Print=False) 107 globalList = rbDict.keys() 108 globalList.sort() 105 109 AtomDict = dict([Phases[phase]['pId'],Phases[phase]['Atoms']] for phase in Phases) 106 110 Natoms,atomIndx,phaseVary,phaseDict,pawleyLookup,FFtable,BLtable = G2str.GetPhaseData(Phases,rbIds=rbIds,Print=False) … … 142 146 hlegend = '\n In :h:name' 143 147 phlegend = '\n In p:h:name' 148 glegend = '\n In ::name' 144 149 for phase in Phases: 145 150 plegend += '\n p:: = '+str(Phases[phase]['pId'])+':: for '+phase … … 160 165 break 161 166 count += 1 162 return plegend,hlegend,phlegend 167 return plegend,hlegend,phlegend,glegend 163 168 164 169 def FindEquivVarb(name,nameList): … … 171 176 elif 'AU' in name: 172 177 namelist = ['AUiso','AU11','AU22','AU33','AU12','AU13','AU23'] 178 elif 'RB' in name: 179 rbfx = 'RB'+items[2][2] 180 if 'T' in name and 'Tr' not in name: 181 namelist = [rbfx+'T11',rbfx+'T22',rbfx+'T33',rbfx+'T12',rbfx+'T13',rbfx+'T23'] 182 if 'L' in name: 183 namelist = [rbfx+'L11',rbfx+'L22',rbfx+'L33',rbfx+'L12',rbfx+'L13',rbfx+'L23'] 184 if 'S' in name: 185 namelist = [rbfx+'S12',rbfx+'S13',rbfx+'S21',rbfx+'S23',rbfx+'S31',rbfx+'S32',rbfx+'SAA',rbfx+'SBB'] 186 if 'U' in name: 187 namelist = [rbfx+'U',] 173 188 for item in nameList: 174 189 keys = item.split(':') … … 558 573 Size[1] = min(Size[1],250) 559 574 G2frame.dataFrame.setSizePosLeft(Size) 575 576 def UpdateGlobalConstr(): 577 '''Responds to press on Global Constraint tab, 578 shows constraints in data window''' 579 GlobalConstr.DestroyChildren() 580 GlobalDisplay = wx.Panel(GlobalConstr) 581 GlobalSizer = wx.BoxSizer(wx.VERTICAL) 582 GlobalSizer.Add((5,5),0) 583 GlobalSizer.Add(ConstSizer('Global',GlobalDisplay)) 584 GlobalDisplay.SetSizer(GlobalSizer,True) 585 Size = GlobalSizer.GetMinSize() 586 Size[0] += 40 587 Size[1] = max(Size[1],250) + 20 588 GlobalDisplay.SetSize(Size) 589 GlobalConstr.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1) 590 Size[1] = min(Size[1],250) 591 G2frame.dataFrame.setSizePosLeft(Size) 560 592 561 593 def OnPageChanged(event): … … 575 607 G2frame.Page = [page,'phs'] 576 608 UpdatePhaseConstr() 609 elif text == 'Global constraints': 610 G2frame.Page = [page,'glb'] 611 UpdateGlobalConstr() 612 577 613 578 614 def SetStatusLine(text): 579 615 Status.SetStatusText(text) 580 616 581 plegend,hlegend,phlegend = GetPHlegends(Phases,Histograms)617 plegend,hlegend,phlegend,glegend = GetPHlegends(Phases,Histograms) 582 618 scope = {'hst':['Histogram contraints:',hlegend,histList,'Hist',UpdateHistConstr], 583 619 'hap':['Histogram * Phase contraints:',phlegend,hapList,'HAP',UpdateHAPConstr], 584 'phs':['Phase contraints:',plegend,phaseList,'Phase',UpdatePhaseConstr]} 620 'phs':['Phase contraints:',plegend,phaseList,'Phase',UpdatePhaseConstr], 621 'glb':['Global constraints:',glegend,globalList,'Global',UpdateGlobalConstr]} 585 622 if G2frame.dataDisplay: 586 623 G2frame.dataDisplay.Destroy() … … 604 641 HistConstr = wx.ScrolledWindow(G2frame.dataDisplay) 605 642 G2frame.dataDisplay.AddPage(HistConstr,'Histogram constraints') 643 GlobalConstr = wx.ScrolledWindow(G2frame.dataDisplay) 644 G2frame.dataDisplay.AddPage(GlobalConstr,'Global constraints') 606 645 UpdatePhaseConstr() 607 646 -
trunk/GSASIIlattice.py
r825 r885 240 240 Uij - numpy [3][3] array of uij 241 241 """ 242 U = np.zeros(shape=(3,3)) 243 U = [ 242 U = np.array([ 244 243 [U6[0], U6[3], U6[4]], 245 244 [U6[3], U6[1], U6[5]], 246 [U6[4], U6[5], U6[2]]] 245 [U6[4], U6[5], U6[2]]]) 247 246 return U 248 247 … … 251 250 NB: there is a non numpy version in GSASIIspc: Uij2U 252 251 """ 253 U6 = np.zeros(6) 254 U6 = [U[0][0],U[1][1],U[2][2],U[0][1],U[0][2],U[1][2]] 252 U6 = np.array([U[0][0],U[1][1],U[2][2],U[0][1],U[0][2],U[1][2]]) 255 253 return U6 256 254 -
trunk/GSASIImath.py
r882 r885 268 268 ''' 269 269 TLStype,TLS = RBObj['ThermalMotion'][:2] 270 T mat = np.zeros((3,3))271 L mat = np.zeros((3,3))272 S mat = np.zeros((3,3))270 T = np.zeros(6) 271 L = np.zeros(6) 272 S = np.zeros(8) 273 273 if 'T' in TLStype: 274 274 T = TLS[:6] 275 # Tmat = G2lat.U6toUij(T)276 275 if 'L' in TLStype: 277 276 L = np.array(TLS[6:12])*(np.pi/180.)**2 278 # Lmat = np.array(G2lat.U6toUij(L))279 277 if 'S' in TLStype: 280 278 S = np.array(TLS[12:])*(np.pi/180.) 281 # Smat = np.array([[S[6],S[0],S[1]],[S[2],S[7],S[3]],[S[4],S[5],0]])282 279 g = np.inner(Bmat,Bmat.T) 283 280 gvec = 1./np.sqrt(np.array([g[0][0]**2,g[1][1]**2,g[2][2]**2, … … 287 284 for X in Cart: 288 285 X = prodQVQ(Q,X) 289 # Axyz = np.array([[0,X[2],-X[1]], [-X[2],0,X[0]], [X[1],-X[0],0]])290 286 if 'U' in TLStype: 291 287 Uout.append(['I',TLS[0],0,0,0,0,0,0]) … … 302 298 S[0]*X[1]-S[1]*X[2]+S[7]*X[0] 303 299 Umat = G2lat.U6toUij(U) 304 # print 'Umat: ',Umat305 #wrong? Umat1 = Tmat+np.inner(Axyz,Smat)+np.inner(Smat.T,Axyz.T)+np.inner(np.inner(Axyz.T,Lmat),Axyz)306 # print 'Umat1: ',Umat1307 300 beta = np.inner(np.inner(Bmat,Umat),Bmat.T) 308 301 Uout.append(['A',0.0,]+list(G2lat.UijtoU6(beta)*gvec)) 302 else: 303 Uout.append(['N',]) 309 304 return Uout 310 305 … … 1450 1445 ''' 1451 1446 A = 2.*acosd(Q[0]) 1452 V = np.array( [0.,0.,1.])1447 V = np.array(Q[1:]) 1453 1448 if nl.norm(Q[1:]): 1454 1449 V = Q[1:]/nl.norm(Q[1:]) … … 1460 1455 ''' 1461 1456 A = 2.*np.arccos(Q[0]) 1462 V = np.array( [0.,0.,1.])1457 V = np.array(Q[1:]) 1463 1458 if nl.norm(Q[1:]): 1464 1459 V = Q[1:]/nl.norm(Q[1:]) -
trunk/GSASIIphsGUI.py
r882 r885 3090 3090 RBObj = Indx[Obj.GetId()] 3091 3091 val = Obj.GetValue() 3092 RBObj['ThermalMotion'] = ['None',[],[]]3093 3092 if val == 'Uiso': 3094 RBObj['ThermalMotion'] = ['Uiso',[0.01,],[False,]]3093 RBObj['ThermalMotion'][0] = 'Uiso' 3095 3094 elif val == 'T': 3096 RBObj['ThermalMotion'] = ['T',[0.0 for i in range(6)],[False for i in range(6)]]3095 RBObj['ThermalMotion'][0] = 'T' 3097 3096 elif val == 'TL': 3098 RBObj['ThermalMotion'] = ['TL',[0.0 for i in range(12)],[False for i in range(12)]]3097 RBObj['ThermalMotion'][0] = 'TL' 3099 3098 elif val == 'TLS': 3100 RBObj['ThermalMotion'] = ['TLS',[0.0 for i in range(20)],[False for i in range(20)]] #SAA = S33-S11 & SBB = S22-S333099 RBObj['ThermalMotion'][0] = 'TLS' 3101 3100 wx.CallAfter(FillRigidBodyGrid,True) 3102 3101 … … 3450 3449 return 3451 3450 rbObj['Ids'] = Ids 3452 rbObj['ThermalMotion'] = ['None',[ ],[]] #type,values,flags3451 rbObj['ThermalMotion'] = ['None',[0. for i in range(21)],[False for i in range(21)]] #type,values,flags 3453 3452 rbObj['RBname'] += ':'+str(RBData[rbType][rbId]['useCount']) 3454 3453 RBObjs.append(rbObj) … … 3766 3765 QuatC = G2mth.prodQQ(QuatB,QuatA) 3767 3766 rbObj['Orient'] = [QuatC,' '] 3768 rbObj['ThermalMotion'] = ['None',[ ],[]] #type,values,flags3767 rbObj['ThermalMotion'] = ['None',[0. for i in range(21)],[False for i in range(21)]] #type,values,flags 3769 3768 SXYZ = [] 3770 3769 TXYZ = [] -
trunk/GSASIIplot.py
r867 r885 3459 3459 RenderLines(x,y,z,mapBonds[ind],Wt) 3460 3460 if len(testRBObj) and pageName == 'RB Models': 3461 XYZ = G2mth.UpdateRB Atoms(Bmat,testRBObj['rbObj'],testRBObj['rbData'],testRBObj['rbType'])3461 XYZ = G2mth.UpdateRBXYZ(Bmat,testRBObj['rbObj'],testRBObj['rbData'],testRBObj['rbType'])[0] 3462 3462 rbBonds = FindPeaksBonds(XYZ) 3463 3463 for ind,[x,y,z] in enumerate(XYZ): -
trunk/GSASIIstruct.py
r883 r885 37 37 38 38 ateln2 = 8.0*math.log(2.0) 39 DEBUG = False 39 DEBUG = False #only for powders! 40 40 41 41 def GetControls(GPXfile): … … 580 580 RBrefs = rigidbodyDict['Vector'][item]['VectRef'] 581 581 for i,[mag,ref] in enumerate(zip(RBmags,RBrefs)): 582 pid = '::RBV;'+str(i rb)+':'+str(i)582 pid = '::RBV;'+str(i)+':'+str(irb) 583 583 rbDict[pid] = mag 584 584 if ref: … … 621 621 RBmags = rigidbodyDict['Vector'][item]['VectMag'] 622 622 for i,mag in enumerate(RBmags): 623 name = '::RBV;'+str(i rb)+':'+str(i)623 name = '::RBV;'+str(i)+':'+str(irb) 624 624 mag = parmDict[name] 625 625 if name in sigDict: … … 645 645 VRBData = RBData['Vector'] 646 646 for i,rbId in enumerate(VRBIds): 647 pfxRB = '::RBV;'+str(i)+':'648 647 for j in range(len(VRBData[rbId]['VectMag'])): 649 VRBData[rbId]['VectMag'][j] = parmDict[pfxRB+str(j)] 648 name = '::RBV;'+str(j)+':'+str(i) 649 VRBData[rbId]['VectMag'][j] = parmDict[name] 650 650 for phase in Phases: 651 651 Phase = Phases[phase] … … 669 669 if 'T' in TLS[0]: 670 670 for i,pt in enumerate(['RBVT11:','RBVT22:','RBVT33:','RBVT12:','RBVT13:','RBVT23:']): 671 RBObj['ThermalMotion'][1][i] = parmDict[pfx+pt+rbsx]671 TLS[1][i] = parmDict[pfx+pt+rbsx] 672 672 if 'L' in TLS[0]: 673 673 for i,pt in enumerate(['RBVL11:','RBVL22:','RBVL33:','RBVL12:','RBVL13:','RBVL23:']): 674 RBObj['ThermalMotion'][1][i+6] = parmDict[pfx+pt+rbsx]674 TLS[1][i+6] = parmDict[pfx+pt+rbsx] 675 675 if 'S' in TLS[0]: 676 676 for i,pt in enumerate(['RBVS12:','RBVS13:','RBVS21:','RBVS23:','RBVS31:','RBVS32:','RBVSAA:','RBVSBB:']): 677 RBObj['ThermalMotion'][1][i+12] = parmDict[pfx+pt+rbsx]677 TLS[1][i+12] = parmDict[pfx+pt+rbsx] 678 678 if 'U' in TLS[0]: 679 RBObj['ThermalMotion'][1][0] = parmDict[pfx+'RBVU:'+rbsx]679 TLS[1][0] = parmDict[pfx+'RBVU:'+rbsx] 680 680 XYZ,Cart = G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Vector') 681 681 UIJ = G2mth.UpdateRBUIJ(Bmat,Cart,RBObj) … … 684 684 for j in [0,1,2]: 685 685 parmDict[pfx+atxIds[j]+str(AtLookup[atId])] = x[j] 686 if UIJ[ 0] == 'A':686 if UIJ[i][0] == 'A': 687 687 for j in range(6): 688 parmDict[pfx+atuIds[j]+str(AtLookup[atId])] = Uij[j+2] 689 elif UIJ[0] == 'I': 690 parmDict[pfx+'AUiso:'+str(AtLookup[atId])] = Uij[j+1] 688 parmDict[pfx+atuIds[j]+str(AtLookup[atId])] = UIJ[i][j+2] 689 elif UIJ[i][0] == 'I': 690 parmDict[pfx+'AUiso:'+str(AtLookup[atId])] = UIJ[i][1] 691 691 692 for irb,RBObj in enumerate(RBModels.get('Residue',[])): 692 693 jrb = RRBIds.index(RBObj['RBId']) … … 716 717 for j in [0,1,2]: 717 718 parmDict[pfx+atxIds[j]+str(AtLookup[atId])] = x[j] 718 if UIJ[ 0] == 'A':719 if UIJ[i][0] == 'A': 719 720 for j in range(6): 720 parmDict[pfx+atuIds[j]+str(AtLookup[atId])] = Uij[j+2] 721 elif UIJ[0] == 'I': 722 parmDict[pfx+'AUiso:'+str(AtLookup[atId])] = Uij[j+1] 721 parmDict[pfx+atuIds[j]+str(AtLookup[atId])] = UIJ[i][j+2] 722 elif UIJ[i][0] == 'I': 723 parmDict[pfx+'AUiso:'+str(AtLookup[atId])] = UIJ[i][1] 724 725 def ApplyRBModelDervs(dFdvDict,parmDict,rigidbodyDict,Phase): 726 atxIds = ['dAx:','dAy:','dAz:'] 727 atuIds = ['AU11:','AU22:','AU33:','AU12:','AU13:','AU23:'] 728 TIds = ['T11:','T22:','T33:','T12:','T13:','T23:'] 729 LIds = ['L11:','L22:','L33:','L12:','L13:','L23:'] 730 SIds = ['S12:','S13:','S21:','S23:','S31:','S32:','SAA:','SBB:'] 731 PIds = ['Px:','Py:','Pz:'] 732 OIds = ['Oa:','Oi:','Oj:','Ok:'] 733 RBIds = rigidbodyDict.get('RBIds',{'Vector':[],'Residue':[]}) #these are lists of rbIds 734 if not RBIds['Vector'] and not RBIds['Residue']: 735 return 736 VRBIds = RBIds['Vector'] 737 RRBIds = RBIds['Residue'] 738 RBData = rigidbodyDict 739 for item in parmDict: 740 if 'RB' in item: 741 dFdvDict[item] = 0. #NB: this is a vector which is no. refl. long & must be filled! 742 General = Phase['General'] 743 cell = General['Cell'][1:7] 744 Amat,Bmat = G2lat.cell2AB(cell) 745 rpd = np.pi/180. 746 rpd2 = rpd**2 747 g = np.inner(Bmat,Bmat.T) 748 gvec = np.sqrt(np.array([g[0][0]**2,g[1][1]**2,g[2][2]**2, 749 g[0][0]*g[1][1],g[0][0]*g[2][2],g[1][1]*g[2][2]])) 750 AtLookup = G2mth.FillAtomLookUp(Phase['Atoms']) 751 pfx = str(Phase['pId'])+'::' 752 RBModels = Phase['RBModels'] 753 dx = 0.0001 754 for irb,RBObj in enumerate(RBModels.get('Vector',[])): 755 VModel = RBData['Vector'][RBObj['RBId']] 756 Q = RBObj['Orient'][0] 757 Pos = RBObj['Orig'][0] 758 jrb = VRBIds.index(RBObj['RBId']) 759 rbsx = str(irb)+':'+str(jrb) 760 dXdv = [] 761 for iv in range(len(VModel['VectMag'])): 762 dXdv.append(np.inner(Bmat,VModel['rbVect'][iv]).T) 763 XYZ,Cart = G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Vector') 764 for ia,atId in enumerate(RBObj['Ids']): 765 atNum = AtLookup[atId] 766 for iv in range(len(VModel['VectMag'])): 767 for ix in [0,1,2]: 768 dFdvDict['::RBV;'+str(iv)+':'+str(jrb)] += dXdv[iv][ia][ix]*dFdvDict[pfx+atxIds[ix]+str(atNum)] 769 for i,name in enumerate(['RBVPx:','RBVPy:','RBVPz:']): 770 dFdvDict[pfx+name+rbsx] += dFdvDict[pfx+atxIds[i]+str(atNum)] 771 for iv in range(4): 772 Q[iv] -= dx 773 XYZ1,Cart1 = G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Vector') 774 Q[iv] += 2.*dx 775 XYZ2,Cart2 = G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Vector') 776 Q[iv] -= dx 777 dXdO = (XYZ2[ia]-XYZ1[ia])/(2.*dx) 778 for ix in [0,1,2]: 779 dFdvDict[pfx+'RBV'+OIds[iv]+rbsx] += dXdO[ix]*dFdvDict[pfx+atxIds[ix]+str(atNum)] 780 X = G2mth.prodQVQ(Q,Cart[ia]) 781 dFdu = np.array([dFdvDict[pfx+Uid+str(AtLookup[atId])] for Uid in atuIds]).T*gvec 782 dFdu = G2lat.U6toUij(dFdu.T) 783 dFdu = np.tensordot(Amat.T,np.tensordot(Amat,dFdu,([1,0])),([0,1])) 784 dFdu = G2lat.UijtoU6(dFdu) 785 atNum = AtLookup[atId] 786 if 'T' in RBObj['ThermalMotion'][0]: 787 for i,name in enumerate(['RBVT11:','RBVT22:','RBVT33:','RBVT12:','RBVT13:','RBVT23:']): 788 dFdvDict[pfx+name+rbsx] += dFdu[i] 789 if 'L' in RBObj['ThermalMotion'][0]: 790 dFdvDict[pfx+'RBVL11:'+rbsx] += rpd2*(dFdu[1]*X[2]**2+dFdu[2]*X[1]**2-dFdu[5]*X[1]*X[2]) 791 dFdvDict[pfx+'RBVL22:'+rbsx] += rpd2*(dFdu[0]*X[2]**2+dFdu[2]*X[0]**2-dFdu[4]*X[0]*X[2]) 792 dFdvDict[pfx+'RBVL33:'+rbsx] += rpd2*(dFdu[0]*X[1]**2+dFdu[1]*X[0]**2-dFdu[3]*X[0]*X[1]) 793 dFdvDict[pfx+'RBVL12:'+rbsx] += rpd2*(-dFdu[3]*X[2]**2-2.*dFdu[2]*X[0]*X[1]+ 794 dFdu[4]*X[1]*X[2]+dFdu[5]*X[0]*X[2]) 795 dFdvDict[pfx+'RBVL13:'+rbsx] += rpd2*(dFdu[0]*X[1]**2-2.*dFdu[1]*X[0]*X[2]+ 796 dFdu[3]*X[1]*X[2]+dFdu[5]*X[0]*X[1]) 797 dFdvDict[pfx+'RBVL23:'+rbsx] += rpd2*(dFdu[0]*X[1]**2-2.*dFdu[0]*X[1]*X[2]+ 798 dFdu[3]*X[0]*X[2]+dFdu[4]*X[0]*X[1]) 799 if 'S' in RBObj['ThermalMotion'][0]: 800 dFdvDict[pfx+'RBVS12:'+rbsx] += rpd*(dFdu[5]*X[1]-2.*dFdu[1]*X[2]) 801 dFdvDict[pfx+'RBVS13:'+rbsx] += rpd*(-dFdu[5]*X[2]+2.*dFdu[2]*X[1]) 802 dFdvDict[pfx+'RBVS21:'+rbsx] += rpd*(-dFdu[4]*X[0]+2.*dFdu[0]*X[2]) 803 dFdvDict[pfx+'RBVS23:'+rbsx] += rpd*(dFdu[4]*X[2]-2.*dFdu[2]*X[0]) 804 dFdvDict[pfx+'RBVS31:'+rbsx] += rpd*(dFdu[3]*X[0]-2.*dFdu[0]*X[1]) 805 dFdvDict[pfx+'RBVS32:'+rbsx] += rpd*(-dFdu[3]*X[1]+2.*dFdu[1]*X[0]) 806 dFdvDict[pfx+'RBVSAA:'+rbsx] += rpd*(dFdu[4]*X[1]-dFdu[3]*X[2]) 807 dFdvDict[pfx+'RBVSBB:'+rbsx] += rpd*(dFdu[5]*X[0]-dFdu[3]*X[2]) 808 if 'U' in RBObj['ThermalMotion'][0]: 809 dFdvDict[pfx+'RBVU:'+rbsx] += dFdvDict[pfx+'AUiso:'+str(AtLookup[atId])] 810 811 for irb,RBObj in enumerate(RBModels.get('Residue',[])): 812 Q = RBObj['Orient'][0] 813 Pos = RBObj['Orig'][0] 814 jrb = RRBIds.index(RBObj['RBId']) 815 rbsx = str(irb)+':'+str(jrb) 816 XYZ,Cart = G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Residue') 817 for ia,atId in enumerate(RBObj['Ids']): 818 atNum = AtLookup[atId] 819 dx = 0.0001 820 for i,name in enumerate(['RBRPx:','RBRPy:','RBRPz:']): 821 dFdvDict[pfx+name+rbsx] += dFdvDict[pfx+atxIds[i]+str(atNum)] 822 for iv in range(4): 823 Q[iv] -= dx 824 XYZ1,Cart1 = G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Residue') 825 Q[iv] += 2.*dx 826 XYZ2,Cart2 = G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Residue') 827 Q[iv] -= dx 828 dXdO = (XYZ2[ia]-XYZ1[ia])/(2.*dx) 829 for ix in [0,1,2]: 830 dFdvDict[pfx+'RBR'+OIds[iv]+rbsx] += dXdO[ix]*dFdvDict[pfx+atxIds[ix]+str(atNum)] 831 X = G2mth.prodQVQ(Q,Cart[ia]) 832 dFdu = np.array([dFdvDict[pfx+Uid+str(AtLookup[atId])] for Uid in atuIds]).T*gvec 833 dFdu = G2lat.U6toUij(dFdu.T) 834 dFdu = np.tensordot(Amat.T,np.tensordot(Amat,dFdu,([1,0])),([0,1])) 835 dFdu = G2lat.UijtoU6(dFdu) 836 atNum = AtLookup[atId] 837 if 'T' in RBObj['ThermalMotion'][0]: 838 for i,name in enumerate(['RBRT11:','RBRT22:','RBRT33:','RBRT12:','RBRT13:','RBRT23:']): 839 dFdvDict[pfx+name+rbsx] += dFdu[i] 840 if 'L' in RBObj['ThermalMotion'][0]: 841 dFdvDict[pfx+'RBRL11:'+rbsx] += rpd2*(dFdu[1]*X[2]**2+dFdu[2]*X[1]**2-dFdu[5]*X[1]*X[2]) 842 dFdvDict[pfx+'RBRL22:'+rbsx] += rpd2*(dFdu[0]*X[2]**2+dFdu[2]*X[0]**2-dFdu[4]*X[0]*X[2]) 843 dFdvDict[pfx+'RBRL33:'+rbsx] += rpd2*(dFdu[0]*X[1]**2+dFdu[1]*X[0]**2-dFdu[3]*X[0]*X[1]) 844 dFdvDict[pfx+'RBRL12:'+rbsx] += rpd2*(-dFdu[3]*X[2]**2-2.*dFdu[2]*X[0]*X[1]+ 845 dFdu[4]*X[1]*X[2]+dFdu[5]*X[0]*X[2]) 846 dFdvDict[pfx+'RBRL13:'+rbsx] += rpd2*(dFdu[0]*X[1]**2-2.*dFdu[1]*X[0]*X[2]+ 847 dFdu[3]*X[1]*X[2]+dFdu[5]*X[0]*X[1]) 848 dFdvDict[pfx+'RBRL23:'+rbsx] += rpd2*(dFdu[0]*X[1]**2-2.*dFdu[0]*X[1]*X[2]+ 849 dFdu[3]*X[0]*X[2]+dFdu[4]*X[0]*X[1]) 850 if 'S' in RBObj['ThermalMotion'][0]: 851 dFdvDict[pfx+'RBRS12:'+rbsx] += rpd*(dFdu[5]*X[1]-2.*dFdu[1]*X[2]) 852 dFdvDict[pfx+'RBRS13:'+rbsx] += rpd*(-dFdu[5]*X[2]+2.*dFdu[2]*X[1]) 853 dFdvDict[pfx+'RBRS21:'+rbsx] += rpd*(-dFdu[4]*X[0]+2.*dFdu[0]*X[2]) 854 dFdvDict[pfx+'RBRS23:'+rbsx] += rpd*(dFdu[4]*X[2]-2.*dFdu[2]*X[0]) 855 dFdvDict[pfx+'RBRS31:'+rbsx] += rpd*(dFdu[3]*X[0]-2.*dFdu[0]*X[1]) 856 dFdvDict[pfx+'RBRS32:'+rbsx] += rpd*(-dFdu[3]*X[1]+2.*dFdu[1]*X[0]) 857 dFdvDict[pfx+'RBRSAA:'+rbsx] += rpd*(dFdu[4]*X[1]-dFdu[3]*X[2]) 858 dFdvDict[pfx+'RBRSBB:'+rbsx] += rpd*(dFdu[5]*X[0]-dFdu[3]*X[2]) 859 if 'U' in RBObj['ThermalMotion'][0]: 860 dFdvDict[pfx+'RBRU:'+rbsx] += dFdvDict[pfx+'AUiso:'+str(AtLookup[atId])] 861 723 862 724 863 ################################################################################ … … 1325 1464 print >>pFile,sigstr 1326 1465 1327 def PrintRBObjTLSAndSig(rbfx,rbsx ):1466 def PrintRBObjTLSAndSig(rbfx,rbsx,TLS): 1328 1467 namstr = ' names :' 1329 1468 valstr = ' values:' 1330 1469 sigstr = ' esds :' 1331 for i,pt in enumerate(['T11:','T22:','T33:','T12:','T13:','T23:']): 1332 name = pfx+rbfx+pt+rbsx 1333 namstr += '%12s'%(pt[:3]) 1334 valstr += '%12.5f'%(parmDict[name]) 1470 if 'T' in TLS: 1471 for i,pt in enumerate(['T11:','T22:','T33:','T12:','T13:','T23:']): 1472 name = pfx+rbfx+pt+rbsx 1473 namstr += '%12s'%(pt[:3]) 1474 valstr += '%12.5f'%(parmDict[name]) 1475 if name in sigDict: 1476 sigstr += '%12.5f'%(sigDict[name]) 1477 else: 1478 sigstr += 12*' ' 1479 print >>pFile,namstr 1480 print >>pFile,valstr 1481 print >>pFile,sigstr 1482 if 'L' in TLS: 1483 namstr = ' names :' 1484 valstr = ' values:' 1485 sigstr = ' esds :' 1486 for i,pt in enumerate(['L11:','L22:','L33:','L12:','L13:','L23:']): 1487 name = pfx+rbfx+pt+rbsx 1488 namstr += '%12s'%(pt[:3]) 1489 valstr += '%12.3f'%(parmDict[name]) 1490 if name in sigDict: 1491 sigstr += '%12.3f'%(sigDict[name]) 1492 else: 1493 sigstr += 12*' ' 1494 print >>pFile,namstr 1495 print >>pFile,valstr 1496 print >>pFile,sigstr 1497 if 'S' in TLS: 1498 namstr = ' names :' 1499 valstr = ' values:' 1500 sigstr = ' esds :' 1501 for i,pt in enumerate(['S12:','S13:','S21:','S23:','S31:','S32:','SAA:','SBB:']): 1502 name = pfx+rbfx+pt+rbsx 1503 namstr += '%12s'%(pt[:3]) 1504 valstr += '%12.3f'%(parmDict[name]) 1505 if name in sigDict: 1506 sigstr += '%12.3f'%(sigDict[name]) 1507 else: 1508 sigstr += 12*' ' 1509 print >>pFile,namstr 1510 print >>pFile,valstr 1511 print >>pFile,sigstr 1512 if 'U' in TLS: 1513 name = pfx+rbfx+'U:'+rbsx 1514 namstr = ' names :'+'%12s'%('U') 1515 valstr = ' values:'+'%12.3f'%(parmDict[name]) 1335 1516 if name in sigDict: 1336 sigstr += '%12.5f'%(sigDict[name])1517 sigstr = ' esds :'+'%12.3f'%(sigDict[name]) 1337 1518 else: 1338 sigstr += 12*' ' 1339 print >>pFile,namstr 1340 print >>pFile,valstr 1341 print >>pFile,sigstr 1342 namstr = ' names :' 1343 valstr = ' values:' 1344 sigstr = ' esds :' 1345 for i,pt in enumerate(['L11:','L22:','L33:','L12:','L13:','L23:']): 1346 name = pfx+rbfx+pt+rbsx 1347 namstr += '%12s'%(pt[:3]) 1348 valstr += '%12.3f'%(parmDict[name]) 1349 if name in sigDict: 1350 sigstr += '%12.3f'%(sigDict[name]) 1351 else: 1352 sigstr += 12*' ' 1353 print >>pFile,namstr 1354 print >>pFile,valstr 1355 print >>pFile,sigstr 1356 namstr = ' names :' 1357 valstr = ' values:' 1358 sigstr = ' esds :' 1359 for i,pt in enumerate(['S12:','S13:','S21:','S23:','S31:','S32:','SAA:','SBB:']): 1360 name = pfx+rbfx+pt+rbsx 1361 namstr += '%12s'%(pt[:3]) 1362 valstr += '%12.3f'%(parmDict[name]) 1363 if name in sigDict: 1364 sigstr += '%12.3f'%(sigDict[name]) 1365 else: 1366 sigstr += 12*' ' 1367 print >>pFile,namstr 1368 print >>pFile,valstr 1369 print >>pFile,sigstr 1519 sigstr = ' esds :'+12*' ' 1520 print >>pFile,namstr 1521 print >>pFile,valstr 1522 print >>pFile,sigstr 1523 1370 1524 1371 1525 def PrintRBObjTorAndSig(rbsx): … … 1474 1628 print >>pFile,' Vector rigid body ' 1475 1629 PrintRBObjPOAndSig('RBV',rbsx) 1476 PrintRBObjTLSAndSig('RBV',rbsx )1630 PrintRBObjTLSAndSig('RBV',rbsx,RBObj['ThermalMotion'][0]) 1477 1631 for irb,RBObj in enumerate(RBModels.get('Residue',[])): 1478 jrb = VRBIds.index(RBObj['RBId'])1632 jrb = RRBIds.index(RBObj['RBId']) 1479 1633 rbsx = str(irb)+':'+str(jrb) 1480 1634 print >>pFile,' Residue rigid body ' 1481 1635 PrintRBObjPOAndSig('RBR',rbsx) 1482 PrintRBObjTLSAndSig('RBR',rbsx )1636 PrintRBObjTLSAndSig('RBR',rbsx,RBObj['ThermalMotion'][0]) 1483 1637 PrintRBObjTorAndSig(rbsx) 1484 1638 atomsSig = {} … … 2871 3025 dFdvDict[pfx+'BabA'] = dFdbab.T[0] 2872 3026 dFdvDict[pfx+'BabU'] = dFdbab.T[1] 2873 # or else do RB modification of dFdvDict here? Perhaps not...2874 3027 return dFdvDict 2875 3028 … … 3529 3682 return yc,yb 3530 3683 3531 def getPowderProfileDerv(parmDict,x,varylist,Histogram,Phases, calcControls,pawleyLookup):3684 def getPowderProfileDerv(parmDict,x,varylist,Histogram,Phases,rigidbodyDict,calcControls,pawleyLookup): 3532 3685 3533 3686 def cellVaryDerv(pfx,SGData,dpdA): … … 3608 3761 if not Phase['General'].get('doPawley'): 3609 3762 dFdvDict = StructureFactorDerv(refList,G,hfx,pfx,SGData,calcControls,parmDict) 3763 ApplyRBModelDervs(dFdvDict,parmDict,rigidbodyDict,Phase) 3610 3764 for iref,refl in enumerate(refList): 3611 3765 if 'C' in calcControls[hfx+'histType']: #CW powder … … 3747 3901 print 'TOF Undefined at present' 3748 3902 raise Exception #no TOF yet 3749 #do atom derivatives - for F,X & U so far3903 #do atom derivatives - for RB,F,X & U so far 3750 3904 corr = dervDict['int']/refl[9] 3751 3905 if Ka2: … … 3754 3908 try: 3755 3909 aname = name.split(pfx)[1][:2] 3756 if aname not in ['Af','dA','AU' ]: continue # skip anything not an atomparam3910 if aname not in ['Af','dA','AU','RB']: continue # skip anything not an atom or rigid body param 3757 3911 except IndexError: 3758 3912 continue … … 3769 3923 return dMdv 3770 3924 3771 def dervRefine(values,HistoPhases,parm dict,varylist,calcControls,pawleyLookup,dlg):3772 parm dict.update(zip(varylist,values))3773 G2mv.Dict2Map(parm dict,varylist)3925 def dervRefine(values,HistoPhases,parmDict,varylist,calcControls,pawleyLookup,dlg): 3926 parmDict.update(zip(varylist,values)) 3927 G2mv.Dict2Map(parmDict,varylist) 3774 3928 Histograms,Phases,restraintDict,rigidbodyDict = HistoPhases 3775 3929 nvar = len(varylist) … … 3788 3942 xB = np.searchsorted(x,Limits[0]) 3789 3943 xF = np.searchsorted(x,Limits[1]) 3790 dMdvh = np.sqrt(W[xB:xF])*getPowderProfileDerv(parm dict,x[xB:xF],3791 varylist,Histogram,Phases, calcControls,pawleyLookup)3944 dMdvh = np.sqrt(W[xB:xF])*getPowderProfileDerv(parmDict,x[xB:xF], 3945 varylist,Histogram,Phases,rigidbodyDict,calcControls,pawleyLookup) 3792 3946 elif 'HKLF' in histogram[:4]: 3793 3947 Histogram = Histograms[histogram] … … 3801 3955 phfx = '%d:%d:'%(Phase['pId'],hId) 3802 3956 SGData = Phase['General']['SGData'] 3803 A = [parm dict[pfx+'A%d'%(i)] for i in range(6)]3957 A = [parmDict[pfx+'A%d'%(i)] for i in range(6)] 3804 3958 G,g = G2lat.A2Gmat(A) #recip & real metric tensors 3805 3959 refList = Histogram['Data'] 3806 dFdvDict = StructureFactorDerv(refList,G,hfx,pfx,SGData,calcControls,parm dict)3807 # do RB modification of dFdvDict here; varylist will contain RB variables so dFdvDict needs corresponding entries 3960 dFdvDict = StructureFactorDerv(refList,G,hfx,pfx,SGData,calcControls,parmDict) 3961 ApplyRBModelDervs(dFdvDict,parmDict,rigidbodyDict,Phase) 3808 3962 dMdvh = np.zeros((len(varylist),len(refList))) 3809 3963 for iref,ref in enumerate(refList): 3810 3964 if ref[6] > 0: 3811 dervCor,dervDict = SCExtinction(ref,phfx,hfx,pfx,calcControls,parm dict,varylist) #puts correction in refl[13]3965 dervCor,dervDict = SCExtinction(ref,phfx,hfx,pfx,calcControls,parmDict,varylist) #puts correction in refl[13] 3812 3966 if calcControls['F**2']: 3813 3967 if ref[5]/ref[6] >= calcControls['minF/sig']: … … 3839 3993 dMdv = dMdvh 3840 3994 3841 pNames,pVals,pWt = penaltyFxn(HistoPhases,parm dict,varylist)3995 pNames,pVals,pWt = penaltyFxn(HistoPhases,parmDict,varylist) 3842 3996 if np.any(pVals): 3843 dpdv = penaltyDeriv(pNames,pVals,HistoPhases,parm dict,varylist)3997 dpdv = penaltyDeriv(pNames,pVals,HistoPhases,parmDict,varylist) 3844 3998 dMdv = np.concatenate((dMdv.T,dpdv.T)).T 3845 3999 3846 4000 return dMdv 3847 4001 3848 def HessRefine(values,HistoPhases,parm dict,varylist,calcControls,pawleyLookup,dlg):3849 parm dict.update(zip(varylist,values))3850 G2mv.Dict2Map(parm dict,varylist)4002 def HessRefine(values,HistoPhases,parmDict,varylist,calcControls,pawleyLookup,dlg): 4003 parmDict.update(zip(varylist,values)) 4004 G2mv.Dict2Map(parmDict,varylist) 3851 4005 Histograms,Phases,restraintDict,rigidbodyDict = HistoPhases 4006 ApplyRBModels(parmDict,Phases,rigidbodyDict) #,Update=True?? 3852 4007 nvar = len(varylist) 3853 4008 Hess = np.empty(0) … … 3866 4021 xB = np.searchsorted(x,Limits[0]) 3867 4022 xF = np.searchsorted(x,Limits[1]) 3868 dMdvh = getPowderProfileDerv(parm dict,x[xB:xF],3869 varylist,Histogram,Phases, calcControls,pawleyLookup)4023 dMdvh = getPowderProfileDerv(parmDict,x[xB:xF], 4024 varylist,Histogram,Phases,rigidbodyDict,calcControls,pawleyLookup) 3870 4025 Wt = np.sqrt(W[xB:xF])[np.newaxis,:] 3871 4026 Dy = dy[xB:xF][np.newaxis,:] … … 3892 4047 phfx = '%d:%d:'%(Phase['pId'],hId) 3893 4048 SGData = Phase['General']['SGData'] 3894 A = [parm dict[pfx+'A%d'%(i)] for i in range(6)]4049 A = [parmDict[pfx+'A%d'%(i)] for i in range(6)] 3895 4050 G,g = G2lat.A2Gmat(A) #recip & real metric tensors 3896 4051 refList = Histogram['Data'] 3897 dFdvDict = StructureFactorDerv(refList,G,hfx,pfx,SGData,calcControls,parm dict)3898 # do RB modification of dFdvDict here; varylist will contain RB variables so dFdvDict needs corresponding entries 4052 dFdvDict = StructureFactorDerv(refList,G,hfx,pfx,SGData,calcControls,parmDict) 4053 ApplyRBModelDervs(dFdvDict,parmDict,rigidbodyDict,Phase) 3899 4054 dMdvh = np.zeros((len(varylist),len(refList))) 3900 4055 wdf = np.zeros(len(refList)) 3901 4056 for iref,ref in enumerate(refList): 3902 4057 if ref[6] > 0: 3903 dervCor,dervDict = SCExtinction(ref,phfx,hfx,pfx,calcControls,parm dict,varylist) #puts correction in refl[13]4058 dervCor,dervDict = SCExtinction(ref,phfx,hfx,pfx,calcControls,parmDict,varylist) #puts correction in refl[13] 3904 4059 if calcControls['F**2']: 3905 4060 if ref[5]/ref[6] >= calcControls['minF/sig']: … … 3937 4092 else: 3938 4093 continue #skip non-histogram entries 3939 pNames,pVals,pWt = penaltyFxn(HistoPhases,parm dict,varylist)4094 pNames,pVals,pWt = penaltyFxn(HistoPhases,parmDict,varylist) 3940 4095 if np.any(pVals): 3941 dpdv = penaltyDeriv(pNames,pVals,HistoPhases,parm dict,varylist)4096 dpdv = penaltyDeriv(pNames,pVals,HistoPhases,parmDict,varylist) 3942 4097 Vec += np.sum(dpdv*pWt*pVals,axis=1) 3943 4098 Hess += np.inner(dpdv*pWt,dpdv) 3944 4099 return Vec,Hess 3945 4100 3946 def errRefine(values,HistoPhases,parm dict,varylist,calcControls,pawleyLookup,dlg):3947 parm dict.update(zip(varylist,values))3948 Values2Dict(parm dict, varylist, values)3949 G2mv.Dict2Map(parm dict,varylist)4101 def errRefine(values,HistoPhases,parmDict,varylist,calcControls,pawleyLookup,dlg): 4102 parmDict.update(zip(varylist,values)) 4103 Values2Dict(parmDict, varylist, values) 4104 G2mv.Dict2Map(parmDict,varylist) 3950 4105 Histograms,Phases,restraintDict,rigidbodyDict = HistoPhases 3951 4106 M = np.empty(0) 3952 4107 SumwYo = 0 3953 4108 Nobs = 0 3954 ApplyRBModels(parm dict,Phases,rigidbodyDict)4109 ApplyRBModels(parmDict,Phases,rigidbodyDict) 3955 4110 histoList = Histograms.keys() 3956 4111 histoList.sort() … … 3973 4128 Histogram['sumwYo'] = np.sum(W[xB:xF]*y[xB:xF]**2) 3974 4129 SumwYo += Histogram['sumwYo'] 3975 yc[xB:xF],yb[xB:xF] = getPowderProfile(parm dict,x[xB:xF],4130 yc[xB:xF],yb[xB:xF] = getPowderProfile(parmDict,x[xB:xF], 3976 4131 varylist,Histogram,Phases,calcControls,pawleyLookup) 3977 4132 yc[xB:xF] += yb[xB:xF] … … 3994 4149 phfx = '%d:%d:'%(Phase['pId'],hId) 3995 4150 SGData = Phase['General']['SGData'] 3996 A = [parm dict[pfx+'A%d'%(i)] for i in range(6)]4151 A = [parmDict[pfx+'A%d'%(i)] for i in range(6)] 3997 4152 G,g = G2lat.A2Gmat(A) #recip & real metric tensors 3998 4153 refList = Histogram['Data'] 3999 refList = StructureFactor(refList,G,hfx,pfx,SGData,calcControls,parm dict)4154 refList = StructureFactor(refList,G,hfx,pfx,SGData,calcControls,parmDict) 4000 4155 df = np.zeros(len(refList)) 4001 4156 sumwYo = 0 … … 4007 4162 for i,ref in enumerate(refList): 4008 4163 if ref[6] > 0: 4009 SCExtinction(ref,phfx,hfx,pfx,calcControls,parm dict,varylist) #puts correction in refl[13]4010 ref[7] = parm dict[phfx+'Scale']*ref[9]4164 SCExtinction(ref,phfx,hfx,pfx,calcControls,parmDict,varylist) #puts correction in refl[13] 4165 ref[7] = parmDict[phfx+'Scale']*ref[9] 4011 4166 ref[7] *= ref[13] 4012 ref[8] = ref[5]/parm dict[phfx+'Scale']4167 ref[8] = ref[5]/parmDict[phfx+'Scale'] 4013 4168 if calcControls['F**2']: 4014 4169 if ref[5]/ref[6] >= calcControls['minF/sig']: … … 4052 4207 GoOn = dlg.Update(Rw,newmsg='%s%8.3f%s'%('All data Rw =',Rw,'%'))[0] 4053 4208 if not GoOn: 4054 parm dict['saved values'] = values4209 parmDict['saved values'] = values 4055 4210 dlg.Destroy() 4056 4211 raise Exception #Abort!! 4057 pDict,pVals,pWt = penaltyFxn(HistoPhases,parm dict,varylist)4212 pDict,pVals,pWt = penaltyFxn(HistoPhases,parmDict,varylist) 4058 4213 if np.any(pVals): 4059 4214 pSum = np.sum(pWt*pVals**2) … … 4222 4377 cPickle.dump(Histogram,fl,1) 4223 4378 cPickle.dump(Phases,fl,1) 4379 cPickle.dump(rigidbodyDict,fl,1) 4224 4380 cPickle.dump(calcControls,fl,1) 4225 4381 cPickle.dump(pawleyLookup,fl,1) -
trunk/testGSASIIstruct.py
r866 r885 20 20 global Phases 21 21 Phases = cPickle.load(file) 22 global RBData 23 RBData = cPickle.load(file) 22 24 global calcControls 23 25 calcControls = cPickle.load(file) … … 38 40 fplot = plotter.add('function test').gca() 39 41 yc,yb = G2st.getPowderProfile(parmDict,xdata[xB:xF],varylist,Histogram,Phases,calcControls,pawleyLookup) 40 fplot.plot(xdata[xB:xF],yc+yb,'r') 42 fplot.plot(xdata[xB:xF],yc+yb,'r',label='calc+bkg') 43 fplot.legend() 41 44 42 45 def test2(name,delt): … … 49 52 xF = np.searchsorted(xdata,limits[1]) 50 53 hplot = plotter.add('derivatives test for '+name).gca() 51 ya = G2st.getPowderProfileDerv(parmDict,xdata[xB:xF],varyList,Histogram,Phases, calcControls,pawleyLookup)[0]52 hplot.plot(xdata[xB:xF],ya,'b' )54 ya = G2st.getPowderProfileDerv(parmDict,xdata[xB:xF],varyList,Histogram,Phases,RBData,calcControls,pawleyLookup)[0] 55 hplot.plot(xdata[xB:xF],ya,'b',label='analytic deriv') 53 56 if 'dA' in name: 54 57 name = ''.join(name.split('d')) … … 61 64 y1 += yb 62 65 yn = (y1-y0)/(2.*delt) 63 hplot.plot(xdata[xB:xF],yn,'r+') 64 hplot.plot(xdata[xB:xF],ya-yn,'g') 66 hplot.plot(xdata[xB:xF],yn,'r+',label='numeric deriv') 67 hplot.plot(xdata[xB:xF],ya-yn,'g',label='diff') 68 hplot.legend() 65 69 66 70 if __name__ == '__main__': … … 75 79 print name,parmDict[name] 76 80 names = [ 77 ['0:0:Size;i',0.01], 78 ['0:0:Mustrain:0',0.001], 79 ['0:0:Mustrain:1',0.001], 81 ['0::AUiso:0',0.001], 82 ['::RBV;0:0',0.001], 83 ['0::RBVT11:0:0',0.1], 84 ['0::RBVL11:0:0',0.1], 85 ['0::RBVPz:0:0',0.0001], 86 ['0::RBVOa:0:0',0.001], 80 87 ] 81 88 for [name,delt] in names:
Note: See TracChangeset
for help on using the changeset viewer.