#-*- coding: utf-8 -*- # Comparação do espectros de espalhamento baseados na função modificada de Bessel do primeiro tipo de ordem 1 # com o modelo Gaussiano. # Referência: R. P. Pezzi, et al. Applied Physics Letters, 92 164102 (2008) from pylab import * from numpy import nan_to_num from scipy.special import i1 from Ewindow import Edict PI=math.pi #################################################################################################################################################### # Seção de choque Rutherford def CSRf(Z1, Z2, Ein, M1, M2, Theta): if M1 < M2: return ((Z1*Z2*4.8e-20*1e8)/(4*Ein))**2 * sin(Theta)**-4 * (sqrt(1-((M1/M2)*sin(Theta))**2)+cos(Theta))**2 / sqrt(1-((M1/M2)*sin(Theta))**2) else: return 0 #################################################################################################################################################### # Função de convolução com forma de linha def convoluiF0(espectro, alpha,passoE): areaantes = espectro.sum() temp = espectro[::-1] eixo = arange(0,12.*alpha,passoE) lineshape = alpha*exp(-eixo/alpha) # ls_plt=plt.plot(lineshape/lineshape.sum(),lw=2) # sig_plt=plt.plot(temp/temp.sum(),lw=2) temp = convolve(temp/temp.sum(), lineshape/lineshape.sum()) temp.resize(len(espectro)) # result_plt=plt.plot(temp/temp.sum(),'o') # legend([ls_plt,sig_plt,result_plt],["Lineshape","Sinal","Resultado"]) return temp[::-1]*areaantes #################################################################################################################################################### def spectro(p, modelo, ion, Emin, Emax, EPasso, passox, LScontrol): e = arange(Emin, Emax, EPasso) Y = e*0. dose = 10e33 Theta_s = PI - (p['Theta_in'] + p['Theta_out'])*PI/180 mi = ion['mass'] espessura = 15 ## Calcula o espectro de cada elemento da amostra for componente in Edict: mt = Edict[componente]['mass'] c = Edict[componente]['dist'] alpha_lineshape = Edict[componente]['LineShape'] k = ((sqrt (mt**2+mi**2*(sin(Theta_s)**2)) + mi*cos(Theta_s) ) / (mi+mt) )**2 dedxef=p['dedx']*(k/cos(p['Theta_in']*PI/180.) + 1/cos(p['Theta_out']*PI/180.)) dw2dxef=p['dW2dx']*(k**2./cos(p['Theta_in']*PI/180.)+1./cos(p['Theta_out']*PI/180.)) sinalbessel=e*0 sinalgaussiana=e*0 # Calcula a contribuição de cada camada for x in arange(passox,espessura,passox): # Seção de choque - CSRf(Z1, Z2, Ein, M1, M2, Theta): CS = c[int(x/passox)]*k*CSRf(ion['Z'], Edict[componente]['Z'], k*p['E0']-dedxef*x, mi, mt, Theta_s)*passox # É multiplicada pelo passo para manter a escala do gráfico independente do mesmo. # Bessel: # Ainda falta incluir a delta de Dirac na origem e a convolução com a resolução experimental # Existe um valor máximo em energia no qual a função de Bessel pode ser computada em função # da precisão numérica. Uma possível solução pode ser trabalhar em outras unidades que não # resultem em argumentos tão grandes para a função exponencial. # Também temos um problema com a primeira camada, que tem profundidade zero. # Perceba que os cálculos de Bessel correspondentes às camadas mais fundas estão truncados # para uma perda de energia maior que 25 keV. (Observado com Theta_in=70, para x > 30) if modelo == 'bessel': alpha=dedxef*(2./dw2dxef) m=alpha*dedxef lbd=m*x*alpha besselcamada = lbd*exp(-m*x-alpha*(k*p['E0']-e))*i1(2.*sqrt(lbd*(k*p['E0']-e)))/(sqrt(lbd*(k*p['E0']-e))) sinalbessel = besselcamada*CS+sinalbessel # Gaussiana: elif modelo == 'gaussiana': Em=k*p['E0']-x*dedxef sigma=x*dw2dxef gaussianacamada = exp((-(e-Em)**2)/(2.*sigma))/sqrt(2.*PI*sigma) sinalgaussiana = gaussianacamada*CS+sinalgaussiana if modelo == 'bessel': besself = nan_to_num(sinalbessel) if LScontrol == 1: besself = convoluiF0(besself, alpha_lineshape, EPasso) Y = besself + Y elif modelo == 'gaussiana': if LScontrol == 1: sinalgaussiana = convoluiF0(sinalgaussiana, alpha_lineshape, EPasso) Y = sinalgaussiana + Y plt.plot(e,Y*dose) suptitle('Signal received', fontsize=12) xlabel("Enegy (eV)") ylabel("Yield") amostra = np.loadtxt('H2.py') xxx= amostra[:,0]*1000 ccc=amostra[:,1] plot (xxx, ccc, 'r.') show() ####################################################################################################################################################