ThreadSafe Function dslor_ker(w,x) WAVE w Variable x //w[0]=Lor width //w[1]=Asymmetry //w[2]=BE Variable num,den,lhw=abs(w[0]/2),asy=w[1],y x=x-w[2]; w[1]=abs(w[1]) num=lhw*cos(pi*asy/2 + (1-asy)*atan(x/lhw) ) den=(x^2+lhw^2)^((1-asy)/2) y=num/den return(y) //normalized to 1 for ASY=0 End ///////////////////////////////////// ThreadSafe Function dsgn_2_ker(w,yw,xw) WAVE w,yw,xw Variable i, j, L, M, N, dE, left, first, last N=numpnts(yw) dE=xw[1]-xw[0]; left=DimOffset(yw,0)-N*dE Make/O/N=(3*N) ds_peak SetScale/P x, left, dE, ds_peak Make/O/N=3 w_ds w_ds[0]=w[2]; w_ds[1]=w[3]; w_ds[2]=w[6] ds_peak=dslor_ker(w_ds,x) i=DimOffset(ds_peak,0); j=DimDelta(ds_peak,0); N=DimSize(ds_peak,0) Duplicate/O ds_peak, gau_res left=((N-1)/2)*(-dE) SetScale/P x, left,dE, gau_res gau_res=(1/sqrt(pi*w[4]^2))*exp(-(x/w[4])^2) Convolve/A gau_res, ds_peak L=numpnts(xw); first=xw[0]; last=xw[L-1] M=x2pnt(ds_peak,first); N=x2pnt(ds_peak,last); L=numpnts(ds_peak) DeletePoints N+1, L-N-1,ds_peak DeletePoints 0, M, ds_peak WaveStats/Q ds_peak ds_peak*=w[5]/V_max yw=w[0]+w[1]*(xw-w[6])+ds_peak End ////////////////////////////////// Function Step1_DS1_FE_add_G(w, yy, xx) : fitfunc Wave w, yy, xx variable nt = ThreadProcessorCount variable tgID = ThreadGroupCreate(nt) variable ii, startP, perT, remainingP perT = floor(dimsize(yy, 0) / nt) remainingP = dimsize(yy, 0) make/n=(nt)/free/wave theDataY, theDataX for(ii = 0 ; ii < nt ; ii+=1) if(ii < nt -1) theDataY[ii] = newfreewave(0x04, perT) theDataX[ii] = newfreewave(0x04, perT) else theDataY[ii] = newfreewave(0x04, remainingP) theDataX[ii] = newfreewave(0x04, remainingP) endif Wave yyy = theDataY[ii] Wave xxx = theDataX[ii] yyy = yy[p+startP] xxx = xx[p+startP] startP += perT remainingP -= perT ThreadStart tgID, ii, Step1_DS1_FE_add_ker(w, theDataY[ii], theDataX[ii]) WaveClear yyy, xxx endfor variable finished = ThreadGroupWait(tgID, inf) finished = threadgrouprelease(tgID) //now copy back into structure wave startP = 0 perT = floor(dimsize(yy, 0) / nt) remainingP = dimsize(yy, 0) for(ii = 0 ; ii < nt ; ii+=1) Wave yyy = theDataY[ii] yy[startP, startP+numpnts(yyy)] = yyy[p-startP] Waveclear yyy startP += perT remainingP -= perT endfor End Threadsafe Function Step1_DS1_FE_add_ker(w,yw,xw) //Fit function with single DS peak plus single step background plus linear baseline plus Fermi edge WAVE w,yw,xw Variable i, j, L, M, N, k_B, left, dE, first, last,center,intensity,slope //w[0]=constant background //w[1]=slope //w[2]=Lorentzian linewidth //w[3]=asymmetry parameter //w[4]=Gaussian linewidth //w[5]=intensity //w[6]=BE (negative values) //w[7]=Step background intensity //w[8]=Step background slope //w[9]=FE intensity //w[10]=Temperature (in Kelvin) //w[11]=E_f //w[12]=resolution width (Gaussian) k_B=0.00008617343 N=numpnts(yw) dE=xw[1]-xw[0]; left=DimOffset(yw,0)-N*dE Make/O/N=(3*N) signalo signalo=1 SetScale/P x, left, dE, signalo Duplicate/O signalo, x_signalo x_signalo=x w[2]=abs(w[2]); w[4]=abs(w[4]); w[5]=abs(w[5]); w[M-3]=abs(w[M-3]); w[M-4]=abs(w[M-4]) Duplicate/O w, w_1 Redimension/N=7 w_1 w_1[0]=0; w_1[1]=0 dsgn_2_ker(w_1,signalo,x_signalo) WaveStats/Q signalo signalo*=w[5]/V_max Duplicate/O signalo, signalo_2, int_y_wave, sgn_y_wave Reverse/P signalo i=signalo[0]; signalo-=i Integrate/METH=1 signalo /D=int_y_wave N=numpnts(int_y_wave); M=int_y_wave[N-1] int_y_wave*=(w[7]/M) signalo+=int_y_wave Reverse/P signalo sgn_y_wave=(w[8]*(xw-w[6]))*((1-sign((xw-w[6])))/2) signalo+=sgn_y_wave M=numpnts(w) signalo+=abs(w[M-4])*(exp((x_signalo-w[M-2])/(k_B*w[M-3]))+1)^(-1) i=DimOffset(signalo,0); j=DimDelta(signalo,0); N=DimSize(signalo,0) Duplicate/O signalo, gau_res left=((N-1)/2)*(-dE) SetScale/P x, left,dE, gau_res gau_res=(1/sqrt(pi*w[M-1]^2))*exp(-(x/w[M-1])^2) Convolve/A gau_res, signalo signalo*=dE L=numpnts(xw); first=xw[0]; last=xw[L-1] M=x2pnt(signalo,first); N=x2pnt(signalo,last); L=numpnts(signalo) DeletePoints N+1, L-N-1, signalo DeletePoints 0, M, signalo yw=w[0]+w[1]*(xw-w[6])+signalo End