title: Python: two-curve gaussian fitting with non-linear least-squares
body: <p>My knowledge of maths is limited which is why I am probably stuck. I have a spectra to which I am trying to fit two Gaussian peaks. I can fit to the largest peak, but I cannot fit to the smallest peak. I understand that I need to sum the Gaussian function for the two peaks but I do not know where I have gone wrong. An image of my current output is shown:</p>
  
  <p><img src="https://i.stack.imgur.com/7JYwH.png" alt="Current Output"></p>
  
  <p>The blue line is my data and the green line is my current fit. There is a shoulder to the left of the main peak in my data which I am currently trying to fit, using the following code:</p>
  
  <pre><code>import matplotlib.pyplot as pt
  import numpy as np
  from scipy.optimize import leastsq
  from pylab import *
  
  time = []
  counts = []
  
  
  for i in open('/some/folder/to/file.txt', 'r'):
      segs = i.split()
      time.append(float(segs[0]))
      counts.append(segs[1])
  
  time_array = arange(len(time), dtype=float)
  counts_array = arange(len(counts))
  time_array[0:] = time
  counts_array[0:] = counts
  
  
  def model(time_array0, coeffs0):
      a = coeffs0[0] + coeffs0[1] * np.exp( - ((time_array0-coeffs0[2])/coeffs0[3])**2 )
      b = coeffs0[4] + coeffs0[5] * np.exp( - ((time_array0-coeffs0[6])/coeffs0[7])**2 ) 
      c = a+b
      return c
  
  
  def residuals(coeffs, counts_array, time_array):
      return counts_array - model(time_array, coeffs)
  
  # 0 = baseline, 1 = amplitude, 2 = centre, 3 = width
  peak1 = np.array([0,6337,16.2,4.47,0,2300,13.5,2], dtype=float)
  #peak2 = np.array([0,2300,13.5,2], dtype=float)
  
  x, flag = leastsq(residuals, peak1, args=(counts_array, time_array))
  #z, flag = leastsq(residuals, peak2, args=(counts_array, time_array))
  
  plt.plot(time_array, counts_array)
  plt.plot(time_array, model(time_array, x), color = 'g') 
  #plt.plot(time_array, model(time_array, z), color = 'r')
  plt.show()
  </code></pre>