Changeset 395


Ignore:
Timestamp:
Oct 20, 2011 9:25:32 AM (10 years ago)
Author:
vondreele
Message:

Add goniometer omega, chi & phi to sample data
put SH texture in General
fix phase delete to remove it from reflection lists as well
continue development of constraints/restraints GUI
fixes to texture computations, GUI & least squares refinement

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r384 r395  
    3030import GSASIIspc as G2spc
    3131import GSASIIstruct as G2str
     32import GSASIImapvars as G2mv
    3233import GSASIIsolve as G2sol
    3334import OpenGL as ogl
     
    345346                    Sample = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],
    346347                        'DisplaceX':[0.0,False],'DisplaceY':[0.0,False],'Diffuse':[],
    347                         'Temperature':Temperature,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
    348                         'Force':0.0,'Gonio. radius':200.0}
     348                        'Temperature':Temperature,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,'Force':0.0,
     349                        'Gonio. radius':200.0,'Omega':0.0,'Chi':0.0,'Phi':0.0}
    349350                    try:
    350351                        for Item in Data:
     
    764765                            'DisplaceX':[0.0,False],'DisplaceY':[0.0,False],'Diffuse':[],
    765766                            'Temperature':300.,'Pressure':1.0,'Humidity':0.0,
    766                             'Voltage':0.0,'Force':0.0,'Gonio. radius':200.0}
     767                            'Voltage':0.0,'Force':0.0,'Gonio. radius':200.0,
     768                            'Omega':0.0,'Chi':0.0,'Phi':0.0}
    767769                        self.PatternTree.SetItemPyData(Id,[[''],[Xsum,Ysum,Wsum,YCsum,YBsum,YDsum]])
    768770                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
     
    902904                'SGData':SGData,
    903905                'Cell':[False,10.,10.,10.,90.,90.,90,1000.],
    904                 'Pawley dmin':1.0},
     906                'Pawley dmin':1.0,
     907                'SH Texture':{
     908                    'Order':0,
     909                    'Model':'cylindrical',
     910                    'Sample omega':[False,0.0],
     911                    'Sample chi':[False,0.0],
     912                    'Sample phi':[False,0.0],
     913                    'SH Coeff':[False,{}],
     914                    'SHShow':False,
     915                    'PFhkl':[0,0,1],
     916                    'PFxyz':[0,0,1],
     917                    'PlotType':'Pole figure'}},
    905918            'Atoms':[],
    906919            'Drawing':{},
     
    908921            'Pawley ref':[],
    909922            'Models':{},
    910             'SH Texture':{
    911                 'Order':0,
    912                 'Model':'cylindrical',
    913                 'Sample omega':[False,0.0],
    914                 'Sample chi':[False,0.0],
    915                 'Sample phi':[False,0.0],
    916                 'SH Coeff':[False,{}],
    917                 'SHShow':False,
    918                 'PFhkl':[0,0,1],
    919                 'PFxyz':[0,0,1],
    920                 'PlotType':'Pole figure'}
    921923            })
    922924       
     
    952954                        self.PatternTree.Delete(item)
    953955                        self.G2plotNB.Delete(name)
     956                    item, cookie = self.PatternTree.GetFirstChild(self.root)
     957                    while item:
     958                        name = self.PatternTree.GetItemText(item)
     959                        if 'PWDR' in name:
     960                            Id = G2gd.GetPatternTreeItemId(self,item, 'Reflection Lists')
     961                            refList = self.PatternTree.GetItemPyData(Id)
     962                            for i,item in DelList:
     963                                del(refList[item])
     964                            self.PatternTree.SetItemPyData(Id,refList)
     965                        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
    954966            finally:
    955967                dlg.Destroy()
     
    14661478        parmDict.update(histDict)
    14671479        for parm in parmDict:
    1468             if parm.split(':')[-1] in ['Azimuth','Gonio. radius','Lam1','Lam2']:
     1480            if parm.split(':')[-1] in ['Azimuth','Gonio. radius','Lam1','Lam2','Omega','Chi','Phi']:
    14691481                parmDict[parm] = [parmDict[parm],' ']
    1470             elif parm.split(':')[-2] in ['Ax','Ay','Az']:
     1482            elif parm.split(':')[-2] in ['Ax','Ay','Az','SHmodel','SHord']:
    14711483                parmDict[parm] = [parmDict[parm],' ']
    14721484            elif parm in varyList:
  • trunk/GSASIIgrid.py

    r384 r395  
    1616import GSASIIimgGUI as G2imG
    1717import GSASIIphsGUI as G2phG
     18import GSASIIstruct as G2str
     19import GSASIImapvars as G2mv
    1820
    1921[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE,
     
    630632           
    631633def UpdateConstraints(self,data):
    632    
    633    
     634    Histograms,Phases = self.GetUsedHistogramsAndPhasesfromTree()
     635    Natoms,phaseVary,phaseDict,pawleyLookup,FFtable = G2str.GetPhaseData(Phases,Print=False)       
     636    hapVary,hapDict,controlDict = G2str.GetHistogramPhaseData(Phases,Histograms,Print=False)
     637    histVary,histDict,controlDict = G2str.GetHistogramData(Histograms,Print=False)
     638   
     639    def FindEquivVarb(name,nameList):
     640        outList = []
     641        for item in nameList:
     642            key = item.split(':')[2]
     643            if key in name and item != name:
     644                outList.append(item)
     645        return outList
     646       
     647    def SelectVarbs(FrstVarb,varList,legend):
     648        #future -  add 'all:all:name', '0:all:name', etc. to the varList
     649        dlg = wx.MultiChoiceDialog(self,'Select more variables:'+legend,FrstVarb+' and:',varList)
     650        varbs = [FrstVarb,]
     651        if dlg.ShowModal() == wx.ID_OK:
     652            sel = dlg.GetSelections()
     653            for x in sel:
     654                varbs.append(varList[x])
     655        dlg.Destroy()
     656        if len(varbs) > 1:
     657            return map(list,zip(varbs,[1.0 for i in range(len(varbs))]))
     658        else:
     659            return [[FrstVarb,0.0],]
     660   
     661    def OnAddConstraint(event):
     662        constr = []
     663        plegend = '\n In p::name'
     664        hlegend = '\n In :h:name'
     665        phlegend = '\n In p:h:name'
     666        for phase in Phases:
     667            plegend += '\n p:: = '+str(Phases[phase]['pId'])+':: for '+phase
     668            for histogram in Phases[phase]['Histograms']:
     669                phlegend += '\n p:h: = '+str(Phases[phase]['pId'])+':'+str(Histograms[histogram]['hId'])+': for '+phase+' in '+histogram
     670        for histogram in Histograms:
     671            hlegend += '\n :h: = :'+str(Histograms[histogram]['hId'])+': for '+histogram
     672        page = self.dataDisplay.GetSelection()
     673        if 'Histogram ' in self.dataDisplay.GetPageText(page):
     674            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+hlegend,'Histogram variables:',histVary)
     675            if dlg.ShowModal() == wx.ID_OK:
     676                sel = dlg.GetSelection()
     677                FrstVarb = histVary[sel]
     678                moreVarb = FindEquivVarb(FrstVarb,histVary)
     679                constr = SelectVarbs(FrstVarb,moreVarb,hlegend)
     680            dlg.Destroy()
     681        elif '/Phase' in self.dataDisplay.GetPageText(page):
     682            legend = 'Select 1st variable: \n '
     683            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+phlegend,'HAP variables:',hapVary)
     684            if dlg.ShowModal() == wx.ID_OK:
     685                sel = dlg.GetSelection()
     686                FrstVarb = hapVary[sel]
     687                moreVarb = FindEquivVarb(FrstVarb,hapVary)
     688                constr = SelectVarbs(FrstVarb,moreVarb,phlegend)
     689            dlg.Destroy()
     690        elif 'Phase' in self.dataDisplay.GetPageText(page):
     691            dlg = wx.SingleChoiceDialog(self,'Select 1st variable:'+plegend,'Phase variables:',phaseVary)
     692            if dlg.ShowModal() == wx.ID_OK:
     693                sel = dlg.GetSelection()
     694                FrstVarb = phaseVary[sel]
     695                moreVarb = FindEquivVarb(FrstVarb,phaseVary)
     696                constr = SelectVarbs(FrstVarb,moreVarb,plegend)
     697            dlg.Destroy()
     698        if constr:
     699            constr += [0.0,True]
     700               
     701           
     702             
     703   
     704    def UpdateHAPConstr():
     705        HAPConstr.DestroyChildren()
     706        dataDisplay = wx.Panel(HAPConstr)
     707        mainSizer = wx.BoxSizer(wx.VERTICAL)
     708        mainSizer.Add((5,5),0)
     709        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Histogram/Phase constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
     710        mainSizer.Add((5,5),0)
     711       
     712
     713
     714        dataDisplay.SetSizer(mainSizer)
     715        Size = mainSizer.Fit(self.dataFrame)
     716        Size[1] += 26                           #compensate for status bar
     717        dataDisplay.SetSize(Size)
     718        self.dataFrame.setSizePosLeft(Size)
     719       
     720    def UpdateHistConstr():
     721        HistConstr.DestroyChildren()
     722        dataDisplay = wx.Panel(HistConstr)
     723        mainSizer = wx.BoxSizer(wx.VERTICAL)
     724        mainSizer.Add((5,5),0)
     725        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Histogram constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
     726        mainSizer.Add((5,5),0)
     727
     728
     729        dataDisplay.SetSizer(mainSizer)
     730        Size = mainSizer.Fit(self.dataFrame)
     731        Size[1] += 26                           #compensate for status bar
     732        dataDisplay.SetSize(Size)
     733        self.dataFrame.setSizePosLeft(Size)
     734       
     735    def UpdatePhaseConstr():
     736        PhaseConstr.DestroyChildren()
     737        dataDisplay = wx.Panel(PhaseConstr)
     738        mainSizer = wx.BoxSizer(wx.VERTICAL)
     739        mainSizer.Add((5,5),0)
     740        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
     741        mainSizer.Add((5,5),0)
     742
     743
     744        dataDisplay.SetSizer(mainSizer)
     745        Size = mainSizer.Fit(self.dataFrame)
     746        Size[1] += 26                           #compensate for status bar
     747        dataDisplay.SetSize(Size)
     748        self.dataFrame.setSizePosLeft(Size)
     749   
     750    def OnPageChanged(event):
     751        page = event.GetSelection()
     752        text = self.dataDisplay.GetPageText(page)
     753        if text == 'Histogram/Phase constraints':
     754            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
     755            UpdateHAPConstr()
     756        elif text == 'Histogram constraints':
     757            UpdateHistConstr()
     758            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
     759        elif text == 'Phase constraints':
     760            UpdatePhaseConstr()
     761            self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
     762        event.Skip()
     763
    634764    if self.dataDisplay:
    635765        self.dataDisplay.Destroy()
     766    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
    636767    self.dataFrame.SetLabel('Constraints')
    637     self.dataDisplay = wx.Panel(self.dataFrame)
    638     self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
    639     mainSizer = wx.BoxSizer(wx.VERTICAL)
    640     mainSizer.Add((5,5),0)
    641     mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
    642    
    643    
    644     mainSizer.Layout()   
    645     self.dataDisplay.SetSizer(mainSizer)
    646     self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
    647     self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
     768    self.dataFrame.CreateStatusBar()
     769    self.dataFrame.Bind(wx.EVT_MENU, OnAddConstraint, id=wxID_CONSTRAINTADD)
     770    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
     771   
     772    PhaseConstr = wx.ScrolledWindow(self.dataDisplay)
     773    self.dataDisplay.AddPage(PhaseConstr,'Phase constraints')
     774    HAPConstr = wx.ScrolledWindow(self.dataDisplay)
     775    self.dataDisplay.AddPage(HAPConstr,'Histogram/Phase constraints')
     776    HistConstr = wx.ScrolledWindow(self.dataDisplay)
     777    self.dataDisplay.AddPage(HistConstr,'Histogram constraints')
     778    UpdatePhaseConstr()
     779
     780    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
    648781   
    649782   
    650783def UpdateRestraints(self,data):
    651784
     785    def OnAddRestraint(event):
     786        page = self.dataDisplay.GetSelection()
     787        print self.dataDisplay.GetPageText(page)
     788
     789    def UpdateAtomRestr():
     790        AtomRestr.DestroyChildren()
     791        dataDisplay = wx.Panel(AtomRestr)
     792        mainSizer = wx.BoxSizer(wx.VERTICAL)
     793        mainSizer.Add((5,5),0)
     794        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Atom restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
     795        mainSizer.Add((5,5),0)
     796
     797
     798        dataDisplay.SetSizer(mainSizer)
     799        Size = mainSizer.Fit(self.dataFrame)
     800        Size[1] += 26                           #compensate for status bar
     801        dataDisplay.SetSize(Size)
     802        self.dataFrame.setSizePosLeft(Size)
     803       
     804    def UpdatePhaseRestr():
     805        PhaseRestr.DestroyChildren()
     806        dataDisplay = wx.Panel(PhaseRestr)
     807        mainSizer = wx.BoxSizer(wx.VERTICAL)
     808        mainSizer.Add((5,5),0)
     809        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
     810        mainSizer.Add((5,5),0)
     811
     812
     813        dataDisplay.SetSizer(mainSizer)
     814        Size = mainSizer.Fit(self.dataFrame)
     815        Size[1] += 26                           #compensate for status bar
     816        dataDisplay.SetSize(Size)
     817        self.dataFrame.setSizePosLeft(Size)
     818   
     819    def OnPageChanged(event):
     820        page = event.GetSelection()
     821        text = self.dataDisplay.GetPageText(page)
     822        if text == 'Atom restraints':
     823            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
     824            UpdateAtomRestr()
     825        elif text == 'Phase restraints':
     826            UpdatePhaseRestr()
     827            self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
     828        event.Skip()
    652829
    653830    if self.dataDisplay:
    654831        self.dataDisplay.Destroy()
    655     self.dataFrame.SetLabel('Restraints')
    656     self.dataDisplay = wx.Panel(self.dataFrame)
    657832    self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
    658     mainSizer = wx.BoxSizer(wx.VERTICAL)
    659     mainSizer.Add((5,5),0)
    660     mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement restraints:'),0,wx.ALIGN_CENTER_VERTICAL)
    661    
    662    
    663     mainSizer.Layout()   
    664     self.dataDisplay.SetSizer(mainSizer)
    665     self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
    666     self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
     833    self.dataFrame.SetLabel('restraints')
     834    self.dataFrame.CreateStatusBar()
     835    self.dataFrame.Bind(wx.EVT_MENU, OnAddRestraint, id=wxID_RESTRAINTADD)
     836    self.dataDisplay = GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
     837   
     838    PhaseRestr = wx.ScrolledWindow(self.dataDisplay)
     839    self.dataDisplay.AddPage(PhaseRestr,'Phase restraints')
     840    AtomRestr = wx.ScrolledWindow(self.dataDisplay)
     841    self.dataDisplay.AddPage(AtomRestr,'Atom restraints')
     842    UpdatePhaseRestr()
     843#    AtomRestrData = data['AtomRestr']
     844
     845    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)       
    667846             
    668847def UpdateHKLControls(self,data):
  • trunk/GSASIIlattice.py

    r391 r395  
    731731    return False
    732732       
    733 def GenSHCoeff(SGLaue,SamSym,L):
     733def GenSHCoeff(SGLaue,SamSym,L,IfLMN=True):
    734734    coeffNames = []
    735735    for iord in [2*i+2 for i in range(L/2)]:
    736736        for m in [i-iord for i in range(2*iord+1)]:
    737             if SamSym and OdfChk(SamSym,iord,m):
     737            if OdfChk(SamSym,iord,m):
    738738                for n in [i-iord for i in range(2*iord+1)]:
    739739                    if OdfChk(SGLaue,iord,n):
    740                         coeffNames.append('C(%d,%d,%d)'%(iord,m,n))
    741             else:                  #use for powder sample PO when SamSym = None
    742                 for n in [i-iord for i in range(2*iord+1)]:
    743                     if OdfChk(SGLaue,iord,n):
    744                         coeffNames.append('C(%d,%d)'%(iord,n))
     740                        if IfLMN:
     741                            coeffNames.append('C(%d,%d,%d)'%(iord,m,n))
     742                        else:
     743                            coeffNames.append('C(%d,%d)'%(iord,n))
    745744    return coeffNames
    746745
     
    913912    [-0.06773139,0.14120811,-0.15835721,0.18357456,-0.19364673,0.08377174,0.43116318,0.0,0.0]]
    914913}
    915    
    916 def GetKclKsl(L,N,SGLaue,psi,phi,beta):
     914
     915Lnorm = lambda L: 4.*np.pi/(2.0*L+1.)
     916
     917def GetKcl(L,N,SGLaue,phi,beta):
    917918    import pytexture as ptx
    918     FORPI = 12.5663706143592
    919919    RSQ2PI = 0.3989422804014
    920920    SQ2 = 1.414213562373
    921     Lnorm = FORPI/(2.0*L+1.)
    922     Ksl,x = ptx.pyplmpsi(L,0,1,psi)
    923     Ksl *= RSQ2PI
    924921    if SGLaue in ['m3','m3m']:
    925922        Kcl = 0.0
     
    927924            im = j/4+1
    928925            pcrs,dum = ptx.pyplmpsi(L,j,1,phi)
    929             Kcl += BOH['L='+str(l)][N-1][im-1]*pcrs*cosd(j*beta)       
     926            Kcl += BOH['L='+str(L)][N-1][im-1]*pcrs*cosd(j*beta)       
    930927    else:
    931928        pcrs,dum = ptx.pyplmpsi(L,N,1,phi)
     
    943940        else:
    944941            Kcl = pcrs*(cosd(N*beta)+sind(N*beta))
    945     return Kcl*Ksl,Lnorm
     942    return Kcl
     943   
     944def GetKsl(L,M,SamSym,psi,gam):
     945    import pytexture as ptx
     946    RSQPI = 0.5641895835478
     947    SQ2 = 1.414213562373
     948    psrs,dpdps = ptx.pyplmpsi(L,M,1,psi)
     949    psrs *= RSQPI
     950    dpdps *= RSQPI
     951    if M == 0:
     952        psrs /= SQ2
     953        dpdps /= SQ2
     954    if SamSym in ['mmm',]:
     955        dum = cosd(M*gam)
     956        Ksl = psrs*dum
     957        dKsdp = dpdps*dum
     958        dKsdg = -psrs*M*sind(M*gam)
     959    else:
     960        dum = cosd(M*gam)+sind(M*gam)
     961        Ksl = psrs*dum
     962        dKsdp = dpdps*dum
     963        dKsdg = psrs*M*(-sind(M*gam)+cosd(M*gam))
     964    return Ksl,dKsdp,dKsdg
     965   
     966def GetKclKsl(L,N,SGLaue,psi,phi,beta):
     967    """
     968    This is used for spherical harmonics description of preferred orientation;
     969        cylindrical symmetry only (M=0) and no sample angle derivatives returned
     970    """
     971    import pytexture as ptx
     972    RSQ2PI = 0.3989422804014
     973    SQ2 = 1.414213562373
     974    Ksl,x = ptx.pyplmpsi(L,0,1,psi)
     975    Ksl *= RSQ2PI
     976    if SGLaue in ['m3','m3m']:
     977        Kcl = 0.0
     978        for j in range(0,L+1,4):
     979            im = j/4+1
     980            pcrs,dum = ptx.pyplmpsi(L,j,1,phi)
     981            Kcl += BOH['L='+str(L)][N-1][im-1]*pcrs*cosd(j*beta)       
     982    else:
     983        pcrs,dum = ptx.pyplmpsi(L,N,1,phi)
     984        pcrs *= RSQ2PI
     985        if N:
     986            pcrs *= SQ2
     987        if SGLaue in ['mmm','4/mmm','6/mmm','R3mR','3m1','31m']:
     988            if SGLaue in ['3mR','3m1','31m']:
     989                if n%6 == 3:
     990                    Kcl = pcrs*sind(N*beta)
     991                else:
     992                    Kcl = pcrs*cosd(N*beta)
     993            else:
     994                Kcl = pcrs*cosd(N*beta)
     995        else:
     996            Kcl = pcrs*(cosd(N*beta)+sind(N*beta))
     997    return Kcl*Ksl,Lnorm(L)
    946998   
    947999def Glnh(Start,SHCoef,psi,gam,SamSym):
     
    9561008    for i,term in enumerate(SHCoef):
    9571009        l,m,n = eval(term.strip('C'))
    958         lNorm = 4.*np.pi/(2.*l+1.)
    9591010        pcrs,dum = ptx.pyplmpsi(l,m,1,psi)
    9601011        pcrs *= RSQPI
     
    9651016        else:
    9661017            Ksl = pcrs*(cosd(m*gam)+sind(m*gam))
    967         Fln[i] = SHCoef[term]*Ksl*lNorm
     1018        Fln[i] = SHCoef[term]*Ksl*Lnorm(l)
    9681019    ODFln = dict(zip(SHCoef.keys(),list(zip(SHCoef.values(),Fln))))
    9691020    return ODFln
     
    9821033    for i,term in enumerate(SHCoef):
    9831034        l,m,n = eval(term.strip('C'))
    984         lNorm = 4.*np.pi/(2.*l+1.)
    9851035        if SGData['SGLaue'] in ['m3','m3m']:
    9861036            Kcl = 0.0
     
    10041054            else:
    10051055                Kcl = pcrs*(cosd(n*beta)+sind(n*beta))
    1006         Fln[i] = SHCoef[term]*Kcl*lNorm
     1056        Fln[i] = SHCoef[term]*Kcl*Lnorm(l)
    10071057    ODFln = dict(zip(SHCoef.keys(),list(zip(SHCoef.values(),Fln))))
    10081058    return ODFln
     
    10691119    Tindx = 1.0
    10701120    for term in SHCoef:
    1071         l,m,n = eval(term.strip('C'))
     1121        l = eval(term.strip('C'))[0]
    10721122        Tindx += SHCoef[term]**2/(2.0*l+1.)
    10731123    return Tindx
  • trunk/GSASIIphsGUI.py

    r388 r395  
    19401940        def OnPFValue(event):
    19411941            Obj = event.GetEventObject()
    1942             if textureData['PlotType'] in ['Pole figure','Axial pole distribution']:
     1942            Saxis = Obj.GetValue().split()
     1943            if textureData['PlotType'] in ['Pole figure','Axial pole distribution']:               
    19431944                try:
    1944                     value = '['+Obj.GetValue()+']'
    1945                     hkl = eval(value)
    1946                 except:
    1947                     value = str(textureData['PFhkl'])
    1948                     hkl = eval(value)
    1949                 Obj.SetValue('%d %d d'%(hkl[0],hkl[1],hkl[2]))
     1945                    hkl = [int(Saxis[i]) for i in range(3)]
     1946                except (ValueError,IndexError):
     1947                    hkl = textureData['PFhkl']
     1948                if not np.any(np.array(hkl)):       #can't be all zeros!
     1949                    hkl = textureData['PFhkl']
     1950                Obj.SetValue('%d %d %d'%(hkl[0],hkl[1],hkl[2]))
    19501951                textureData['PFhkl'] = hkl
    19511952            else:
    19521953                try:
    1953                     value =  '['+Obj.GetValue()+']'
    1954                     xyz = eval(value)
    1955                 except:
    1956                     value = str(textureData['PFhkl'])
    1957                     xyz = eval(value)
     1954                    hkl = [float(Saxis[i]) for i in range(3)]
     1955                except (ValueError,IndexError):
     1956                    hkl = textureData['PFxyz']
     1957                if not np.any(np.array(hkl)):       #can't be all zeros!
     1958                    hkl = textureData['PFxyz']
    19581959                Obj.SetValue('%3.1f %3.1f %3.1f'%(xyz[0],xyz[1],xyz[2]))
    19591960                textureData['PFxyz'] = xyz
     
    22672268
    22682269        def SetPOCoef(Order,hist):
    2269             cofNames = G2lat.GenSHCoeff(SGData['SGLaue'],None,Order)     #cylindrical sample symmetry
     2270            cofNames = G2lat.GenSHCoeff(SGData['SGLaue'],'0',Order,False)     #cylindrical & no M
    22702271            newPOCoef = dict(zip(cofNames,np.zeros(len(cofNames))))
    22712272            POCoeff = UseList[hist]['Pref.Ori.'][5]
     
    25372538                    mainSizer.Add(poSizer)
    25382539                    if POData[4]:
    2539                         mainSizer.Add(wx.StaticText(dataDisplay,-1,' Spherical harmonic coefficients: '),0,wx.ALIGN_CENTER_VERTICAL)
     2540                        textJ = G2lat.textureIndex(POData[5])
     2541                        mainSizer.Add(wx.StaticText(dataDisplay,-1,' Spherical harmonic coefficients: '+'Texture index: %.3f'%(textJ)),0,wx.ALIGN_CENTER_VERTICAL)
    25402542                        mainSizer.Add((0,5),0)
    25412543                        ODFSizer = wx.FlexGridSizer(2,8,2,2)
  • trunk/GSASIIpwdGUI.py

    r391 r395  
    609609    if not 'Gonio. radius' in data:
    610610        data['Gonio. radius'] = 200.0
     611    if not 'Omega' in data:
     612        data.update({'Omega':0.0,'Chi':0.0,'Phi':0.0})
    611613#patch end
    612614   
     
    619621        parms += [['Shift',' Sample displacement(\xb5m): ','%.2f',],
    620622            ['Transparency',' Sample transparency(1/\xb5eff,cm): ','%.4f'],]
     623    parms.append(['Omega','Goniometer omega:','%.2f'])
     624    parms.append(['Chi','Goniometer chi:','%.2f'])
     625    parms.append(['Phi','Goniometer phi:','%.2f'])
    621626    parms.append(['Temperature',' Sample temperature(K): ','%.2f'])
    622627    parms.append(['Pressure',' Sample pressure(MPa): ','%.3f'])
  • trunk/GSASIIstruct.py

    r391 r395  
    382382                print line
    383383       
     384    def PrintTexture(textureData):
     385        print '\n Spherical harmonics texture: Order:' + \
     386            str(textureData['Order'])+' Refine? '+str(textureData['SH Coeff'][0])
     387        names = ['omega','chi','phi']
     388        line = '\n'
     389        for name in names:
     390            line += ' SH '+name+':'+'%12.4f'%(textureData['Sample '+name][1])+' Refine? '+str(textureData['Sample '+name][0])
     391        print line
     392        print '\n Texture coefficients:'
     393        ptlbls = ' names :'
     394        ptstr =  ' values:'
     395        SHcoeff = textureData['SH Coeff'][1]
     396        for item in SHcoeff:
     397            ptlbls += '%12s'%(item)
     398            ptstr += '%12.4f'%(SHcoeff[item])
     399        print ptlbls
     400        print ptstr   
    384401       
    385402    if Print: print ' Phases:'
     
    392409    AtMults = {}
    393410    AtIA = {}
     411    shModels = ['cylindrical','none','shear - 2/m','rolling - mmm']
     412    SamSym = dict(zip(shModels,['0','-1','2/m','mmm']))
    394413    for name in PhaseData:
    395414        General = PhaseData[name]['General']
     
    456475                                        if uId[j] == uId[k]:
    457476                                            G2mv.StoreEquivalence(names[k],((names[j],uCoef[j]),))
     477#            elif General['Type'] == 'magnetic':
     478#            elif General['Type'] == 'macromolecular':
     479
     480            if 'SH Texture' in General:
     481                textureData = General['SH Texture']
     482                phaseDict[pfx+'SHmodel'] = SamSym[textureData['Model']]
     483                phaseDict[pfx+'SHorder'] = textureData['Order']
     484                for name in ['omega','chi','phi']:
     485                    phaseDict[pfx+'SH '+name] = textureData['Sample '+name][1]
     486                    if textureData['Sample '+name][0]:
     487                        phaseVary.append(pfx+'SH '+name)
     488                for name in textureData['SH Coeff'][1]:
     489                    phaseDict[pfx+name] = textureData['SH Coeff'][1][name]
     490                    if textureData['SH Coeff'][0]:
     491                        phaseVary.append(pfx+name)
     492               
    458493            if Print:
    459494                PrintAtoms(General,Atoms)
    460 #        elif General['Type'] == 'magnetic':
    461 #        elif General['Type'] == 'macromolecular':
    462 #       PWDR: harmonics texture
     495                if 'SH Texture' in General:
     496                    PrintTexture(textureData)
     497                   
    463498        elif PawleyRef:
    464499            pawleyVary = []
     
    627662                print valstr
    628663                print sigstr
     664               
     665    def PrintSHtextureAndSig(textureData,SHtextureSig):
     666        print '\n Spherical harmonics texture: Order:' + str(textureData['Order'])
     667        names = ['omega','chi','phi']
     668        namstr = '  names :'
     669        ptstr =  '  values:'
     670        sigstr = '  esds  :'
     671        for name in names:
     672            namstr += '%12s'%(name)
     673            ptstr += '%12.3f'%(textureData['Sample '+name][1])
     674            if 'Sample '+name in SHtextureSig:
     675                sigstr += '%12.3f'%(SHtextureSig['Sample '+name])
     676            else:
     677                sigstr += 12*' '
     678        print namstr
     679        print ptstr
     680        print sigstr
     681        print '\n Texture coefficients:'
     682        namstr = '  names :'
     683        ptstr =  '  values:'
     684        sigstr = '  esds  :'
     685        SHcoeff = textureData['SH Coeff'][1]
     686        for name in SHcoeff:
     687            namstr += '%12s'%(name)
     688            ptstr += '%12.3f'%(SHcoeff[name])
     689            if name in SHtextureSig:
     690                sigstr += '%12.3f'%(SHtextureSig[name])
     691            else:
     692                sigstr += 12*' '
     693        print namstr
     694        print ptstr
     695        print sigstr
     696       
    629697           
    630698    print '\n Phases:'
     
    636704        Atoms = Phase['Atoms']
    637705        cell = General['Cell']
     706        textureData = General['SH Texture']
    638707        pId = Phase['pId']
    639708        pfx = str(pId)+'::'
     
    709778                            if names[ind] in sigDict:
    710779                                atomsSig[str(i)+':'+str(ind)] = sigDict[names[ind]]
    711             PrintAtomsAndSig(General,Atoms,atomsSig)   
     780            PrintAtomsAndSig(General,Atoms,atomsSig)
     781           
     782        if textureData['Order']:
     783            SHtextureSig = {}
     784            for name in ['omega','chi','phi']:
     785                aname = pfx+'SH '+name
     786                textureData['Sample '+name][1] = parmDict[aname]
     787                if aname in sigDict:
     788                    SHtextureSig['Sample '+name] = sigDict[aname]
     789            for name in textureData['SH Coeff'][1]:
     790                aname = pfx+name
     791                textureData['SH Coeff'][1][name] = parmDict[aname]
     792                if aname in sigDict:
     793                    SHtextureSig[name] = sigDict[aname]
     794            PrintSHtextureAndSig(textureData,SHtextureSig)
    712795
    713796def GetHistogramPhaseData(Phases,Histograms,Print=True):
     
    776859        for item in hapData[5]:
    777860            ptlbls += '%12s'%(item)
    778             ptstr += '%12.4f'%(hapData[5][item])
     861            ptstr += '%12.3f'%(hapData[5][item])
    779862        print ptlbls
    780863        print ptstr
     
    9671050        for item in hapData[5]:
    9681051            ptlbls += '%12s'%(item)
    969             ptstr += '%12.4f'%(hapData[5][item])
     1052            ptstr += '%12.3f'%(hapData[5][item])
    9701053            if item in POsig:
    971                 sigstr += '%12.4f'%(POsig[item])
     1054                sigstr += '%12.3f'%(POsig[item])
    9721055            else:
    9731056                sigstr += 12*' '
     
    10741157        sampVary = []
    10751158        hfx = ':'+str(hId)+':'       
    1076         sampDict = {hfx+'Gonio. radius':Sample['Gonio. radius']}
     1159        sampDict = {hfx+'Gonio. radius':Sample['Gonio. radius'],hfx+'Omega':Sample['Omega'],
     1160            hfx+'Chi':Sample['Chi'],hfx+'Phi':Sample['Phi']}
    10771161        Type = Sample['Type']
    10781162        if 'Bragg' in Type:             #Bragg-Brentano
     
    11161200    def PrintSampleParms(Sample):
    11171201        print '\n Sample Parameters:'
     1202        print ' Goniometer omega = %.2f, chi = %.2f, phi = %.2f'% \
     1203            (Sample['Omega'],Sample['Chi'],Sample['Phi'])
    11181204        ptlbls = ' name  :'
    11191205        ptstr =  ' value :'
     
    14671553            parmDict[parm] += parmDict[item]
    14681554   
     1555def SHTXcal(refl,g,pfx,hfx,SGData,calcControls,parmDict):
     1556    IFCoup = 'Bragg' in calcControls[hfx+'instType']
     1557    odfCor = 1.0
     1558    H = refl[:3]
     1559    cell = G2lat.Gmat2cell(g)
     1560    Sangls = [parmDict[pfx+'SH omega'],parmDict[pfx+'SH chi'],parmDict[pfx+'SH phi']]
     1561    Gangls = [parmDict[hfx+'Omega'],parmDict[hfx+'Chi'],parmDict[hfx+'Phi'],parmDict[hfx+'Azimuth']]
     1562    phi,beta = G2lat.CrsAng(H,cell,SGData)
     1563    psi,gam,x,x = G2lat.SamAng(refl[5]/2.,Gangls,Sangls,IFCoup) #ignore 2 sets of angle derivs.
     1564    SHnames = G2lat.GenSHCoeff(SGData['SGLaue'],parmDict[pfx+'SHmodel'],parmDict[pfx+'SHorder'])
     1565    for item in SHnames:
     1566        L,M,N = eval(item.strip('C'))
     1567        Kcl = G2lat.GetKcl(L,N,SGData['SGLaue'],phi,beta)
     1568        Ksl,x,x = G2lat.GetKsl(L,M,parmDict[pfx+'SHmodel'],psi,gam)
     1569        Lnorm = G2lat.Lnorm(L)
     1570        odfCor += parmDict[pfx+item]*Lnorm*Kcl*Ksl
     1571    return odfCor
     1572   
     1573def SHTXcalDerv(refl,g,pfx,hfx,SGData,calcControls,parmDict):
     1574    FORPI = 12.5663706143592
     1575    IFCoup = 'Bragg' in calcControls[hfx+'instType']
     1576    odfCor = 1.0
     1577    dFdODF = {}
     1578    dFdSA = [0,0,0]
     1579    H = refl[:3]
     1580    cell = G2lat.Gmat2cell(g)
     1581    Sangls = [parmDict[pfx+'SH omega'],parmDict[pfx+'SH chi'],parmDict[pfx+'SH phi']]
     1582    Gangls = [parmDict[hfx+'Omega'],parmDict[hfx+'Chi'],parmDict[hfx+'Phi'],parmDict[hfx+'Azimuth']]
     1583    phi,beta = G2lat.CrsAng(H,cell,SGData)
     1584    psi,gam,dPSdA,dGMdA = G2lat.SamAng(refl[5]/2.,Gangls,Sangls,IFCoup)
     1585    SHnames = G2lat.GenSHCoeff(SGData['SGLaue'],parmDict[pfx+'SHmodel'],parmDict[pfx+'SHorder'])
     1586    for item in SHnames:
     1587        L,M,N = eval(item.strip('C'))
     1588        Kcl = G2lat.GetKcl(L,N,SGData['SGLaue'],phi,beta)
     1589        Ksl,dKsdp,dKsdg = G2lat.GetKsl(L,M,parmDict[pfx+'SHmodel'],psi,gam)
     1590        Lnorm = G2lat.Lnorm(L)
     1591        odfCor += parmDict[pfx+item]*Lnorm*Kcl*Ksl
     1592        dFdODF[pfx+item] = Lnorm*Kcl*Ksl
     1593        for i in range(3):
     1594            dFdSA[i] += parmDict[pfx+item]*Lnorm*Kcl*(dKsdp*dPSdA[i]+dKsdg*dGMdA[i])
     1595    return odfCor,dFdODF,dFdSA
     1596   
    14691597def SHPOcal(refl,g,phfx,hfx,SGData,calcControls,parmDict):
    14701598    odfCor = 1.0
     
    14801608    phi,beta = G2lat.CrsAng(H,cell,SGData)
    14811609    psi,gam,x,x = G2lat.SamAng(refl[5]/2.,Gangls,Sangl,IFCoup) #ignore 2 sets of angle derivs.
    1482     SHnames = G2lat.GenSHCoeff(SGData['SGLaue'],None,calcControls[phfx+'SHord'])
     1610    SHnames = G2lat.GenSHCoeff(SGData['SGLaue'],'0',calcControls[phfx+'SHord'],False)
    14831611    for item in SHnames:
    14841612        L,N = eval(item.strip('C'))
     
    15021630    phi,beta = G2lat.CrsAng(H,cell,SGData)
    15031631    psi,gam,x,x = G2lat.SamAng(refl[5]/2.,Gangls,Sangl,IFCoup) #ignore 2 sets of angle derivs.
    1504     SHnames = G2lat.GenSHCoeff(SGData['SGLaue'],None,calcControls[phfx+'SHord'])
     1632    SHnames = G2lat.GenSHCoeff(SGData['SGLaue'],'0',calcControls[phfx+'SHord'],False)
    15051633    for item in SHnames:
    15061634        L,N = eval(item.strip('C'))
    15071635        Kcsl,Lnorm = G2lat.GetKclKsl(L,N,SGData['SGLaue'],psi,phi,beta)
    15081636        odfCor += parmDict[phfx+item]*Lnorm*Kcsl
    1509         dFdODF[phfx+item] = FORPI*Kcsl
     1637        dFdODF[phfx+item] = Kcsl*Lnorm
    15101638    return odfCor,dFdODF
    15111639   
     
    15421670    return POcorr,POderv
    15431671   
    1544 def GetIntensityCorr(refl,G,g,phfx,hfx,SGData,calcControls,parmDict):
     1672def GetIntensityCorr(refl,G,g,pfx,phfx,hfx,SGData,calcControls,parmDict):
    15451673    Icorr = parmDict[phfx+'Scale']*parmDict[hfx+'Scale']*refl[3]               #scale*multiplicity
    15461674    Icorr *= G2pwd.Polarization(parmDict[hfx+'Polariz.'],refl[5],parmDict[hfx+'Azimuth'])[0]
    15471675    Icorr *= GetPrefOri(refl,G,g,phfx,hfx,SGData,calcControls,parmDict)
     1676    if pfx+'SHorder' in parmDict:
     1677        Icorr *= SHTXcal(refl,g,pfx,hfx,SGData,calcControls,parmDict)
    15481678    refl[13] = Icorr       
    15491679   
    1550 def GetIntensityDerv(refl,G,g,phfx,hfx,SGData,calcControls,parmDict):
     1680def GetIntensityDerv(refl,G,g,pfx,phfx,hfx,SGData,calcControls,parmDict):
     1681    dIdsh = 1./parmDict[hfx+'Scale']
     1682    dIdsp = 1./parmDict[phfx+'Scale']
    15511683    pola,dIdPola = G2pwd.Polarization(parmDict[hfx+'Polariz.'],refl[5],parmDict[hfx+'Azimuth'])
     1684    dIdPola /= pola
    15521685    POcorr,dIdPO = GetPrefOriDerv(refl,G,g,phfx,hfx,SGData,calcControls,parmDict)
    1553     dIdPola /= pola
    15541686    for iPO in dIdPO:
    15551687        dIdPO[iPO] /= POcorr
    1556     dIdsh = 1./parmDict[hfx+'Scale']
    1557     dIdsp = 1./parmDict[phfx+'Scale']
    1558     return dIdsh,dIdsp,dIdPola,dIdPO
     1688    dFdODF = {}
     1689    dFdSA = [0,0,0]
     1690    if pfx+'SHorder' in parmDict:
     1691        odfCor,dFdODF,dFdSA = SHTXcalDerv(refl,g,pfx,hfx,SGData,calcControls,parmDict)
     1692        for iSH in dFdODF:
     1693            dFdODF[iSH] /= odfCor
     1694        for i in range(3):
     1695            dFdSA[i] /= odfCor
     1696    return dIdsh,dIdsp,dIdPola,dIdPO,dFdODF,dFdSA
    15591697       
    15601698def GetSampleGam(refl,wave,G,phfx,calcControls,parmDict,sizeEllipse):
     
    17971935                refl[5] += GetHStrainShift(refl,SGData,phfx,parmDict)               #apply hydrostatic strain shift
    17981936                refl[6:8] = GetReflSIgGam(refl,wave,G,hfx,phfx,calcControls,parmDict,sizeEllipse)    #peak sig & gam
    1799                 GetIntensityCorr(refl,G,g,phfx,hfx,SGData,calcControls,parmDict)    #puts corrections in refl[13]
     1937                GetIntensityCorr(refl,G,g,pfx,phfx,hfx,SGData,calcControls,parmDict)    #puts corrections in refl[13]
    18001938                refl[13] *= Vst*Lorenz
    18011939                if 'Pawley' in Phase['General']['Type']:
     
    19512089            if 'C' in calcControls[hfx+'histType']:        #CW powder
    19522090                h,k,l = refl[:3]
    1953                 dIdsh,dIdsp,dIdpola,dIdPO = GetIntensityDerv(refl,G,g,phfx,hfx,SGData,calcControls,parmDict)
     2091                dIdsh,dIdsp,dIdpola,dIdPO,dFdODF,dFdSA = GetIntensityDerv(refl,G,g,pfx,phfx,hfx,SGData,calcControls,parmDict)
    19542092                if 'Pawley' in Phase['General']['Type']:
    19552093                    try:
     
    20062144                    if iPO in varylist:
    20072145                        dMdv[varylist.index(iPO)] += dIdPO[iPO]*dervDict['int']
     2146                for i,name in enumerate(['omega','chi','phi']):
     2147                    aname = pfx+'SH '+name
     2148                    if aname in varylist:
     2149                        dMdv[varylist.index(aname)] += dFdSA[i]*dervDict['int']
     2150                for iSH in dFdODF:
     2151                    if iSH in varylist:
     2152                        dMdv[varylist.index(iSH)] += dFdODF[iSH]*dervDict['int']
    20082153                cellDervNames = cellVaryDerv(pfx,SGData,dpdA)
    20092154                for name,dpdA in cellDervNames:
     
    20982243            GoOn = dlg.Update(Rwp,newmsg='%s%8.3f%s'%('Powder profile wRp =',Rwp,'%'))[0]
    20992244            if not GoOn:
    2100                 return -M           #abort!!
     2245                parmDict['saved values'] = values
     2246                raise Exception         #Abort!!
    21012247        return M
    21022248   
     
    21392285        Ftol = Controls['min dM/M']
    21402286        Factor = Controls['shift factor']
    2141         if Controls['deriv type'] == 'analytic':
    2142             result = so.leastsq(errRefine,values,Dfun=dervRefine,full_output=True,
    2143                 ftol=Ftol,col_deriv=True,factor=Factor,
    2144                 args=([Histograms,Phases],parmDict,varyList,calcControls,pawleyLookup,dlg))
    2145             ncyc = int(result[2]['nfev']/2)               
    2146         else:           #'numeric'
    2147             result = so.leastsq(errRefine,values,full_output=True,ftol=Ftol,epsfcn=1.e-8,factor=Factor,
    2148                 args=([Histograms,Phases],parmDict,varyList,calcControls,pawleyLookup,dlg))
    2149             ncyc = int(result[2]['nfev']/len(varyList))
    2150 #        table = dict(zip(varyList,zip(values,result[0],(result[0]-values))))
    2151 #        for item in table: print item,table[item]               #useful debug - are things shifting?
     2287        try:
     2288            if Controls['deriv type'] == 'analytic':
     2289                result = so.leastsq(errRefine,values,Dfun=dervRefine,full_output=True,
     2290                    ftol=Ftol,col_deriv=True,factor=Factor,
     2291                    args=([Histograms,Phases],parmDict,varyList,calcControls,pawleyLookup,dlg))
     2292                ncyc = int(result[2]['nfev']/2)               
     2293            else:           #'numeric'
     2294                result = so.leastsq(errRefine,values,full_output=True,ftol=Ftol,epsfcn=1.e-8,factor=Factor,
     2295                    args=([Histograms,Phases],parmDict,varyList,calcControls,pawleyLookup,dlg))
     2296                ncyc = int(result[2]['nfev']/len(varyList))
     2297#            table = dict(zip(varyList,zip(values,result[0],(result[0]-values))))
     2298#            for item in table: print item,table[item]               #useful debug - are things shifting?
     2299        except Exception:
     2300            result = [parmDict['saved values'],None]
    21522301        runtime = time.time()-begin
    21532302        chisq = np.sum(result[2]['fvec']**2)
Note: See TracChangeset for help on using the changeset viewer.