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
datawhose 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 usingdispersion_delay(). De-dedispersed array is filled withNaNin 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 ofdata.time_step (
Quantity) – Time step between two spectra.dispersion_measure (
Quantity) – Dispersion Measure (in pc/cm3).
- Returns:
De-dispersed data.
- Return type:
- Raises:
Exception – Raised if the data dimension is less than 2.
ValueError – Raised if the
frequenciesarray does not match dimension 1 ofdata.
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)
See also