Skip to content

Feat: Add fluorescene background fitting to RSoXS.py #165

@dsunday

Description

@dsunday

Add fluorescence fitting function to the RSoXS.py module, see example of the code below. This function will estimate the fluorescence background around the carbon edge, with the assumption that the power law scaling is identical at all energies.

def XRFBackground(sample, q_lower1, q_upper1, q_lower2, q_upper2,pre, post, printE):
def exp_func(q, para):
A, B, C = para
return A * q**B + C

def err(para,q,y):
    return abs(exp_func(q, para)-y)

# para: [A1 A2 B C2], B1=B2, C1=0
def err_global(para, q1, q2, y1, y2):
    p1 = para[0], para[2], 0
    p2 = para[1], para[2], para[3]

    err1 = err(p1,q1,y1)
    err2 = err(p2,q2,y2)

    return np.concatenate((err1,err2))

pre_int=sample.sel(energy=pre, q=slice(q_lower1,q_upper1)).mean('chi').values
pre_q=sample.sel(energy=pre, q=slice(q_lower1,q_upper1)).mean('chi')['q']
pre_int=pre_int[:,0,0]


post_int=sample.sel(energy=post, q=slice(q_lower1,q_upper1)).mean('chi').values
post_q=sample.sel(energy=post, q=slice(q_lower1,q_upper1)).mean('chi')['q']
post_int=post_int[:,0,0]

plt.plot(post_q,post_int)
plt.plot(pre_q,pre_int)
plt.show()
# initial guess of para:
init_guess = [1, 1, -4, 0]

para_best, ier = scipy.optimize.leastsq(err_global, init_guess, args=(pre_q,post_q,pre_int, post_int))
para_best1 = [para_best[0], para_best[2], 0]
para_best2 = [para_best[1], para_best[2], para_best[3]]

xrf_power_law_fit = para_best[2]
para_best

sample.sel(energy=pre ).mean('chi').plot(yscale='log',xscale='log', label=str(pre))
sample.sel(energy=post ).mean('chi').plot(yscale='log',xscale='log', label=str(post))

plt.plot(pre_q,exp_func(pre_q,para_best1),label= str(pre)+' ev fit',color='blue',linewidth=3)
plt.plot(pre_q,exp_func(post_q,para_best2),label=str(post)+' ev fit',color='blue',linewidth=3)
plt.show()
plt.legend(loc='lower left')

# exponential function
def exp_func2(q, para):
    A, C = para
    return A * q**(xrf_power_law_fit) + C

def err2(para,q,y):
    return abs(exp_func2(q, para)-y)

xrf_fit = []
xrf_fit_A = []
Elist=sample['energy']

for i,v in enumerate(Elist):
    if v ==printE:
        intensity=sample.sel(energy=v, q=slice(q_lower2,q_upper2)).mean('chi').values
        intensity=intensity[:,0,0]
        q_values=sample.sel(energy=v, q=slice(q_lower2,q_upper2)).mean('chi')['q']
        init_guess = [1, 80]
        para_best, ier = scipy.optimize.leastsq(err2, init_guess, args=(q_values,intensity))
        xrf_fit.append(para_best[1])
        xrf_fit_A.append(para_best[0])
        sample.sel(energy=printE ).mean('chi').plot(yscale='log',xscale='log', label=str(printE))
        plt.plot(q_values,exp_func2(q_values,para_best),label= str(printE)+' ev fit',color='blue',linewidth=3)
        plt.show()
        plt.legend(loc='lower left')
    else:
        intensity=sample.sel(energy=v, q=slice(q_lower2,q_upper2)).mean('chi').values
        intensity=intensity[:,0,0]
        q_values=sample.sel(energy=v, q=slice(q_lower2,q_upper2)).mean('chi')['q']
        init_guess = [1, 80]
        para_best, ier = scipy.optimize.leastsq(err2, init_guess, args=(q_values,intensity))
        xrf_fit.append(para_best[1])
        xrf_fit_A.append(para_best[0])

xrf_fit=np.asarray(xrf_fit)
Elist=np.asarray(Elist)
xrf_fit[xrf_fit<0]=0
xrf_fit[Elist<285]=0
plt.plot(Elist,xrf_fit,marker='.')
ax = plt.gca()
ax.set(xlabel='eV',ylabel='XRF Offset Value')

return(xrf_fit, xrf_fit_A)

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions