def fitTwoGaussians(x,y): background = PolynomialModel(2) pars = background.make_params() peak1 = GaussianModel(prefix='p1_') pars.update( peak1.make_params()) peak2 = GaussianModel(prefix='p2_') pars.update( peak2.make_params()) # Guess some parameters from data to help the fitting span = max(x)-min(x) c1Guess = (y[-1]-y[0])/(x[-1]-x[0]) c0Guess = y[0]-c1Guess*x[0] bgGuess = background.func(x=x,c0=c0Guess,c1=c1Guess,c2=0.) signalGuess=min(y-bgGuess) sigmaGuess = span/30. amplitudeGuess = signalGuess*(sigmaGuess*np.sqrt(2.0*np.pi)) # Fit variables initialization # pars.add('splitting',0.0001,max=span) pars['c2'].set(0.,min=-0.000001,max=0.001) pars['c1'].set(c1Guess) pars['c0'].set(c0Guess) pars['p1_center'].set(min(x)+span*0.35,min=min(x),max=max(x)) pars['p2_center'].set(min(x)+span*0.55,min=min(x),max=max(x)) # pars['p2_center'].set(min(x)+span*0.65,expr='p1_center+splitting') pars['p1_amplitude'].set(amplitudeGuess,max=amplitudeGuess/10000.) pars['p2_amplitude'].set(amplitudeGuess,max=amplitudeGuess/10000.) pars['p1_sigma'].set(sigmaGuess, min=sigmaGuess/100.,max=sigmaGuess*10000.) pars['p2_sigma'].set(sigmaGuess, min=sigmaGuess/100.,max=sigmaGuess*10000.) #Add some useful parameters to evaluate pars.add('p1_signal', expr='p1_amplitude/(p1_sigma*sqrt(2.0*pi))') pars.add('p2_signal', expr='p2_amplitude/(p2_sigma*sqrt(2.0*pi))') pars.add('p1_contrast', expr='-p1_amplitude/(p1_sigma*sqrt(2.0*pi)*(c0+c1*p1_center+c2*p1_center**2))') pars.add('p2_contrast', expr='-p2_amplitude/(p2_sigma*sqrt(2.0*pi)*(c0+c1*p2_center+c2*p2_center**2))') pars.add('splitting',pars['p2_center']-pars['p1_center'],expr='p2_center-p1_center',min=0.00001) model = peak1 + peak2 + background init = model.eval(pars, x=x) out = model.fit(y, pars, x=x) # print out.fit_report() return init,out