nenupy.io.tf_utils.de_disperse_array

nenupy.io.tf_utils.de_disperse_array(data, frequencies, time_step, dispersion_measure)[source]

De-disperse in time an array data whose first two dimensions are time and frequency respectively. The array must be regularly sampled in time. The de-dispersion is made relatively to the highest frequency using dispersion_delay(). De-dedispersed array is filled with NaN in time-frequency places where the shifted values were.

Parameters:
  • data (ndarray) – Data array to de-disperse, its shape must be (time, frequency, (polarizations)).

  • frequencies (Quantity) – 1D array of frequencies corresponding to the second dimension of data.

  • time_step (Quantity) – Time step between two spectra.

  • dispersion_measure (Quantity) – Dispersion Measure (in pc/cm3).

Returns:

De-dispersed data.

Return type:

ndarray

Raises:
  • Exception – Raised if the data dimension is less than 2.

  • ValueError – Raised if the frequencies array does not match dimension 1 of data.

Examples

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import astropy.units as u
>>> from astropy.time import Time, TimeDelta

>>> from nenupy.astro import dispersion_delay
>>> from nenupy.io.tf_utils import de_disperse_array

>>> n_times = 100
>>> n_freqs = 75
>>> n_pols = 1
>>> data_shape = (n_times, n_freqs, n_pols)

>>> # Build fake dispersed data
>>> dm = 5 * u.pc / (u.cm**3)
>>> dt = TimeDelta(1, format="sec")
>>> frequencies = np.linspace(20, 80, n_freqs) * u.MHz
>>> times = Time("2024-01-01 00:00:00") + np.arange(n_times) * dt
>>> delay = dispersion_delay(frequency=frequencies, dispersion_measure=dm)
>>> time_delay_idx = np.argmin(np.abs((times - times[0]).sec[:, None] - delay.to_value(u.s)[None, :]), axis=0)
>>> dispersed_data = np.ones((data_shape))
>>> dispersed_data[time_delay_idx + 5, np.arange(n_freqs)] += 10
>>> dispersed_data[time_delay_idx + 20, np.arange(n_freqs)] += 10

>>> # Correct the dispersion
>>> de_dispersed_data = de_disperse_array(
        data=dispersed_data,
        frequencies=frequencies,
        time_step=dt,
        dispersion_measure=dm
    )

>>> # Plot the comparison
>>> fig = plt.figure(figsize=(10, 4))
>>> axes = fig.subplots(nrows=1, ncols=2)
>>> im_0 = axes[0].pcolormesh(times.datetime, frequencies.to_value(u.MHz), dispersed_data[:, :, 0].T)
>>> im_1 = axes[1].pcolormesh(times.datetime, frequencies.to_value(u.MHz), de_dispersed_data[:, :, 0].T)
>>> axes[0].set_ylabel("Frequency (MHz)")
>>> axes[0].set_xlabel("Time")
>>> axes[0].tick_params(axis="x", labelrotation=45)
>>> axes[1].set_xlabel("Time")
>>> axes[1].tick_params(axis="x", labelrotation=45)
../_images/dedispersion.png