def test_plot_phaseogram_direct(self): import matplotlib.pyplot as plt phaseogr, phases, times, additional_info = \ phaseogram(self.event_times, self.pulse_frequency) plot_phaseogram(phaseogr, phases, times) plt.savefig('phaseogram_direct.png') plt.close(plt.gcf())
def test_phaseogram_mjdref_pepoch(self): phaseogr, phases, times, additional_info = \ phaseogram(self.event_times, self.pulse_frequency, mjdref=57000, out_filename='phaseogram_mjdref.png', pepoch=57000) assert np.all(times >= 57000) assert np.all((phases >= 0) & (phases <= 2))
def test_plot_phaseogram_fromfunc(self): import matplotlib.pyplot as plt fig = plt.figure('Phaseogram from func') ax = plt.subplot() phaseogr, phases, times, additional_info = \ phaseogram(self.event_times, self.pulse_frequency, mjdref=57000, pepoch=57000, phaseogram_ax=ax, plot=True) plt.savefig('phaseogram_fromfunc.png') plt.close(fig)
def test_phaseogram_weights(self): phaseogr, phases, times, additional_info = \ phaseogram(self.times, self.pulse_frequency, weights=self.counts, nph=16) assert np.all(times < 25.6) assert np.any(times > 25) assert np.all((phases >= 0) & (phases <= 2)) import matplotlib.pyplot as plt fig = plt.figure('Phaseogram direct weights') plot_phaseogram(phaseogr, phases, times) plt.savefig('phaseogram_weights.png') plt.close(fig)
def normalized_phaseogram(norm, *args, **kwargs): phas, phases, times, additional_info = phaseogram(*args, **kwargs) if norm is None: pass elif norm == 'to1': minarr = np.min(phas, axis=0) maxarr = np.max(phas, axis=0) for i in range(phas.shape[0]): phas[i][:] -= minarr phas[i][:] /= (maxarr - minarr) elif norm == 'mediansub': medarr = np.median(phas, axis=0) for i in range(phas.shape[0]): phas -= medarr else: warnings.warn('Profile normalization ' '{} not known. Using default'.format(norm)) return phas, phases, times, additional_info
def recalculate(self, event): dfreq, dfdot, dfddot = self._read_sliders() pepoch = self.pepoch self.fddot = self.fddot - dfddot self.fdot = self.fdot - dfdot self.freq = self.freq - dfreq self.phaseogr, _, _, _ = \ phaseogram(self.ev_times, self.freq, fdot=self.fdot, plot=False, nph=self.nph, nt=self.nt, pepoch=pepoch, fddot=self.fddot) self.reset(1) self.fig.canvas.draw() print("------------------------") print("PEPOCH {} + MJDREF".format(self.pepoch / 86400)) print("F0 {}".format(self.freq)) print("F1 {}".format(self.fdot)) print("F2 {}".format(self.fddot)) print("------------------------")
def stingphase(evt_data, freq, figsize=(10, 10), nbins=32, save=False, pname='stingphase', mjd=False): ''' Plots Stingray phaseogram. Inputs: ------- evt_data freq figsize nbins: number of bins for histogram and phaseogram save: bool for whether or not to save plot as png pname: string of path and name of output png file to save TO DO: add option to put MJD referencce time ''' plt.figure(figsize=figsize) gs = GridSpec(2, 1, height_ratios=(1, 3)) ax0 = plt.subplot(gs[0]) ax1 = plt.subplot(gs[1], sharex=ax0) plt.subplots_adjust(wspace=0, hspace=0) phaseogr, phases, times, additional_info = \ phaseogram(evt_data['TIME'], freq, return_plot=True,nt=nbins,nph=nbins) mean_phases = (phases[:-1] + phases[1:]) / 2 plot_profile(mean_phases, np.sum(phaseogr, axis=1), ax=ax0) _ = plot_phaseogram(phaseogr, phases, times, ax=ax1, vmin=np.median(phaseogr)) if save: plt.savefig(pname + '.png', dpi=200, bbox_inches='tight')
def recalculate(self, event): self.orbital_period, self.asini, self.t0 = self._read_sliders() corrected_times = self.ev_times - self._delay_fun(self.ev_times) self.phaseogr, _, _, _ = \ phaseogram(corrected_times, self.freq, fdot=self.fdot, plot=False, nph=self.nph, nt=self.nt, pepoch=self.pepoch, fddot=self.fddot) self._set_lines(False) self.pcolor.set_array(self.phaseogr.T.ravel()) self.sasini.valinit = self.asini self.speriod.valinit = self.orbital_period self.st0.valinit = self.t0 self.st0.valmin = self.t0 - self.orbital_period self.st0.valmax = self.t0 + self.orbital_period self.fig.canvas.draw() print("------------------------") print("PB (s) {} ({} d)".format(self.orbital_period, self.orbital_period / 86400)) print("A1 (l-s) {}".format(self.asini)) print("T0 (MET) {}".format(self.t0)) print("------------------------")
def test_phaseogram(self): phaseogr, phases, times, additional_info = \ phaseogram(self.event_times, self.pulse_frequency) assert np.all(times < 25.6) assert np.any(times > 25) assert np.all((phases >= 0) & (phases <= 2))
def test_phaseogram_bad_weights(self): with pytest.raises(ValueError) as excinfo: phaseogr, phases, times, additional_info = \ phaseogram(self.event_times, self.pulse_frequency, weights=[0, 2]) assert 'must match' in str(excinfo)
def __init__(self, ev_times, freq, nph=128, nt=128, test=False, pepoch=None, fdot=0, fddot=0, **kwargs): self.fdot = fdot self.fddot = fddot self.nt = nt self.nph = nph self.pepoch = assign_value_if_none(pepoch, ev_times[0]) self.ev_times = ev_times self.freq = freq self.fig, ax = plt.subplots() plt.subplots_adjust(left=0.25, bottom=0.30) corrected_times = self.ev_times - self._delay_fun(self.ev_times) self.phaseogr, phases, times, additional_info = \ phaseogram(corrected_times, freq, return_plot=True, nph=nph, nt=nt, fdot=fdot, fddot=fddot, plot=False, pepoch=pepoch) self.phases, self.times = phases, times self.pcolor = plt.pcolormesh(phases, times, self.phaseogr.T, cmap='magma') plt.xlabel('Phase') plt.ylabel('Time') plt.colorbar() self.lines = [] self.line_phases = np.arange(-2, 3, 0.5) for ph0 in self.line_phases: newline, = plt.plot(np.zeros_like(times) + ph0, times, zorder=10, lw=2, color='w') self.lines.append(newline) plt.xlim([0, 2]) axcolor = '#ff8888' self.slider_axes = [] self.slider_axes.append( plt.axes([0.25, 0.1, 0.5, 0.03], facecolor=axcolor)) self.slider_axes.append( plt.axes([0.25, 0.15, 0.5, 0.03], facecolor=axcolor)) self.slider_axes.append( plt.axes([0.25, 0.2, 0.5, 0.03], facecolor=axcolor)) self._construct_widgets(**kwargs) self.closeax = plt.axes([0.15, 0.020, 0.15, 0.04]) self.button_close = Button(self.closeax, 'Quit', color=axcolor, hovercolor='0.8') self.recalcax = plt.axes([0.3, 0.020, 0.15, 0.04]) self.button_recalc = Button(self.recalcax, 'Recalculate', color=axcolor, hovercolor='0.975') self.resetax = plt.axes([0.45, 0.020, 0.15, 0.04]) self.button_reset = Button(self.resetax, 'Reset', color=axcolor, hovercolor='0.975') self.zoominax = plt.axes([0.6, 0.020, 0.15, 0.04]) self.button_zoomin = Button(self.zoominax, 'Zoom in', color=axcolor, hovercolor='0.975') self.zoomoutax = plt.axes([0.75, 0.020, 0.15, 0.04]) self.button_zoomout = Button(self.zoomoutax, 'Zoom out', color=axcolor, hovercolor='0.975') self.button_reset.on_clicked(self.reset) self.button_zoomin.on_clicked(self.zoom_in) self.button_zoomout.on_clicked(self.zoom_out) self.button_recalc.on_clicked(self.recalculate) self.button_close.on_clicked(self.quit) if not test: plt.show()