import numpy as np
from lmfit.models import LorentzianModel, GaussianModel, VoigtModel, StepModel, LinearModel
import matplotlib.pyplot as plt
from StringIO import StringIO
#Read and display the image
fob= open('test.txt', 'r')
data_read= fob.read()
data = np.genfromtxt(StringIO(data_read), delimiter=",")[:]
plt.imshow(data)
plt.show()
# to extract a profile from the image
def profile(x_value,y_start,y_end):
x = np.array(range(len(np.arange(y_start,y_end))), dtype=np.float)
y = np.array(data[x_value,y_start:y_end], dtype=np.float)
return x, y
# Here I took just one profile but actually I need to perform fit on 24 profiles
# x = np.linspace(46, 964, 24)
x, y = profile(485, 60, 950)
plt.plot(x,y)
plt.show()
MODEL = 'gauss'
#MODEL = 'loren'
#MODEL = 'voigt'
#gamma_free = False
gamma_free = True
if MODEL.lower().startswith('g'):
mod1 = GaussianModel(prefix='g1_')
mod2 = GaussianModel(prefix='g2_')
mod3 = GaussianModel(prefix='g3_')
mod4 = GaussianModel(prefix='g4_')
mod5 = GaussianModel(prefix='g5_')
mod6 = GaussianModel(prefix='g6_')
mod7 = GaussianModel(prefix='g7_')
mod8 = GaussianModel(prefix='g8_')
mod9 = GaussianModel(prefix='g9_')
mod10 = GaussianModel(prefix='g10_')
mod11 = GaussianModel(prefix='g11_')
mod12 = GaussianModel(prefix='g12_')
elif MODEL.lower().startswith('l'):
mod1 = LorentzianModel(prefix='l1_')
mod2 = LorentzianModel(prefix='l2_')
mod3 = LorentzianModel(prefix='l3_')
mod4 = LorentzianModel(prefix='l4_')
mod5 = LorentzianModel(prefix='l5_')
mod6 = LorentzianModel(prefix='l6_')
mod7 = LorentzianModel(prefix='l7_')
mod8 = LorentzianModel(prefix='l8_')
mod9 = LorentzianModel(prefix='l9_')
mod10 = LorentzianModel(prefix='l10_')
mod11 = LorentzianModel(prefix='l11_')
mod12 = LorentzianModel(prefix='l12_')
elif MODEL.lower().startswith('v'):
mod1 = VoigtModel(prefix='v1_')
mod2 = VoigtModel(prefix='v2_')
mod3 = VoigtModel(prefix='v3_')
mod4 = VoigtModel(prefix='v4_')
mod5 = VoigtModel(prefix='v5_')
mod6 = VoigtModel(prefix='v6_')
mod7 = VoigtModel(prefix='v7_')
mod8 = VoigtModel(prefix='v8_')
mod9 = VoigtModel(prefix='v9_')
mod10 = VoigtModel(prefix='v10_')
mod11 = VoigtModel(prefix='v11_')
mod12 = VoigtModel(prefix='v12_')
def index_of(arrval, value):
"return index of array *at or below* value "
if value < min(arrval): return 0
return max(np.where(arrval<=value)[0])
ix1 = index_of(x, 45)
ix2 = index_of(x, 100)
ix3 = index_of(x, 180)
ix4 = index_of(x, 240)
ix5 = index_of(x, 340)
ix6 = index_of(x, 420)
ix7 = index_of(x, 500)
ix8 = index_of(x, 580)
ix9 = index_of(x, 660)
ix10 = index_of(x,740 )
ix11 = index_of(x,820 )
ix12 = index_of(x,900 )
pars1 = mod1.guess(y[:ix1], x=x[:ix1])
pars2 = mod2.guess(y[ix1:ix2], x=x[ix1:ix2])
pars3 = mod3.guess(y[ix2:ix3], x=x[ix2:ix3])
pars4 = mod4.guess(y[ix3:ix4], x=x[ix3:ix4])
pars5 = mod5.guess(y[ix4:ix5], x=x[ix4:ix5])
pars6 = mod6.guess(y[ix5:ix6], x=x[ix5:ix6])
pars7 = mod7.guess(y[ix6:ix7], x=x[ix6:ix7])
pars8 = mod8.guess(y[ix7:ix8], x=x[ix7:ix8])
pars9 = mod9.guess(y[ix8:ix9], x=x[ix8:ix9])
pars10 = mod10.guess(y[ix9:ix10], x=x[ix9:ix10])
pars11 = mod11.guess(y[ix10:ix11], x=x[ix10:ix11])
pars12 = mod12.guess(y[ix11:ix12], x=x[ix11:ix12])
pars = pars1 + pars2 + pars3 + pars4 + pars5 + pars6 + pars7 + pars8 + pars9 + pars10 + pars11 + pars12
mod = mod1 + mod2 + mod3 + mod4 + mod5 + mod6 + mod7 + mod8 + mod9 + mod10 + mod11 + mod12
out = mod.fit(y, pars, x=x)
print(out.fit_report(min_correl=0.5))
plt.plot(x, y)
plt.plot(x, out.init_fit, 'k--')
plt.plot(x, out.best_fit, 'r-')
plt.show()