def get_params_global(data):

    # First curve fit a single experiment to get a decent
    # initial guess for the global fit
    # parms = (2.0e-9*1e-4, 9.0e-3/1e-4, 1.0, 1.0)
    #parms = 1e-7, 1e-3, -1000, 1000
    parms = 1e-7, 1e-3, -3000, 3000
    i = 1
    pg, pcovg = curve_fit(lambda times, *p0: wvtr_vec_global(
        data[i].ts, data[i].RH, data[i].temp, data[i].thickness, *p0),
                          data[i].ts,
                          data[i].js,
                          p0=parms)

    # This is global fit using function above
    eg = lambda par: esq_global(par, data)
    pg2 = minimize(eg,
                   pg,
                   method='Nelder-Mead',
                   tol=1.0e-4,
                   options={
                       "maxfev": 100000,
                       "maxiter": 100000
                   })

    print "Global fitting residual: ", eg(pg2.x)
    return pg2.x
def esq_global(par, data):
    L = 0.0
    for i in range(len(data)):
        fsim = wvtr_vec_global(data[i].ts, data[i].RH, data[i].temp,
                               data[i].thickness, *par)
        L = L + np.sum((fsim - data[i].js)**2)
    return L * 1e12  # Scale so that it is O(1)
def lnlike(par, data):
    L = 0.0
    for i in range(len(data)):
        fsim = wvtr_vec_global(data[i].ts, data[i].RH, data[i].temp,
                               data[i].thickness, *par)
        inv_sigma2 = 1 / (data[i].sigma * data[i].sigma)
        L = L - 0.5 * np.sum((fsim - data[i].js)**2 * inv_sigma2) / len(fsim)
    return L
    #       # plt.plot(err)
    #       # plt.show()
    #        plt.plot(fsim)
    #        plt.plot(data[i].js)
    #        plt.show()
    #        L = L - 0.5 * np.sum( (fsim - data[i].js)**2 * inv_sigma2)
    #
    #    print "loglikelihood = ", L
    #
    # end explore likelihood computation
    # Plot out global and fits of fits
    for i in range(len(data)):
        ax = plt.subplot(nrows, ncols, i)

        thisfit_global_2step = wvtr_vec_global(data[i].ts, data[i].RH,
                                               data[i].temp, data[i].thickness,
                                               *pg_2step)
        thisfit_global = wvtr_vec_global(data[i].ts, data[i].RH, data[i].temp,
                                         data[i].thickness, *pg_1step)
        thisfit = wvtr_vec(data[i].ts, data[i].RH, data[i].temp,
                           data[i].thickness, *pfits[i])

        ax = plt.subplot(nrows, ncols, i)

        l = ax.plot(data[i].ts, data[i].js, 'x')
        ax.plot(data[i].ts, data[i].js + 2 * data[i].sigma, '--g')
        ax.plot(data[i].ts, data[i].js - 2 * data[i].sigma, '--g')

        ax.plot(data[i].ts, thisfit_global_2step, '--r', lw=2)
        ax.plot(data[i].ts, thisfit_global, '--m', lw=2)
        ax.plot(data[i].ts, thisfit, '--b', lw=2)