def pre(self, event): global l if cp.plot_vers == 2: if haveImCube: self.ax3.remove() #fx.visual() if cp.plot_vers == 3: self.ax4.remove() self.cbar2.remove() self.axslider2.remove() #fx.visual() self.ax2setup() if cp.plot_vers != 1: cp.plot_vers = 1 if 'ix' not in globals(): global ix, iy ix = spectra.shape[1] // 2 iy = spectra.shape[0] // 2 spec = np.array(spectra[iy][ix]) self.ax1.scatter(ix, iy, s=200, marker='x', c='white', linewidth=2.5) self.ax2_title.set_text('Pixel (%ix , %iy): Spectra' % (ix, iy)) self.curveSpec.set_ydata(spec) param = fx.paramSliders() #s = M2(freqs, *param) self.curveM2.set_ydata(M2(freqs, *param)) self.curveM1.set_ydata(M1(freqs, *param[:3])) self.curveLorentz.set_ydata(m2(freqs, *param[3:6])) #l, = ax2.loglog(freqs, s, lw=1.5, color='red') plt.text(0.05, 11.5, "*Using parameters found in: '%s'" % param_dir) self.axreload = plt.axes([0.83, 0.18, 0.05, 0.05]) self.axsaveFig = plt.axes([0.83, 0.11, 0.05, 0.05]) self.axreset = plt.axes([0.83, 0.04, 0.05, 0.05]) self.breload = Button(self.axreload, 'Reload') self.breload.on_clicked(fx.reload) self.bsaveFig = Button(self.axsaveFig, 'Save') self.bsaveFig.on_clicked(fx.saveFig) self.breset = Button(self.axreset, 'Reset') self.breset.on_clicked(fx.reset)
def update2(self): params = np.zeros((len(fx.axsliders))) for i in range(len(fx.axsliders)): params[i] = fx.fnsliders[i].val fx.fnsliders[i].valtext.set_text(text[i] % params[i]) cp.curveM2.set_ydata(M2(freqs, *params)) cp.curveM1.set_ydata(M1(freqs, *params[:3])) cp.curveLorentz.set_ydata(m2(freqs, *params[3:6]))
def timeSeries(self, event): global slid_mask if cp.plot_vers == 1: for slider in fx.axsliders: slider.remove() for axesObj in [self.axreload, self.axsaveFig, self.axreset]: axesObj.remove() if cp.plot_vers == 2: pass # maybe just: if cp.plot_vers != 2: else: if cp.plot_vers == 3: self.ax4.remove() self.cbar2.remove() self.axslider2.remove() #fx.visual() cp.plot_vers = 2 if 'ix' not in globals(): global ix, iy ix = spectra.shape[1]//2 iy = spectra.shape[0]//2 self.ax1.scatter(ix, iy, s=200, marker='x', c='white', linewidth=2.5) self.ax2setup() if haveImCube: # ax3: displays pixel timeseries self.ax3 = plt.subplot2grid((31,31),(22, 1), colspan=29, rowspan=8) self.ax3_title = self.ax3.set_title('Pixel (%ix , %iy): Timeseries' % (ix, iy), fontsize=fontSize) self.ax3.set_xlabel('Time', fontsize=fontSize, labelpad=5) self.ax3.set_ylabel('Intensity', fontsize=fontSize, labelpad=5) self.ax3.set_xlim(timestamps[0]-0.01*t_range, timestamps[-1]+0.01*t_range) self.ts, = self.ax3.plot(timestamps, emptyTimeseries, 'k') timeseries = np.array(imCube[iy+1][ix+1] / exposures) self.ts.set_ydata(timeseries) self.ax3.set_ylim(timeseries.min()*0.9, timeseries.max()*1.1) spec = np.array(spectra[iy][ix]) self.ax2_title.set_text('Pixel (%ix , %iy): Spectra' % (ix, iy)) self.curveSpec.set_ydata(spec) if haveParam: cp.curveM2.set_ydata(M2(freqs, *h_map[iy,ix,:6])) cp.curveM1.set_ydata(M1(freqs, *h_map[iy,ix,:3])) cp.curveLorentz.set_ydata(m2(freqs, *h_map[iy,ix,3:6]))
def update2(val): params = np.zeros((len(axsliders))) for i in range(len(axsliders)): params[i] = fnsliders[i].val fnsliders[i].valtext.set_text(text[i] % params[i]) """ if i == 0: params[i] = 10**fnsliders[i].val else: params[i] = fnsliders[i].val if i == 4: fnsliders[i].valtext.set_text(text[i] % (1./(np.exp(params[4])*60.))) else: fnsliders[i].valtext.set_text(text[i] % params[i]) """ s = M2(freqs, *params) #l.set_ydata(s) curveM2.set_ydata(s) curveM1.set_ydata(M1(freqs, *params[:3])) curveLorentz.set_ydata(m2(freqs, *params[3:6]))
def onclick(event): #global ix, iy ixx, iyy = event.xdata, event.ydata if event.inaxes == cp.ax1: global ix, iy del cp.ax1.collections[:] plt.draw() if cp.spec_hist == 'hist': cp.ax2setup() cp.spec_hist = 'spec' #print("location: (%fx, %fy)" % (ixx, iyy)) #print("location: (%ix, %iy)" % (ixx, iyy)) ix = int(round(ixx)) iy = int(round(iyy)) s = np.array(spectra[iy][ix]) if specVis_fit == True: # use 3x3 pixel-box std.dev. or adhoc method for fitting uncertainties if spec_unc == 'stddev': ds = np.array(stdDev[iy][ix]) elif spec_unc == 'adhoc': ds = ds0 specFit(s, ds) # update subplots cp.ax1.scatter(ix, iy, s=200, marker='x', c='white', linewidth=2.5) cp.ax2_title.set_text('Pixel (%ix , %iy): Spectra' % (ix, iy)) cp.curveSpec.set_ydata(s) # update spectra and timeseries if cp.plot_vers == 2: if haveImCube: timeseries = np.array(imCube[iy+1][ix+1] / exposures) cp.ts.set_ydata(timeseries) cp.ax3.set_ylim(timeseries.min()*0.9, timeseries.max()*1.1) cp.ax3_title.set_text('Pixel (%ix , %iy): Timeseries' % (ix, iy)) if haveParam: cp.curveM2.set_ydata(M2(freqs, *h_map[iy,ix,:6])) cp.curveM1.set_ydata(M1(freqs, *h_map[iy,ix,:3])) cp.curveLorentz.set_ydata(m2(freqs, *h_map[iy,ix,3:6])) # update spectra and model sliders if cp.plot_vers == 1: for slider in fx.axsliders: slider.remove() param = fx.paramSliders() plt.text(0.05, 11.5, "*Using parameters found in: '%s'" % param_dir) s = M2(freqs, *param) #l.set_ydata(s) cp.curveM2.set_ydata(s) cp.curveM1.set_ydata(M1(freqs, *param[:3])) cp.curveLorentz.set_ydata(m2(freqs, *param[3:6]))
def specFit(s, ds): ## fit data to combined power law plus gaussian component model try: m1_param = Fit(M1, freqs, s, p0=M1_guess, bounds=(M1_low, M1_high), sigma=ds, method='dogbox')[0] except RuntimeError: print("Error M1 - curve_fit failed") except ValueError: print("Error M1 - inf/NaN") A, n, C = m1_param # unpack model parameters try: m2_param0 = Fit(M2, freqs, s, p0=M2_guess, bounds=(M2_low, M2_high), sigma=ds, method='dogbox', max_nfev=3000)[0] except RuntimeError: print("Error M2 - curve_fit failed") except ValueError: print("Error M2 - inf/NaN") #A2, n2, C2, P2, fp2, fw2 = m2_param0 #print nlfit_gp try: m2_param = Fit(M2, freqs, s, p0=m2_param0, bounds=(M2_low, M2_high), sigma=ds, max_nfev=3000)[0] except RuntimeError: print("Error M2 - curve_fit failed") except ValueError: print("Error M2 - inf/NaN") A22, n22, C22, P22, fp22, fw22 = m2_param #print m2_param # create models from parameters m1_fit = M1(freqs, *m1_param) lorentz = m2(freqs, P22, fp22, fw22) m2_fit2 = M2(freqs, *m2_param) m1_fit2 = M1(freqs, A22, n22, C22) """ residsM1 = (s - m1_fit) chisqrM1 = ((residsM1/ds)**2).sum() residsM22 = (s - m2_fit2) chisqrM22 = ((residsM22/ds)**2).sum() redchisqrM22 = ((residsM22/ds)**2).sum()/float(freqs.size-6) f_test2 = ((chisqrM1-chisqrM22)/(6-3))/((chisqrM22)/(freqs.size-6)) dof1, dof2 = 3, 6 # degrees of freedom for model M1, M2 #p_val = ff.sf(f_test2, dof1, dof2) # extract the lorentzian amplitude scaling factor amp_scale2 = M1(np.exp(fp22), A22, n22, C22) """ fwhm = (1. / (np.exp(fp22+fw22) - np.exp(fp22-fw22))) / 60. pLoc = (1./np.exp(fp22))/60. #curveM1A.set_ydata(m1_fit) curveM2.set_ydata(m2_fit2) curveM1.set_ydata(m1_fit2) curveLorentz.set_ydata(lorentz) p_index.set_text(r'$n$ = {0:0.2f}'.format(n22)) p_amp.set_text(r'$\alpha$ = {0:0.2e}'.format(P22)) p_loc.set_text(r'$\beta$ = {0:0.1f} [min]'.format(pLoc)) p_wid.set_text(r'$FWHM$ = {0:0.1f} [min]'.format(fwhm))
def onclick(event): #global ix, iy global fnsliders global axsliders ixx, iyy = event.xdata, event.ydata if event.inaxes == ax1: global ix, iy del ax1.collections[:] plt.draw() #print("location: (%fx, %fy)" % (ixx, iyy)) #print("location: (%ix, %iy)" % (ixx, iyy)) ix = int(round(ixx)) iy = int(round(iyy)) #print(spectra) s = np.array(spectra[iy][ix]) if specVis_fit == True: # use 3x3 pixel-box std.dev. or adhoc method for fitting uncertainties if spec_unc == 'stddev': ds = np.array(stdDev[iy][ix]) elif spec_unc == 'adhoc': ds = ds0 specFit(s, ds) # update subplots ax1.scatter(ix, iy, s=200, marker='x', c='white', linewidth=2.5) title.set_text('Pixel (%ix , %iy): Spectra' % (ix, iy)) curveSpec.set_ydata(s) timeseries = np.array(imCube[iy + 1][ix + 1] / exposures) if toggle3 == 2: ts.set_ydata(timeseries) ax3.set_ylim(timeseries.min() * 0.9, timeseries.max() * 1.1) title3.set_text('Pixel (%ix , %iy): Timeseries' % (ix, iy)) if haveParam: curveM2.set_ydata(M2(freqs, *h_map[iy, ix, :6])) curveM1.set_ydata(M1(freqs, *h_map[iy, ix, :3])) curveLorentz.set_ydata(m2(freqs, *h_map[iy, ix, 3:6])) if toggle3 == 1: for slider in axsliders: slider.remove() axsliders = [] fnsliders = [] if haveParam: param = h_map[iy, ix, :6] else: param = (np.array(M2_low) + np.array(M2_high)) / 2 # make parameter sliders for i, M2_label in enumerate(M2_labels): axsliders.append(plt.axes([0.15, 0.23 - (0.04 * i), 0.6, 0.02])) fnsliders.append( Slider(axsliders[i], M2_label, M2_low[i], M2_high[i], param[i])) fnsliders[i].on_changed(update2) fnsliders[i].valtext.set_text(text[i] % param[i]) plt.text(0.05, 11.5, "*Using parameters found in: '%s'" % param_dir) s = M2(freqs, *param) #l.set_ydata(s) curveM2.set_ydata(s) curveM1.set_ydata(M1(freqs, *param[:3])) curveLorentz.set_ydata(m2(freqs, *param[3:6]))
def specFit(subcube, subcube_StdDev): params = np.zeros((subcube.shape[0], subcube.shape[1], 9)) start_sub = timer() T1 = 0 for l in range(subcube.shape[0]): for m in range(subcube.shape[1]): f = freqs s = subcube[l][m] # ---- use pixel-box std.dev. or adhoc method as fitting uncertainties if spec_unc == 'stddev': ds = subcube_StdDev[l][m] elif spec_unc in ['adhoc', 'constant']: ds = subcube_StdDev # ---- fit models to spectra using SciPy's Levenberg-Marquart method try: m1_param = Fit(M1, f, s, p0=M1_guess, bounds=(M1_low, M1_high), sigma=ds, method='dogbox')[0] except RuntimeError: pass except ValueError: pass # ---- first fit M2 model using 'dogbox' method try: m2_param0 = Fit(M2, f, s, p0=M2_guess, bounds=(M2_low, M2_high), sigma=ds, method='dogbox', max_nfev=3000)[0] except RuntimeError: pass except ValueError: pass # ---- next fit M2 model using default 'trf' method try: m2_param = Fit(M2, f, s, p0=m2_param0, bounds=(M2_low, M2_high), sigma=ds, max_nfev=3000)[0] except RuntimeError: pass except ValueError: pass # ---- create model functions from fitted parameters m1_fit = M1(f, *m1_param) m2_fit = M2(f, *m2_param) #weights = subcube_StdDev[l][m] residsM1 = (s - m1_fit) chisqrM1 = ((residsM1 / ds)**2).sum() redchisqrM1 = chisqrM1 / float(f.size - 3) residsM2 = (s - m2_fit) chisqrM2 = ((residsM2 / ds)**2).sum() redchisqrM2 = chisqrM2 / float(f.size - 6) f_test = ((chisqrM1 - chisqrM2) / (6 - 3)) / ((chisqrM2) / (f.size - 6)) # ---- extract the lorentzian-amplitude scaling factor amp_scale = m2_param[3] / M1(np.exp(m2_param[4]), *m2_param[:3]) if chisqrM1 > chisqrM2: # populate array with M2 parameters params[l][m][:6] = m2_param params[l][m][6] = f_test params[l][m][7] = amp_scale params[l][m][8] = redchisqrM2 else: # populate array with M1 parameters params[l][m][:3] = m1_param params[l][m][3:8] = np.NaN params[l][m][8] = redchisqrM1 # ---- estimate time remaining and print to screen T = timer() T2 = T - T1 if l == 0: T_init = T - start_sub T_est = T_init * (subcube.shape[0]) else: T_est = T2 * (subcube.shape[0] - l) T_min, T_sec = divmod(T_est, 60) T_hr, T_min = divmod(T_min, 60) if l == 0: start_time = (T_hr, T_min, T_sec) print("Thread %i on row %i/%i, ETR: %i:%.2i:%.2i" % (rank, l, subcube.shape[0], T_hr, T_min, T_sec), flush=True) T1 = T # ---- print estimated and total program time to screen print("Beginning est. time = %i:%.2i:%.2i" % start_time, flush=True) T_act = timer() - start_sub T_min, T_sec = divmod(T_act, 60) T_hr, T_min = divmod(T_min, 60) print("Actual total time = %i:%.2i:%.2i" % (T_hr, T_min, T_sec), flush=True) return params