Changeset 372 for trunk/GSASIIpwd.py


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.