def fit_signal(signal,l): x1=np.linspace(0,1,len(signal)) piecewiseModel=Model(piecewise_prob) piecewiseModel.set_param_hint('l', value=1,vary=False) piecewiseModel.set_param_hint('C', vary=True, value=.1,min=0,max=1) piecewiseModel.make_params() res=piecewiseModel.fit(signal,x=x1,weights=np.sin(1.5*x1)+1.5) return res
def lmfit_gaussian(x_array, y_array, err_array, x_boundarys): # Find indeces for six points in spectrum idcsW = np.searchsorted(x_array, x_boundarys) # Emission region idcsEmis = (x_array[idcsW[2]] <= x_array) & (x_array <= x_array[idcsW[3]]) # Return left and right continua merged in one array idcsCont = (((x_array[idcsW[0]] <= x_array) & (x_array <= x_array[idcsW[1]])) | ((x_array[idcsW[4]] <= x_array) & (x_array <= x_array[idcsW[5]]))).squeeze() emisWave, emisFlux = x_array[idcsEmis], y_array[idcsEmis] contWave, contFlux = x_array[idcsCont], y_array[idcsCont] idx_peak = np.argmax(emisFlux) fit_model = Model(linear_model, prefix=f'{lineLabel}_cont_') fit_model.set_param_hint(f'{lineLabel}_cont_slope', **{ 'value': 0, 'vary': False }) fit_model.set_param_hint(f'{lineLabel}_cont_intercept', **{ 'value': contFlux.mean(), 'vary': False }) fit_model += Model(gaussian_model, prefix=f'{lineLabel}_') fit_model.set_param_hint(f'{lineLabel}_amp', value=emisFlux[idx_peak] - contFlux.mean()) fit_model.set_param_hint(f'{lineLabel}_center', value=emisWave[idx_peak]) fit_model.set_param_hint(f'{lineLabel}_sigma', value=1.0) x_fit = x_array[idcsEmis + idcsCont] y_fit = y_array[idcsEmis + idcsCont] w_fit = 1.0 / err_array[idcsEmis + idcsCont] fit_params = fit_model.make_params() obs_fit_output = fit_model.fit(y_fit, fit_params, x=x_fit, weights=w_fit) # amp = obs_fit_output.params[f"{lineLabel}_amp"].value mu = obs_fit_output.params[f"{lineLabel}_center"].value sigma = obs_fit_output.params[f"{lineLabel}_sigma"].value mu_err = obs_fit_output.params[f"{lineLabel}_center"].stderr sigma_err = obs_fit_output.params[f"{lineLabel}_sigma"].stderr x_obs, y_obs = obs_fit_output.userkws['x'], obs_fit_output.data wave_obs = np.linspace(x_obs[0], x_obs[-1], 500) flux_comps_obs = obs_fit_output.eval_components(x=wave_obs) flux_obs = flux_comps_obs.get(f'{lineLabel}_cont_', 0.0) + flux_comps_obs[f'{lineLabel}_'] return x_fit, y_fit, wave_obs, flux_obs, mu, sigma, mu_err, sigma_err
def make_model(num): pref = "f{0}_".format(num) model = Model(Lorexponential, prefix=pref) model.set_param_hint(pref + "simetricL", value=0.01) model.set_param_hint(pref + "asymetricL", value=0.01) model.set_param_hint(pref + "center", value=paramos[num]["center"]) model.set_param_hint(pref + "sigma", value=paramos[num]["sigma"]) model.set_param_hint(pref + "C", value=0.001) return model
y1=smooth_signal(y1,10**3) y1=np.real(sharpen_filter(y1)) plt.clf() plt.plot(y1,'b') plt.savefig("".join([sys.argv[1],"blak"])+".png") print(sys.argv[1]+": Coverage OK ("+str(coveragePercentage)+" x).") x1=np.linspace(0,genomeLen-1,len(y1)) ### Korem fit # fit piecewise using least squares (LM) piecewiseModel=Model(piecewiseLinear) piecewiseModel.set_param_hint('Ol', value=0.5*genomeLen,vary=True,min=0,max=genomeLen) #piecewiseModel.set_param_hint('Tl', value=0.6*genomeLen,vary=True,min=0,max=genomeLen) piecewiseModel.set_param_hint('Tc', value = np.median(np.log2(y1)), vary=True) piecewiseModel.set_param_hint('Oc', value = np.median(np.log2(y1)), vary=True) piecewiseModel.set_param_hint('delta', value = 0.545*genomeLen, min=0.45*genomeLen, max=0.55*genomeLen, vary=True)#,expr='Tl-Ol if Tl-Ol > 0 else Ol-Tl') #piecewiseModel.set_param_hint('Tl', value=0.6*genomeLen,vary=True,min=0,max=genomeLen,expr='mod(Ol+delta,genLen)') piecewiseModel.set_param_hint('genLen', vary=False, value=genomeLen) piecewiseModel.make_params() result=piecewiseModel.fit(np.log2(y1),x=x1) resR2=R2(result.best_fit,y1) # var=np.var(abs(np.log2(y1)-result.best_fit), dtype=np.float64) #med=np.median(np.log2(y1)) # y1=[value for value in y1 if (np.log2(value) < med+1.45*np.sqrt(var)) & (np.log2(value)>med-1.45*np.sqrt(var))]
err_voxel_norm = flux_err / norm_flux obsLineWaves = wave_regions * (1 + z_objs[i]) idcsEmis, idcsCont = obsLm.define_masks(wave, flux_voxel_norm, obsLineWaves) emisWave, emisFlux = wave[idcsEmis], flux_voxel_norm[idcsEmis] contWave, contFlux = wave[idcsCont], flux_voxel_norm[idcsCont] obsLm.line_properties(emisWave, emisFlux, contWave, contFlux, bootstrap_size=5000) fit_model = Model(linear_model, prefix=f'{lineLabel}_cont_') fit_model.set_param_hint(f'{lineLabel}_cont_slope', **{ 'value': obsLm.m_cont, 'vary': False }) fit_model.set_param_hint(f'{lineLabel}_cont_intercept', **{ 'value': obsLm.n_cont, 'vary': False }) fit_model += Model(gaussian_model, prefix=f'{lineLabel}_') fit_model.set_param_hint(f'{lineLabel}_amplitude', value=obsLm.peak_flux - obsLm.cont) fit_model.set_param_hint(f'{lineLabel}_center', value=obsLm.peak_wave) fit_model.set_param_hint(f'{lineLabel}_sigma', value=1.0) x_array = wave[idcsEmis + idcsCont] y_array = flux_voxel_norm[idcsEmis + idcsCont] w_array = 1.0 / np.sqrt(err_voxel_norm[idcsEmis + idcsCont])