Source code for time_domain_astronomy_sandbox.pulse

"""Pulse class."""
import numpy as np
from .backend import Backend
from ipywidgets import interact
import ipywidgets as widgets
from matplotlib import pyplot as plt
from matplotlib import rc

rc('font', size=16)
rc('axes', titlesize=18)
rc('axes', labelsize=18)

[docs]class Pulse(): def __init__(self, backend : Backend = Backend(), width : int = 10, ): """Initialise Pulse class. Parameters ---------- backend : Backend Backend class width : int Pulse width in second (default: 10) """ self.backend = backend self.width = width # Frequency delay self.dt = lambda dm, f_i: (4.148808 * 1000 * (f_i**-2 - self.backend.fmax**-2)) * dm
[docs] def delays(self, dm): """Create array of delays for each backend frequency channel. Parameters ---------- dm:int Value for dispersion measure of the pulse Returns ------- delays:Numpy.array Array of delays (in second) """ return np.array([self.dt(dm, f) for f in self.backend.frequencies])
[docs] def plot_delay_v_frequency(self, dm, xscale='linear', savefig=False, ext='png'): """Plot pulse's delay vs frequency. Parameters ---------- dm : int Value for dispersion measure of the pulse xscale : str matplotlib's xscale option (default: 'linear') savefig : bool save figure to disk (default: False) ext : 'str' figure's file extention (default: png) """ ncols=1 nrows=1 fig, ax = plt.subplots(figsize=(10, 5), ncols=ncols, nrows=nrows) ax.plot(self.delays(dm), self.backend.frequencies) ax.set_xlabel('Delay (s)') ax.set_ylabel('Frequency (MHz)') if xscale: ax.set_xscale(xscale) if savefig: fig.savefig('%d.%s' % (dm, ext) )
[docs] def plot_signal_dispersed_dedispersed(self, dm, step=200, xscale='linear', savefig=False, ext='png', dpi=150): """Plot pulse's delay vs frequency. Parameters ---------- dm : int Value for dispersion measure of the pulse xscale : str matplotlib's xscale option (default: 'linear') savefig : bool save figure to disk (default: False) ext : 'str' figure's file extention (default: png) """ ncols=1 nrows=1 fig, ax = plt.subplots(figsize=(10, 6), ncols=ncols, nrows=nrows) ax.plot(self.delays(dm), self.backend.frequencies, label='Dispersed signal in the zero-DM plane') ax.plot(self.delays(0), self.backend.frequencies, label=r'De-dispersed signal (DM=%d pc/cm$^3$)' % dm) min_dist = 99999999 for x1, x2 in zip( self.delays(dm=dm)[::step], self.delays(0)[::step] ): if min_dist > np.abs(x1-x2): min_dist = np.abs(x1-x2) if dm > 0: for y, x1, x2 in zip( self.backend.frequencies[::step], self.delays(dm=dm)[::step], self.delays(0)[::step] ): head_length = (min_dist/2)-0.01 if ext == 'pdf' else min_dist/2 ax.arrow( x1, y, -x1+head_length, 0, head_width=7, head_length=head_length, fc='k', ec='k' ) ax.set_xlabel('Arrival time (s)') ax.set_ylabel('Frequency (MHz)') ax.legend() if xscale: ax.set_xscale(xscale) if savefig: plt.tight_layout() plt.savefig('dispersed_dedispersed_dm_%d.%s' % (dm, ext), dpi=dpi)
[docs] def plot_delay_v_frequency_interactive(self, xscale='linear', dm_min=0, dm_max=5000, dm_step=5, dm_init=0, savefig=False, ext='png'): """Plot pulse's delay vs frequency interactively with ipywidgets. Parameters ---------- xscale : str matplotlib's xscale option dm_min : int minimum dm for interactive widget (default: 0) dm_max : int maximum dm for interactive widget (default: 5000) dm_step : int increment step dm for interactive widget (default: 0) dm_init : int initial dm for interactive widget (default: 5000) savefig : bool save figure to disk (default: False) ext : 'str' figure's file extention """ interact( self.plot_delay_v_frequency, dm=widgets.IntSlider(min=dm_min, max=dm_max, step=dm_step, value=dm_init), xscale=xscale, savefig=savefig, ext=ext )