Changeset 372


Ignore:
Timestamp:
Sep 15, 2011 3:33:53 PM (10 years ago)
Author:
vondreele
Message:

Add new background functions & rework background GUI
Add hydrostatic strain functions

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r371 r372  
    346346                        'DisplaceX':[0.0,False],'DisplaceY':[0.0,False],'Diffuse':[],
    347347                        'Temperature':Temperature,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
    348                         'Force':0.0}
     348                        'Force':0.0,'Gonio. radius':200.0}
    349349                    try:
    350350                        for Item in Data:
  • trunk/GSASIIgrid.py

    r368 r372  
    508508def UpdateControls(self,data):
    509509    #patch
    510     if 'shift factor' not in data:
    511         data['shift factor'] = 1.       
    512510    if 'deriv type' not in data:
     511        data = {}
    513512        data['deriv type'] = 'analytical'
    514513        data['min dM/M'] = 0.0001
    515514        data['shift factor'] = 1.
     515    if 'shift factor' not in data:
     516        data['shift factor'] = 1.       
    516517    #end patch
    517518    '''
     
    854855        if 'Temperature' not in data:           #temp fix for old gpx files
    855856            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
    856                 'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,'Force':0.0}
     857                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
     858                'Force':0.0,'Gonio. radius':200.0}
    857859            self.PatternTree.SetItemPyData(item,data)
    858860   
  • trunk/GSASIIphsGUI.py

    r368 r372  
    316316            try:
    317317                dmin = float(pawlVal.GetValue())
    318                 if 0.25 <= dmin <= 10.:
     318                if 0.25 <= dmin <= 20.:
    319319                    generalData['Pawley dmin'] = dmin
    320320            except ValueError:
     
    22002200            G2plt.PlotStrain(self,data)
    22012201           
     2202        def OnHstrainRef(event):
     2203            Obj = event.GetEventObject()
     2204            hist,pid = Indx[Obj.GetId()]
     2205            UseList[hist]['HStrain'][1][pid] = Obj.GetValue()
     2206           
     2207        def OnHstrainVal(event):
     2208            Snames = G2spc.HStrainNames(SGData)
     2209            Obj = event.GetEventObject()
     2210            hist,pid = Indx[Obj.GetId()]
     2211            try:
     2212                strain = float(Obj.GetValue())
     2213                UseList[hist]['HStrain'][0][pid] = strain
     2214            except ValueError:
     2215                pass
     2216            Obj.SetValue("%.5f"%(UseList[hist]['HStrain'][0][pid]))          #reset in case of error
     2217
    22022218        def OnPOType(event):
    22032219            Obj = event.GetEventObject()
     
    23152331                sizeSizer.Add((5,0),0)
    23162332                if UseList[item]['Size'][0] == 'isotropic':
    2317                     sizeRef = wx.CheckBox(dataDisplay,-1,label=' Cryst. size: ')
     2333                    sizeRef = wx.CheckBox(dataDisplay,-1,label=' Cryst. size(\xb5m): ')
    23182334                    sizeRef.thisown = False
    23192335                    sizeRef.SetValue(UseList[item]['Size'][2][0])
     
    23222338                    sizeSizer.Add(sizeRef,0,wx.ALIGN_CENTER_VERTICAL)
    23232339                    sizeVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,
    2324                         '%.2f'%(UseList[item]['Size'][1][0]),style=wx.TE_PROCESS_ENTER)
     2340                        '%.3f'%(UseList[item]['Size'][1][0]),style=wx.TE_PROCESS_ENTER)
    23252341                    Indx[sizeVal.GetId()] = [item,0]
    23262342                    sizeVal.Bind(wx.EVT_TEXT_ENTER,OnSizeVal)
     
    23402356                    mainSizer.Add((0,5),0)
    23412357                    sizeSizer2 = wx.BoxSizer(wx.HORIZONTAL)
    2342                     parms = zip([' Equatorial size: ',' Axial size: '],
     2358                    parms = zip([' Equatorial size(\xb5m): ',' Axial size(\xb5m): '],
    23432359                        UseList[item]['Size'][1],UseList[item]['Size'][2],range(2))
    23442360                    for Pa,val,ref,id in parms:
     
    23492365                        sizeRef.Bind(wx.EVT_CHECKBOX, OnSizeRef)
    23502366                        sizeSizer2.Add(sizeRef,0,wx.ALIGN_CENTER_VERTICAL)
    2351                         sizeVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.2f'%(val),style=wx.TE_PROCESS_ENTER)
     2367                        sizeVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.3f'%(val),style=wx.TE_PROCESS_ENTER)
    23522368                        Indx[sizeVal.GetId()] = [item,id]
    23532369                        sizeVal.Bind(wx.EVT_TEXT_ENTER,OnSizeVal)
     
    23582374                    mainSizer.Add(sizeSizer2)
    23592375                elif UseList[item]['Size'][0] == 'ellipsoidal':
    2360                     sizeSizer.Add(wx.StaticText(dataDisplay,-1,' Coefficients: '),0,wx.ALIGN_CENTER_VERTICAL)
     2376                    sizeSizer.Add(wx.StaticText(dataDisplay,-1,' Coefficients(\xb5m): '),0,wx.ALIGN_CENTER_VERTICAL)
    23612377                    mainSizer.Add(sizeSizer)
    23622378                    mainSizer.Add((0,5),0)
     
    23712387                        sizeRef.Bind(wx.EVT_CHECKBOX, OnSizeRef)
    23722388                        sizeSizer3.Add(sizeRef,0,wx.ALIGN_CENTER_VERTICAL)
    2373                         sizeVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.2f'%(val),style=wx.TE_PROCESS_ENTER)
     2389                        sizeVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.3f'%(val),style=wx.TE_PROCESS_ENTER)
    23742390                        Indx[sizeVal.GetId()] = [item,id]
    23752391                        sizeVal.Bind(wx.EVT_TEXT_ENTER,OnSizeVal)
     
    23942410                    strainSizer.Add(strainRef,0,wx.ALIGN_CENTER_VERTICAL)
    23952411                    strainVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,
    2396                         '%.3f'%(UseList[item]['Mustrain'][1][0]),style=wx.TE_PROCESS_ENTER)
     2412                        '%.1f'%(UseList[item]['Mustrain'][1][0]),style=wx.TE_PROCESS_ENTER)
    23972413                    Indx[strainVal.GetId()] = [item,0]
    23982414                    strainVal.Bind(wx.EVT_TEXT_ENTER,OnStrainVal)
     
    24212437                        strainRef.Bind(wx.EVT_CHECKBOX, OnStrainRef)
    24222438                        strainSizer.Add(strainRef,0,wx.ALIGN_CENTER_VERTICAL)
    2423                         strainVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.3f'%(val),style=wx.TE_PROCESS_ENTER)
     2439                        strainVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.1f'%(val),style=wx.TE_PROCESS_ENTER)
    24242440                        Indx[strainVal.GetId()] = [item,id]
    24252441                        strainVal.Bind(wx.EVT_TEXT_ENTER,OnStrainVal)
     
    24532469                        strainSizer.Add(strainVal,0,wx.ALIGN_CENTER_VERTICAL)
    24542470                    mainSizer.Add(strainSizer)
     2471                mainSizer.Add(wx.StaticText(dataDisplay,-1,' Hydrostatic strain:'))
     2472                hstrainSizer = wx.FlexGridSizer(1,6,5,5)
     2473                Hsnames = G2spc.HStrainNames(SGData)
     2474                parms = zip(Hsnames,UseList[item]['HStrain'][0],UseList[item]['HStrain'][1],range(len(Hsnames)))
     2475                for Pa,val,ref,id in parms:
     2476                    hstrainRef = wx.CheckBox(dataDisplay,-1,label=Pa)
     2477                    hstrainRef.thisown = False
     2478                    hstrainRef.SetValue(ref)
     2479                    Indx[hstrainRef.GetId()] = [item,id]
     2480                    hstrainRef.Bind(wx.EVT_CHECKBOX, OnHstrainRef)
     2481                    hstrainSizer.Add(hstrainRef,0,wx.ALIGN_CENTER_VERTICAL)
     2482                    hstrainVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.5f'%(val),style=wx.TE_PROCESS_ENTER)
     2483                    Indx[hstrainVal.GetId()] = [item,id]
     2484                    hstrainVal.Bind(wx.EVT_TEXT_ENTER,OnHstrainVal)
     2485                    hstrainVal.Bind(wx.EVT_KILL_FOCUS,OnHstrainVal)
     2486                    hstrainSizer.Add(hstrainVal,0,wx.ALIGN_CENTER_VERTICAL)
     2487                mainSizer.Add(hstrainSizer)
     2488                   
    24552489                #texture  'Pref. Ori.':['MD',1.0,False,[0,0,1],0,[]] last two for 'SH' are SHorder & coeff
    2456 #                poSizer = wx.BoxSizer(wx.HORIZONTAL)
    24572490                poSizer = wx.FlexGridSizer(1,6,5,5)
    24582491                POData = UseList[item]['Pref.Ori.']
     
    25752608        UseList = data['Histograms']
    25762609        NShkl = len(G2spc.MustrainNames(SGData))
     2610        NDij = len(G2spc.HStrainNames(SGData))
    25772611        keyList = UseList.keys()
    25782612        TextList = []
     
    25952629                            'Size':['isotropic',[10.,10.,],[False,False],[0,0,1],6*[0.0,],6*[False,]],
    25962630                            'Mustrain':['isotropic',[1.0,1.0],[False,False],[0,0,1],
    2597                                 NShkl*[0.01,],NShkl*[False,]],                           
     2631                                NShkl*[0.01,],NShkl*[False,]],
     2632                            'HStrain':[NDij*[0.0,],NDij*[False,]],                         
    25982633                            'Extinction':[0.0,False]}
    25992634                        refList = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,pId,'Reflection Lists'))
  • trunk/GSASIIpwd.py

    r358 r372  
    607607def getBackground(pfx,parmDict,bakType,xdata):
    608608    yb = np.zeros_like(xdata)
    609     if bakType == 'chebyschev':
    610         iBak = 0
    611         while True:
     609    nBak = 0
     610    while True:
     611        key = pfx+'Back:'+str(nBak)
     612        if key in parmDict:
     613            nBak += 1
     614        else:
     615            break
     616    if bakType in ['chebyschev','cosine']:
     617        for iBak in range(nBak):   
    612618            key = pfx+'Back:'+str(iBak)
    613             try:
     619            if bakType == 'chebyschev':
    614620                yb += parmDict[key]*(xdata-xdata[0])**iBak
    615                 iBak += 1
    616             except KeyError:
    617                 break
     621            elif bakType == 'cosine':
     622                yb += parmDict[key]*npcosd(xdata*iBak)
     623    elif bakType in ['interpolate',]:
     624        if nBak == 1:
     625            yb = np.ones_like(xdata)*parmDict[pfx+'Back:0']
     626        elif nBak == 2:
     627            dX = xdata[-1]-xdata[0]
     628            T2 = (xdata-xdata[0])/dX
     629            T1 = 1.0-T2
     630            yb = parmDict[pfx+'Back:0']*T1+parmDict[pfx+'Back:1']*T2
     631        else:
     632            bakPos = np.linspace(xdata[0],xdata[-1],nBak,True)
     633            bakVals = np.zeros(nBak)
     634            for i in range(nBak):
     635                bakVals[i] = parmDict[pfx+'Back:'+str(i)]
     636            bakInt = si.interp1d(bakPos,bakVals,'linear')
     637            yb = bakInt(xdata)
    618638    return yb
    619639   
    620640def getBackgroundDerv(pfx,parmDict,bakType,xdata):
    621     dydb = []
    622     if bakType == 'chebyschev':
    623         iBak = 0
    624         while True:
    625             if pfx+'Back:'+str(iBak) in parmDict:
    626                 dydb.append((xdata-xdata[0])**iBak)
    627                 iBak += 1
    628             else:
    629                 break
     641    nBak = 0
     642    while True:
     643        key = pfx+'Back:'+str(nBak)
     644        if key in parmDict:
     645            nBak += 1
     646        else:
     647            break
     648    dydb = np.zeros(shape=(nBak,len(xdata)))
     649
     650    if bakType in ['chebyschev','cosine']:
     651        for iBak in range(nBak):   
     652            if bakType == 'chebyschev':
     653                dydb[iBak] = (xdata-xdata[0])**iBak
     654            elif bakType == 'cosine':
     655                dydb[iBak] = npcosd(xdata*iBak)
     656    elif bakType in ['interpolate',]:
     657        if nBak == 1:
     658            dydb[0] = np.ones_like(xdata)
     659        elif nBak == 2:
     660            dX = xdata[-1]-xdata[0]
     661            T2 = (xdata-xdata[0])/dX
     662            T1 = 1.0-T2
     663            dydb = [T1,T2]
     664        else:
     665            bakPos = np.linspace(xdata[0],xdata[-1],nBak,True)
     666            dx = bakPos[1]-bakPos[0]
     667            for i,pos in enumerate(bakPos):
     668                if i == 0:
     669                    dydb[0] = np.where(xdata<bakPos[1],(bakPos[1]-xdata)/dx,0.)
     670                elif i == len(bakPos)-1:
     671                    dydb[i] = np.where(xdata>bakPos[-2],(bakPos[-1]-xdata)/dx,0.)
     672                else:
     673                    dydb[i] = np.where(xdata>bakPos[i],
     674                        np.where(xdata<bakPos[i+1],(bakPos[i+1]-xdata)/dx,0.),
     675                        np.where(xdata>bakPos[i-1],(xdata-bakPos[i-1])/dx,0.))
    630676    return dydb
    631677
  • trunk/GSASIIpwdGUI.py

    r367 r372  
    250250       
    251251def UpdateBackgroundGrid(self,data):
    252     if self.dataDisplay:
    253         self.dataFrame.Clear()
    254     BackId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Background')
    255     maxTerm = 9
    256     Types = [wg.GRID_VALUE_CHOICE+':chebyschev,another,more',
    257         wg.GRID_VALUE_BOOL,
    258         wg.GRID_VALUE_NUMBER+':1,'+str(maxTerm)]
    259     for i in range(maxTerm):
    260         Types.append(wg.GRID_VALUE_FLOAT+':10,3')
    261    
    262     def RefreshBackgroundGrid(event):
    263         data = self.BackTable.GetData()
     252    ValObj = {}
     253   
     254    def OnNewType(event):
     255        data[0][0] = bakType.GetValue()
     256       
     257    def OnBakRef(event):
     258        data[0][1] = bakRef.GetValue()
     259       
     260    def OnBakTerms(event):
     261        data[0][2] = int(bakTerms.GetValue())
    264262        M = len(data[0])
    265263        N = data[0][2]+3
     
    268266            for i in range(M,N):
    269267                item.append(0.0)
    270                 self.BackTable.SetColLabelValue(i,str(i-2))
    271             data = [item]
    272             msg = wg.GridTableMessage(self.BackTable,
    273                 wg.GRIDTABLE_NOTIFY_COLS_APPENDED,0,N-M)
    274             self.dataDisplay.ProcessTableMessage(msg)                         
    275268        elif N < M:     #delete terms
    276             new = []
    277             for i in range(N):
    278                 new.append(item[i])
    279             data = [new]
    280             msg = wg.GridTableMessage(self.BackTable,
    281                 wg.GRIDTABLE_NOTIFY_COLS_DELETED,0,M-N)
    282             self.dataDisplay.ProcessTableMessage(msg)
     269            for i in range(N,M):
     270                del(item[-1])
    283271        self.PatternTree.SetItemPyData(BackId,data)
    284         event.StopPropagation()
    285                  
    286     self.BackTable = []
    287     N = len(data[0])
    288     M = data[0][2]
    289     colLabels = ['function','refine','Nterms']
    290     rowLabels=['background']
    291     for i in range(M): colLabels.append(str(i+1))
    292     self.BackTable = G2gd.Table(data,rowLabels=rowLabels,colLabels=colLabels,types=Types)
    293     self.dataFrame.SetLabel('Background')
    294     self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
    295     gridPanel = wx.Panel(self.dataFrame)
    296     self.dataDisplay = G2gd.GSGrid(gridPanel)               
    297     self.dataDisplay.SetTable(self.BackTable, True)
    298     self.dataDisplay.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshBackgroundGrid)               
    299     self.dataDisplay.SetMargins(0,0)
    300     self.dataDisplay.AutoSizeColumns(False)
     272        UpdateBackgroundGrid(self,data)
     273       
     274    def OnBakVal(event):
     275        Obj = event.GetEventObject()
     276        item = ValObj[Obj.GetId()][0]
     277        try:
     278            value = float(Obj.GetValue())
     279        except ValueError:
     280            value = data[0][item]
     281        data[0][item] = value
     282        Obj.SetValue('%10.4f'%(value))
     283       
     284    if self.dataDisplay:
     285        self.dataFrame.Clear()
     286    self.dataDisplay = wx.Panel(self.dataFrame)
     287    BackId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Background')
     288    Choices = ['chebyschev','cosine','interpolate']
    301289    mainSizer = wx.BoxSizer(wx.VERTICAL)
    302     mainSizer.Add(self.dataDisplay,0)
     290    topSizer = wx.BoxSizer(wx.HORIZONTAL)
     291    topSizer.Add(wx.StaticText(self.dataDisplay,-1,' Background function: '),0,wx.ALIGN_CENTER_VERTICAL)
     292    bakType = wx.ComboBox(self.dataDisplay,value=data[0][0],
     293            choices=Choices,style=wx.CB_READONLY|wx.CB_DROPDOWN)
     294    bakType.Bind(wx.EVT_COMBOBOX, OnNewType)
     295    topSizer.Add(bakType)
     296    topSizer.Add((5,0),0)
     297    bakRef = wx.CheckBox(self.dataDisplay,label=' Refine?')
     298    bakRef.SetValue(bool(data[0][1]))
     299    bakRef.Bind(wx.EVT_CHECKBOX, OnBakRef)
     300    topSizer.Add(bakRef,0,wx.ALIGN_CENTER_VERTICAL)
     301    topSizer.Add(wx.StaticText(self.dataDisplay,-1,' No. coeff.: '),0,wx.ALIGN_CENTER_VERTICAL)
     302    bakTerms = wx.ComboBox(self.dataDisplay,-1,value=str(data[0][2]),choices=[str(i+1) for i in range(36)],
     303        style=wx.CB_READONLY|wx.CB_DROPDOWN)
     304    bakTerms.Bind(wx.EVT_COMBOBOX,OnBakTerms)
     305    topSizer.Add(bakTerms,0,wx.ALIGN_CENTER_VERTICAL)
     306    topSizer.Add((5,0),0)
     307    mainSizer.Add(topSizer)
     308    mainSizer.Add(wx.StaticText(self.dataDisplay,-1,' Background coefficients:'),0,wx.ALIGN_CENTER_VERTICAL)
     309    bakSizer = wx.FlexGridSizer(1,5,5,5)
     310    for i,value in enumerate(data[0][3:]):
     311        bakVal = wx.TextCtrl(self.dataDisplay,wx.ID_ANY,'%10.4f'%(value),style=wx.TE_PROCESS_ENTER)
     312        bakSizer.Add(bakVal,0,wx.ALIGN_CENTER_VERTICAL)
     313        ValObj[bakVal.GetId()] = [i+3]
     314        bakVal.Bind(wx.EVT_TEXT_ENTER,OnBakVal)
     315        bakVal.Bind(wx.EVT_KILL_FOCUS,OnBakVal)       
     316    mainSizer.Add(bakSizer)
    303317    mainSizer.Layout()   
    304318    self.dataDisplay.SetSizer(mainSizer)
     
    475489        instSizer.Add(typePick,0,wx.ALIGN_CENTER_VERTICAL)
    476490        if 'C' in insVal['Type']:               #constant wavelength
     491            #patch
     492            if 'Azimuth' not in insVal:
     493                insVal['Azimuth'] = 0.0
     494                insDef['Azimuth'] = 0.0
     495                insRef['Azimuth'] = False
     496            #end of patch
    477497            instSizer.Add(wx.StaticText(self.dataDisplay,-1,' Azimuth: %7.2f'%(insVal['Azimuth'])),0,wx.ALIGN_CENTER_VERTICAL)
    478498            if 'Lam1' in insVal:
     
    970990        controls[12] = G2lat.calc_V(Aref)
    971991        data = [controls,bravais,cells,dmin]
     992        cells = self.PatternTree.GetItemPyData(UnitCellsId)[2]
     993        for cell in cells:
     994            cell[-1] = False
     995        cells.insert(0,[M20,X20,ibrav]+controls[6:13]+[True,])
    972996        self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Unit Cells List'),data)
    973997        self.HKL = G2lat.GenHBravais(dmin,ibrav,Aref)
  • trunk/GSASIIspc.py

    r342 r372  
    642642        return SHKL
    643643
     644def HStrainNames(SGData):
     645    laue = SGData['SGLaue']
     646    uniq = SGData['SGUniq']
     647    if laue in ['m3','m3m']:
     648        return ['D11']
     649    elif laue in ['6/m','6/mmm','3m1','31m','3']:
     650        return ['D11','D33']
     651    elif laue in ['3R','3mR']:
     652        return ['D11','D12']
     653    elif laue in ['4/m','4/mmm']:
     654        return ['D11','D33']
     655    elif laue in ['mmm']:
     656        return ['D11','D22','D33']
     657    elif laue in ['2/m']:
     658        Dij = ['D11','D22','D33']
     659        if uniq == 'a':
     660            Dij += ['D23']
     661        elif uniq == 'b':
     662            Dij += ['D13']
     663        elif uniq == 'c':
     664            Dij += ['D12']
     665        return Dij
     666    else:
     667        Dij = ['D11','D22','D33','D12','D13','D23']
     668        return Dij
     669   
    644670def MustrainCoeff(HKL,SGData):
    645671    #NB: order of terms is the same as returned by MustrainNames
  • trunk/GSASIIstruct.py

    r369 r372  
    339339    elif SGData['SGLaue'] in ['m3m','m3']:
    340340        return [pfx+'A0']
    341    
    342        
     341           
    343342def GetPhaseData(PhaseData,Print=True):
    344    
    345        
     343           
    346344    if Print: print ' Phases:'
    347345    phaseVary = []
     
    539537            print ptstr
    540538            print varstr
     539
     540    def PrintHStrain(hapData,SGData):
     541        print '\n Hydrostatic strain: '
     542        Hsnames = G2spc.HStrainNames(SGData)
     543        ptlbls = ' names :'
     544        ptstr =  ' values:'
     545        varstr = ' refine:'
     546        for i,name in enumerate(Hsnames):
     547            ptlbls += '%12s' % (name)
     548            ptstr += '%12.6f' % (hapData[0][i])
     549            varstr += '%12s' % (str(hapData[1][i]))
     550        print ptlbls
     551        print ptstr
     552        print varstr
     553
    541554       
    542555   
     
    574587                if hapData[item][1]:
    575588                    hapVary.append(pfx+item)
     589            names = G2spc.HStrainNames(SGData)
     590            for i,name in enumerate(names):
     591                hapDict[pfx+name] = hapData['HStrain'][0][i]
     592                if hapData['HStrain'][1][i]:
     593                    hapVary.append(pfx+name)
    576594            controlDict[pfx+'poType'] = hapData['Pref.Ori.'][0]
    577595            if hapData['Pref.Ori.'][0] == 'MD':
     
    620638                PrintSize(hapData['Size'])
    621639                PrintMuStrain(hapData['Mustrain'],SGData)
     640                PrintHStrain(hapData['HStrain'],SGData)
    622641            HKLd = np.array(G2lat.GenHLaue(dmin,SGData,A))
    623642            refList = []
     
    692711            print ptstr
    693712            print sigstr
     713           
     714    def PrintHStrainAndSig(hapData,strainSig,SGData):
     715        print '\n Hydrostatic strain: '
     716        Hsnames = G2spc.HStrainNames(SGData)
     717        ptlbls = ' name  :'
     718        ptstr =  ' value :'
     719        sigstr = ' sig   :'
     720        for i,name in enumerate(Hsnames):
     721            ptlbls += '%12s' % (name)
     722            ptstr += '%12.6g' % (hapData[0][i])
     723            if name in strainSig:
     724                sigstr += '%12.6g' % (strainSig[name])
     725            else:
     726                sigstr += 12*' '
     727        print ptlbls
     728        print ptstr
     729        print sigstr
    694730       
    695731    for phase in Phases:
     
    707743            for item in ['Scale','Extinction']:
    708744                hapData[item][0] = parmDict[pfx+item]
    709                 if hapData[item][1]:
     745                if pfx+item in sigDict:
    710746                    PhFrExtPOSig[item] = sigDict[pfx+item]           
    711747            if hapData['Pref.Ori.'][0] == 'MD':
    712748                hapData['Pref.Ori.'][1] = parmDict[pfx+'MD']
    713                 if hapData['Pref.Ori.'][2]:
     749                if pfx+item in sigDict:
    714750                    PhFrExtPOSig[item] = sigDict[pfx+item]
    715751            else:                           #'SH' spherical harmonics
    716752                for item in hapData['Pref.Ori.'][5]:
    717753                    hapData['Pref.Ori.'][5][item] = parmDict[pfx+item]
    718                     if hapData['Pref.Ori.'][2]:
     754                    if pfx+item in sigDict:
    719755                        PhFrExtPOSig[item] = sigDict[pfx+item]
    720756#            print '\n Phase fraction  : %10.4f, sig %10.4f'%(hapData['Scale'][0],PhFrExtPOSig['Scale'])
     
    726762               
    727763            SizeMuStrSig = {'Mustrain':[[0,0],[0 for i in range(len(hapData['Mustrain'][4]))]],
    728                 'Size':[[0,0],[0 for i in range(len(hapData['Size'][4]))]]}                 
     764                'Size':[[0,0],[0 for i in range(len(hapData['Size'][4]))]],
     765                'HStrain':{}}                 
    729766            for item in ['Mustrain','Size']:
    730767                if hapData[item][0] in ['isotropic','uniaxial']:                   
     
    732769                    if item == 'Size':
    733770                        hapData[item][1][0] = min(10.,max(0.01,hapData[item][1][0]))
    734                     if hapData[item][2][0]:
     771                    if pfx+item+':0' in sigDict:
    735772                        SizeMuStrSig[item][0][0] = sigDict[pfx+item+':0']
    736773                    if hapData[item][0] == 'uniaxial':
     
    738775                        if item == 'Size':
    739776                            hapData[item][1][1] = min(10.,max(0.01,hapData[item][1][1]))                       
    740                         if hapData[item][2][1]:
     777                        if pfx+item+':1' in sigDict:
    741778                            SizeMuStrSig[item][0][1] = sigDict[pfx+item+':1']
    742779                else:       #generalized for mustrain or ellipsoidal for size
     
    744781                        sfx = ':'+str(i)
    745782                        hapData[item][4][i] = parmDict[pfx+item+sfx]
    746                         if hapData[item][5][i]:
     783                        if pfx+item+sfx in sigDict:
    747784                            SizeMuStrSig[item][1][i] = sigDict[pfx+item+sfx]
    748                            
     785            names = G2spc.HStrainNames(SGData)
     786            for i,name in enumerate(names):
     787                hapData['HStrain'][0][i] = parmDict[pfx+name]
     788                if pfx+name in sigDict:
     789                    SizeMuStrSig['HStrain'][name] = sigDict[pfx+name]
    749790            PrintSizeAndSig(hapData['Size'],SizeMuStrSig['Size'])
    750791            PrintMuStrainAndSig(hapData['Mustrain'],SizeMuStrSig['Mustrain'],SGData)
     792            PrintHStrainAndSig(hapData['HStrain'],SizeMuStrSig['HStrain'],SGData)
    751793   
    752794def GetHistogramData(Histograms,Print=True):
     
    888930        for i in range(lenBack):
    889931            Background[3+i] = parmDict[pfx+'Back:'+str(i)]
    890             if Background[1]:
     932            if pfx+'Back:'+str(i) in sigDict:
    891933                backSig[i] = sigDict[pfx+'Back:'+str(i)]
    892934        return backSig
     
    898940            insName = pfx+insNames[i]
    899941            insVals[i] = parmDict[insName]
    900             if flag:
     942            if insName in sigDict:
    901943                instSig[i] = sigDict[insName]
    902944        return instSig
     
    907949            for i,item in enumerate(['Scale','Shift','Transparency']):       #surface roughness?, diffuse scattering?
    908950                Sample[item][0] = parmDict[pfx+item]
    909                 if Sample[item][1]:
     951                if pfx+item in sigDict:
    910952                    sampSig[i] = sigDict[pfx+item]
    911953        elif 'Debye' in Sample['Type']:        #Debye-Scherrer
     
    913955            for item in ['Scale','Absorption','DisplaceX','DisplaceY']:
    914956                Sample[item][0] = parmDict[pfx+item]
    915                 if Sample[item][1]:
     957                if pfx+item in sigDict:
    916958                    sampSig[i] = sigDict[pfx+item]
    917959        return sampSig
     
    11161158        return Icorr
    11171159       
     1160    def GetHStrainShift(refl,SGData,phfx,parmDict):
     1161        laue = SGData['SGLaue']
     1162        uniq = SGData['SGUniq']
     1163        h,k,l = refl[:3]
     1164        if laue in ['m3','m3m']:
     1165            Dij = parmDict[phfx+'D11']*(h**2+k**2+l**2)
     1166        elif laue in ['6/m','6/mmm','3m1','31m','3']:
     1167            Dij = parmDict[phfx+'D11']*(h**2+k**2+h*k)+parmDict[phfx+'D33']*l**2
     1168        elif laue in ['3R','3mR']:
     1169            Dij = parmDict[phfx+'D11']*(h**2+k**2+l**2)+parmDict[phfx+'D12']*(h*k+h*l+k*l)
     1170        elif laue in ['4/m','4/mmm']:
     1171            Dij = parmDict[phfx+'D11']*(h**2+k**2)+parmDict[phfx+'D33']*l**2
     1172        elif laue in ['mmm']:
     1173            Dij = parmDict[phfx+'D11']*h**2+parmDict[phfx+'D22']*k**2+parmDict[phfx+'D33']*l**2
     1174        elif laue in ['2/m']:
     1175            Dij = parmDict[phfx+'D11']*h**2+parmDict[phfx+'D22']*k**2+parmDict[phfx+'D33']*l**2
     1176            if uniq == 'a':
     1177                Dij += parmDict[phfx+'D23']*k*l
     1178            elif uniq == 'b':
     1179                Dij += parmDict[phfx+'D13']*h*l
     1180            elif uniq == 'c':
     1181                Dij += parmDict[phfx+'D12']*h*k
     1182        else:
     1183            Dij = parmDict[phfx+'D11']*h**2+parmDict[phfx+'D22']*k**2+parmDict[phfx+'D33']*l**2+ \
     1184                parmDict[phfx+'D12']*h*k+parmDict[phfx+'D13']*h*l+parmDict[phfx+'D23']*k*l
     1185        return Dij*refl[4]**2*tand(refl[5]/2.0)
     1186               
    11181187    def GetReflPos(refl,wave,G,hfx,calcControls,parmDict):
    11191188        h,k,l = refl[:3]
    11201189        dsq = 1./G2lat.calc_rDsq2(np.array([h,k,l]),G)
    11211190        d = np.sqrt(dsq)
     1191        refl[4] = d
    11221192        pos = 2.0*asind(wave/(2.0*d))+parmDict[hfx+'Zero']
    11231193        const = 9.e-2/(np.pi*parmDict[hfx+'Gonio. radius'])                  #shifts in microns
     
    11671237        pfx = '%d::'%(pId)
    11681238        phfx = '%d:%d:'%(pId,hId)
     1239        SGData = Phase['General']['SGData']
    11691240        A = [parmDict[pfx+'A%d'%(i)] for i in range(6)]
    11701241        G,g = G2lat.A2Gmat(A)       #recip & real metric tensors
     
    11761247                h,k,l = refl[:3]
    11771248                refl[5] = GetReflPos(refl,wave,G,hfx,calcControls,parmDict)         #corrected reflection position
     1249                refl[5] += GetHStrainShift(refl,SGData,phfx,parmDict)               #apply hydrostatic strain shift
    11781250                refl[6:8] = GetReflSIgGam(refl,wave,G,hfx,phfx,calcControls,parmDict,sizeEllipse)    #peak sig & gam
    11791251                Icorr = GetIntensityCorr(refl,phfx,hfx,calcControls,parmDict)
     
    11821254                        refl[8] = abs(parmDict[pfx+'PWLref:%d'%(pawleyLookup[pfx+'%d,%d,%d'%(h,k,l)])])
    11831255                    except KeyError:
    1184                         print ' ***Error %d,%d,%d missing from Pawley reflection list ***'%(h,k,l)
     1256#                        print ' ***Error %d,%d,%d missing from Pawley reflection list ***'%(h,k,l)
    11851257                        continue
    11861258                else:
     
    12831355            return dpdA,dpdw,dpdZ,0.,0.,dpdXd,dpdYd
    12841356           
     1357    def GetHStrainShiftDerv(refl,SGData,phfx):
     1358        laue = SGData['SGLaue']
     1359        uniq = SGData['SGUniq']
     1360        h,k,l = refl[:3]
     1361        if laue in ['m3','m3m']:
     1362            dDijDict = {phfx+'D11':h**2+k**2+l**2,}
     1363        elif laue in ['6/m','6/mmm','3m1','31m','3']:
     1364            dDijDict = {phfx+'D11':h**2+k**2+h*k,phfx+'D33':l**2}
     1365        elif laue in ['3R','3mR']:
     1366            dDijDict = {phfx+'D11':h**2+k**2+l**2,phfx+'D12':h*k+h*l+k*l}
     1367        elif laue in ['4/m','4/mmm']:
     1368            dDijDict = {phfx+'D11':h**2+k**2,phfx+'D33':l**2}
     1369        elif laue in ['mmm']:
     1370            dDijDict = {phfx+'D11':h**2,phfx+'D22':k**2,phfx+'D33':l**2}
     1371        elif laue in ['2/m']:
     1372            dDijDict = {phfx+'D11':h**2,phfx+'D22':k**2,phfx+'D33':l**2}
     1373            if uniq == 'a':
     1374                dDijDict[phfx+'D23'] = k*l
     1375            elif uniq == 'b':
     1376                dDijDict[phfx+'D13'] = h*l
     1377            elif uniq == 'c':
     1378                dDijDict[phfx+'D12'] = h*k
     1379                names.append()
     1380        else:
     1381            dDijDict = {phfx+'D11':h**2,phfx+'D22':k**2,phfx+'D33':l**2,
     1382                phfx+'D12':h*k,phfx+'D13':h*l,phfx+'D23':k*l}
     1383        for item in dDijDict:
     1384            dDijDict[item] *= refl[4]**2*tand(refl[5]/2.0)
     1385        return dDijDict
     1386               
    12851387    def cellVaryDerv(pfx,SGData,dpdA):
    12861388        if SGData['SGLaue'] in ['-1',]:
     
    13941496                    if name in varylist:
    13951497                        dMdv[varylist.index(name)] += dpdA*dervDict['pos']
     1498                dDijDict = GetHStrainShiftDerv(refl,SGData,phfx)
     1499                for name in dDijDict:
     1500                    if name in varylist:
     1501                        dMdv[varylist.index(name)] += dDijDict[name]*dervDict['pos']
    13961502                gamDict = GetSampleGamDerv(refl,wave,G,phfx,calcControls,parmDict,sizeEllipse)
    13971503                for name in gamDict:
     
    15081614                args=([Histograms,Phases],parmDict,varyList,calcControls,pawleyLookup,dlg))
    15091615            ncyc = int(result[2]['nfev']/len(varyList))
     1616#        table = dict(zip(varyList,zip(values,result[0],(result[0]-values))))
     1617#        for item in table: print item,table[item]               #useful debug - are things shifting?
    15101618        runtime = time.time()-begin
    15111619        chisq = np.sum(result[2]['fvec']**2)
     
    15231631            if np.any(np.isnan(sig)):
    15241632                print '*** Least squares aborted - some invalid esds possible ***'
    1525             table = dict(zip(varyList,zip(values,result[0],(result[0]-values)/sig)))
     1633#            table = dict(zip(varyList,zip(values,result[0],(result[0]-values)/sig)))
    15261634#            for item in table: print item,table[item]               #useful debug - are things shifting?
    15271635            break                   #refinement succeeded - finish up!
     
    15411649    SetUsedHistogramsAndPhases(GPXfile,Histograms,Phases)
    15421650#for testing purposes!!!
    1543 #    import cPickle
    1544 #    file = open('structTestdata.dat','wb')
    1545 #    cPickle.dump(parmDict,file,1)
    1546 #    cPickle.dump(varyList,file,1)
    1547 #    for histogram in Histograms:
    1548 #        if 'PWDR' in histogram[:4]:
    1549 #            Histogram = Histograms[histogram]
    1550 #    cPickle.dump(Histogram,file,1)
    1551 #    cPickle.dump(Phases,file,1)
    1552 #    cPickle.dump(calcControls,file,1)
    1553 #    cPickle.dump(pawleyLookup,file,1)
    1554 #    file.close()
     1651    import cPickle
     1652    file = open('structTestdata.dat','wb')
     1653    cPickle.dump(parmDict,file,1)
     1654    cPickle.dump(varyList,file,1)
     1655    for histogram in Histograms:
     1656        if 'PWDR' in histogram[:4]:
     1657            Histogram = Histograms[histogram]
     1658    cPickle.dump(Histogram,file,1)
     1659    cPickle.dump(Phases,file,1)
     1660    cPickle.dump(calcControls,file,1)
     1661    cPickle.dump(pawleyLookup,file,1)
     1662    file.close()
    15551663
    15561664def main():
Note: See TracChangeset for help on using the changeset viewer.