def geometric_delay(baselines, skypos, altaz=False, dircos=False, hadec=True,
                    units='mks', latitude=None):
    """
    ---------------------------------------------------------------------
    Estimates the geometric delays matrix for different baselines from 
    different sky positions. 

    Inputs:

    baselines: x, y, and z components of baseline vectors in a Mx3 numpy 
               array

    skypos: Nx2 (Alt-Az or HA-Dec) or Nx3 (direction cosines) numpy array
            of sky positions

    altaz: [Boolean flag, default=False] If True, skypos is in Alt-Az 
           coordinates system

    hadec: [Boolean flag, default=True] If True, skypos is in HA-Dec 
           coordinates system

    dircos: [Boolean flag, default=False] If True, skypos is in direction 
           cosines coordinates system

    units: Units of baselines. Default='mks'. Alternative is 'cgs'.

    latitude: Latitude of the observatory. Required if hadec is True.

    Outputs:

    geometric delays [NxM numpy array] Geometric delay for every combination
                     of baselines and skypos.

    ---------------------------------------------------------------------
    """

    try:
        baselines, skypos
    except NameError:
        raise NameError('baselines and/or skypos not defined in geometric_delay().')

    if (altaz)+(dircos)+(hadec) != 1:
        raise ValueError('One and only one of altaz, dircos, hadec must be set to True.')

    if hadec and (latitude is None):
        raise ValueError('Latitude must be specified when skypos is in HA-Dec format.')

    try:
        units
    except NameError:
        print 'No units provided. Assuming MKS units.'
        units = 'mks'

    if (units != 'mks') and (units != 'cgs'):
        print 'Units should be specified to be one of MKS or CGS. Default=MKS'
        print 'Proceeding with MKS units.'
        units = 'mks'

    if not isinstance(baselines, NP.ndarray):
        raise TypeError('baselines should be a Nx3 numpy array in geometric_delay().')

    if len(baselines.shape) == 1:
        baselines = baselines.reshape(1,-1)

    if baselines.shape[1] == 1:
        baselines = NP.hstack(baselines, NP.zeros((baselines.size,2)))
    elif baselines.shape[1] == 2:
        baselines = NP.hstack(baselines, NP.zeros((baselines.size,1)))
    elif baselines.shape[1] > 3:
        baselines = baselines[:,:3]

    if altaz or hadec:
        if len(skypos.shape) < 2:
            if skypos.size != 2:
                raise ValueError('Sky position in altitude-azimuth or HA-Dec should consist of 2 elements.')
            else:
                skypos = skypos.reshape(1,-1)
        elif len(skypos.shape) > 2:
            raise ValueError('Sky positions should be a Nx2 numpy array if using altitude-azimuth of HA-Dec.')
        else:
            if skypos.shape[1] != 2:
                raise ValueError('Sky positions should be a Nx2 numpy array if using altitude-azimuth of HA-Dec.')

        if altaz:
            dc = GEOM.altaz2dircos(skypos, 'degrees')
        else:
            dc = GEOM.altaz2dircos(GEOM.hadec2altaz(skypos, latitude, 'degrees'), 'degrees')
    else:
        if len(skypos.shape) < 2:
            if skypos.size != 3:
                raise ValueError('Sky position in direction cosines should consist of 3 elements.')
            else:
                skypos = skypos.reshape(1,-1)
        elif len(skypos.shape) > 2:
            raise ValueError('Sky positions should be a Nx3 numpy array if using direction cosines.')
        else:
            if skypos.shape[1] != 3:
                raise ValueError('Sky positions should be a Nx3 numpy array if using direction cosines.')
        
        dc = skypos

    # geometric_delays = delay_envelope(baselines, dc, units)[:,:,-1]
    geometric_delays = NP.dot(dc, baselines.T)/c
    return geometric_delays
Exemplo n.º 2
0
    # pfb_interp_func = interpolate.interp1d(pfbfreq[useful_freq_range]/1e3, pfbwin[useful_freq_range])
    # pfbwin_interp = pfb_interp_func(chans)
    pfbwin_interp = NP.interp(chans, pfbfreq[useful_freq_range]/1e3, pfbwin[useful_freq_range])
    bandpass_shape = 10**(pfbwin_interp/10)

window = n_channels * DSP.windowing(n_channels, shape=bpass_shape, pad_width=n_pad, centering=True, area_normalize=True) 
bpass = base_bpass * bandpass_shape
n_snaps = int(t_obs/t_snap)
lst = (lst_init + (t_snap/3.6e3) * NP.arange(n_snaps)) * 15.0 # in degrees
if obs_mode == 'track':
    pointings_radec = NP.repeat(NP.asarray(pointing_init).reshape(-1,2), n_snaps, axis=0)
else:
    pointings_radec = NP.hstack((NP.asarray(lst-pointing_init[0]).reshape(-1,1), pointing_init[1]+NP.zeros(n_snaps).reshape(-1,1)))

pointings_hadec = NP.hstack(((lst-pointings_radec[:,0]).reshape(-1,1), pointings_radec[:,1].reshape(-1,1)))
pointings_altaz = GEOM.hadec2altaz(pointings_hadec, latitude, units='degrees')
pointings_dircos = GEOM.altaz2dircos(pointings_altaz, units='degrees')

## Interferometer parameters

# baseline_orientation = NP.asarray([0.0, 90.0]) # in degrees from East towards North
# baseline_length = 1000.0 + NP.zeros(2) # in m
# baseline_vect = NP.zeros((2,3))
# baseline_vect[:,0] = baseline_length * NP.cos(NP.radians(baseline_orientation))
# baseline_vect[:,1] = baseline_length * NP.sin(NP.radians(baseline_orientation))

# baseline_orientation_str = '{0:.1f}'.format(baseline_orientation)
# baseline_length_str = '{0:.1f}'.format(baseline_length)

# ia = RI.InterferometerArray(labels, bl, chans, telescope=telescope, latitude=latitude, A_eff=A_eff, freq_scale='GHz')
# # ia = RI.InterferometerArray(['B1','B2'], baseline_vect, chans, telescope=telescope, latitude=latitude, A_eff=A_eff, freq_scale='GHz')
Exemplo n.º 3
0
bandpass_shape[flagged_channels] = 0.0

n_snaps = int(1.0 * t_obs / t_snap)
lst = (lst_init + (t_snap / 3.6e3) * NP.arange(n_snaps)) * 15.0  # in degrees
if obs_mode == 'track':
    pointings_radec = NP.repeat(NP.asarray(pointing_init).reshape(-1, 2),
                                n_snaps,
                                axis=0)
else:
    pointings_radec = NP.hstack(
        (NP.asarray(lst - pointing_init[0]).reshape(-1, 1),
         pointing_init[1] + NP.zeros(n_snaps).reshape(-1, 1)))

pointings_hadec = NP.hstack(((lst - pointings_radec[:, 0]).reshape(-1, 1),
                             pointings_radec[:, 1].reshape(-1, 1)))
pointings_altaz = GEOM.hadec2altaz(pointings_hadec, latitude, units='degrees')
pointings_dircos = GEOM.altaz2dircos(pointings_altaz, units='degrees')

use_GSM = args['ASM']
use_DSM = args['DSM']
use_NVSS = args['NVSS']
use_SUMSS = args['SUMSS']
use_MSS = args['MSS']
use_GLEAM = args['GLEAM']
use_PS = args['PS']

fg_str = ''
nside = args['nside']
flux_unit = args['flux_unit']

if use_GSM:
Exemplo n.º 4
0
hdulist = fits.open(infile+'.fits')
latitude = hdulist[0].header['latitude']
pointing_coords = hdulist[0].header['pointing_coords']
pointings_table = hdulist['POINTING AND PHASE CENTER INFO'].data
lst = pointings_table['LST']
n_snaps = lst.size
hdulist.close()

if pointing_coords == 'altaz':
    pointings_altaz = NP.hstack((pointings_table['pointing_latitude'].reshape(-1,1), pointings_table['pointing_longitude'].reshape(-1,1)))
    pointings_hadec = GEOM.altaz2hadec(pointings_altaz, latitude, units='degrees')
    pointings_dircos = GEOM.altaz2dircos(pointings_altaz, units='degrees')
elif pointing_coords == 'radec':
    pointings_radec = NP.hstack((pointings_table['pointing_longitude'].reshape(-1,1), pointings_table['pointing_latitude'].reshape(-1,1)))
    pointings_hadec = NP.hstack(((lst-pointings_radec[:,0]).reshape(-1,1), pointings_radec[:,1].reshape(-1,1)))
    pointings_altaz = GEOM.hadec2altaz(pointings_hadec, latitude, units='degrees')
    pointings_dircos = GEOM.altaz2dircos(pointings_altaz, units='degrees')
elif pointing_coords == 'hadec':
    pointings_hadec = NP.hstack((pointings_table['pointing_longitude'].reshape(-1,1), pointings_table['pointing_latitude'].reshape(-1,1)))
    pointings_radec = NP.hstack(((lst-pointings_hadec[:,0]).reshape(-1,1), pointings_hadec[:,1].reshape(-1,1)))
    pointings_altaz = GEOM.hadec2altaz(pointings_hadec, latitude, units='degrees')
    pointings_dircos = GEOM.altaz2dircos(pointings_altaz, units='degrees')

hdulist = fits.open(asm_CLEAN_infile+'.fits')
clean_lags = hdulist['SPECTRAL INFO'].data['lag']
clean_lags_orig = NP.copy(clean_lags)
asm_cc_skyvis = hdulist['CLEAN NOISELESS VISIBILITIES REAL'].data + 1j * hdulist['CLEAN NOISELESS VISIBILITIES IMAG'].data
asm_cc_skyvis_res = hdulist['CLEAN NOISELESS VISIBILITIES RESIDUALS REAL'].data + 1j * hdulist['CLEAN NOISELESS VISIBILITIES RESIDUALS IMAG'].data
asm_cc_vis = hdulist['CLEAN NOISY VISIBILITIES REAL'].data + 1j * hdulist['CLEAN NOISY VISIBILITIES IMAG'].data
asm_cc_vis_res = hdulist['CLEAN NOISY VISIBILITIES RESIDUALS REAL'].data + 1j * hdulist['CLEAN NOISY VISIBILITIES RESIDUALS IMAG'].data
hdulist.close()
        obs_mode = 'track'

    if obs_mode == 'track':
        pointings_radec = NP.repeat(NP.asarray(pointing_init).reshape(-1, 2),
                                    n_snaps,
                                    axis=0)
    else:
        ha_init = lst_init * 15.0 - pointing_init[0]
        pointings_radec = NP.hstack(
            (NP.asarray(lst - ha_init).reshape(-1, 1),
             pointing_init[1] + NP.zeros(n_snaps).reshape(-1, 1)))

    pointings_hadec = NP.hstack(((lst - pointings_radec[:, 0]).reshape(-1, 1),
                                 pointings_radec[:, 1].reshape(-1, 1)))
    pointings_altaz = GEOM.hadec2altaz(pointings_hadec,
                                       latitude,
                                       units='degrees')
    pointings_dircos = GEOM.altaz2dircos(pointings_altaz, units='degrees')

    pointings_radec_orig = NP.copy(pointings_radec)
    pointings_hadec_orig = NP.copy(pointings_hadec)
    pointings_altaz_orig = NP.copy(pointings_altaz)
    pointings_dircos_orig = NP.copy(pointings_dircos)

    lst_wrapped = lst + 0.0
    lst_wrapped[lst_wrapped > 180.0] = lst_wrapped[lst_wrapped > 180.0] - 360.0
    if lst_wrapped.size > 1:
        lst_edges = NP.concatenate(
            (lst_wrapped,
             [lst_wrapped[-1] + lst_wrapped[-1] - lst_wrapped[-2]]))
    else:
ant_locs = NP.loadtxt(antenna_file, skiprows=6, comments='#', usecols=(1,2,3))
bl = RI.baseline_generator(ant_locs, auto=False, conjugate=False)
bl_lengths = NP.sqrt(NP.sum(bl**2,axis=1))

decl = -27.0 # in degrees
lat = -27.0 # in degrees
ha_range = 4.0 # in hrs
ha_step = 1.0/60. # in hrs
ha = 15.0*NP.arange(-ha_range/2, ha_range/2, ha_step)
ha = NP.asarray(ha).reshape(-1,1)
dec = decl + NP.zeros((len(ha),1))
dec.reshape(-1,1)

hadec = NP.hstack((ha, dec))

altaz = GEOM.hadec2altaz(hadec, lat, units='degrees')

dircos = GEOM.altaz2dircos(altaz, units='degrees')

dm = DLY.delay_envelope(bl, dircos, units='mks')

min_delays = dm[:,:,1]-dm[:,:,0]
max_delays = NP.sum(dm,axis=2)

fig = PLT.figure(figsize=(14,8))
ax = PLT.axes([0.12,0.1,0.8,0.8])
PLT.xlim(NP.min(bl_lengths)-1.0,NP.max(bl_lengths)+100.0)
PLT.ylim(1e9*(NP.min(min_delays)-1.e-8),1e9*(NP.max(max_delays)+1.e-8))
PLT.xlabel('Baseline Length [m]', fontsize=18, weight='semibold')
PLT.ylabel('Delay [ns]', fontsize=18, weight='semibold')
PLT.title('Delay Envelope', fontsize=18, weight='semibold')
Exemplo n.º 7
0
    def observe(
        self, timestamp, Tsys, bandpass, pointing_center, skymodel, tobs, pb_min=0.1, fov_radius=None, lst=None
    ):

        if bandpass.size != self.bp.shape[1]:
            raise ValueError("bandpass length does not match.")

        self.Tsys = self.Tsys + [Tsys]
        self.vis_rms_freq = self.vis_rms_freq + [
            2.0 * FCNST.k * Tsys / self.A_eff / self.eff_Q / NP.sqrt(2) / tobs / self.freq_resolution / CNST.Jy
        ]
        self.tobs = self.tobs + [tobs]
        self.lst = self.lst + [lst]

        if self.timestamp == []:
            self.bp = NP.asarray(bandpass).reshape(1, -1)
            self.pointing_center = NP.asarray(pointing_center).reshape(1, -1)
        else:
            self.bp = NP.vstack((self.bp, NP.asarray(bandpass).reshape(1, -1)))
            self.pointing_center = NP.vstack((self.pointing_center, NP.asarray(pointing_center).reshape(1, -1)))

        pointing_lon = self.pointing_center[-1, 0]
        pointing_lat = self.pointing_center[-1, 1]

        if self.skycoords == "radec":
            if self.pointing_coords == "hadec":
                if lst is not None:
                    pointing_lon = lst - self.pointing_center[-1, 0]
                    pointing_lat = self.pointing_center[-1, 1]
                else:
                    raise ValueError(
                        "LST must be provided. Sky coordinates are in RA-Dec format while pointing center is in HA-Dec format."
                    )
            elif self.pointing_coords == "altaz":
                pointing_lonlat = lst - GEOM.altaz2hadec(self.pointing_center[-1, :], self.latitude, units="degrees")
                pointing_lon = pointing_lonlat[0]
                pointing_lat = pointing_lonlat[1]
        elif self.skycoords == "hadec":
            if self.pointing_coords == "radec":
                if lst is not None:
                    pointing_lon = lst - self.pointing_center[-1, 0]
                    pointing_lat = self.pointing_center[-1, 1]
                else:
                    raise ValueError(
                        "LST must be provided. Sky coordinates are in RA-Dec format while pointing center is in HA-Dec format."
                    )
            elif self.pointing_coords == "altaz":
                pointing_lonlat = lst - GEOM.altaz2hadec(self.pointing_center[-1, :], self.latitude, units="degrees")
                pointing_lon = pointing_lonlat[0]
                pointing_lat = pointing_lonlat[1]
        else:
            if self.pointing_coords == "radec":
                if lst is not None:
                    pointing_lonlat = GEOM.hadec2altaz(
                        NP.asarray([lst - self.pointing_center[-1, 0], self.pointing_center[-1, 1]]),
                        self.latitude,
                        units="degrees",
                    )
                    pointing_lon = pointing_lonlat[0]
                    pointing_lat = pointing_lonlat[1]
                else:
                    raise ValueError(
                        "LST must be provided. Sky coordinates are in Alt-Az format while pointing center is in RA-Dec format."
                    )
            elif self.pointing_coords == "hadec":
                pointing_lonlat = GEOM.hadec2altaz(self.pointing_center, self.latitude, units="degrees")
                pointing_lon = pointing_lonlat[0]
                pointing_lat = pointing_lonlat[1]

        pointing_phase = 0.0

        baseline_in_local_frame = self.baseline
        if self.baseline_coords == "equatorial":
            baseline_in_local_frame = GEOM.xyz2enu(self.baseline, self.latitude, "degrees")

        ptmp = self.pointing_center[-1, :]  # Convert pointing center to Alt-Az coordinates
        if self.pointing_coords == "hadec":
            ptmp = GEOM.hadec2altaz(self.pointing_center[-1, :], self.latitude, units="degrees")
        elif self.pointing_coords == "radec":
            if lst is not None:
                ptmp = GEOM.hadec2altaz(
                    NP.asarray([lst - self.pointing_center[-1, 0], self.pointing_center[-1, 1]]),
                    self.latitude,
                    units="degrees",
                )
            else:
                raise ValueError(
                    "LST must be provided. Sky coordinates are in Alt-Az format while pointing center is in RA-Dec format."
                )

        ptmp = GEOM.altaz2dircos(ptmp, "degrees")  # Convert pointing center to direction cosine coordinates

        pointing_phase = (
            2.0
            * NP.pi
            * NP.dot(baseline_in_local_frame.reshape(1, -1), ptmp.reshape(-1, 1))
            * self.channels.reshape(1, -1)
            / FCNST.c
        )

        if fov_radius is None:
            fov_radius = 90.0

        # PDB.set_trace()
        m1, m2, d12 = GEOM.spherematch(
            pointing_lon,
            pointing_lat,
            skymodel.catalog.location[:, 0],
            skymodel.catalog.location[:, 1],
            fov_radius,
            maxmatches=0,
        )

        # if fov_radius is not None:
        #     m1, m2, d12 = GEOM.spherematch(pointing_lon, pointing_lat, skymodel.catalog.location[:,0], skymodel.catalog.location[:,1], fov_radius, maxmatches=0)
        # else:
        #     m1 = [0] * skymodel.catalog.location.shape[0]
        #     m2 = xrange(skymodel.catalog.location.shape[0])
        #     d12 = GEOM.sphdist(NP.empty(skymodel.catalog.shape[0]).fill(pointing_lon), NP.empty(skymodel.catalog.shape[0]).fill(pointing_lat), skymodel.catalog.location[:,0], skymodel.catalog.location[:,1])

        if len(d12) != 0:
            pb = NP.empty((len(d12), len(self.channels)))
            fluxes = NP.empty((len(d12), len(self.channels)))

            coords_str = self.skycoords
            if self.skycoords == "radec":
                coords_str = "altaz"
                source_positions = GEOM.hadec2altaz(
                    NP.hstack(
                        (
                            NP.asarray(lst - skymodel.catalog.location[m2, 0]).reshape(-1, 1),
                            skymodel.catalog.location[m2, 1].reshape(-1, 1),
                        )
                    ),
                    self.latitude,
                    "degrees",
                )

            for i in xrange(len(self.channels)):
                # pb[:,i] = PB.primary_beam_generator(d12, self.channels[i]/1.0e9, 'degrees', self.telescope)
                pb[:, i] = PB.primary_beam_generator(
                    source_positions, self.channels[i] / 1.0e9, "altaz", self.telescope
                )
                fluxes[:, i] = (
                    skymodel.catalog.flux_density[m2]
                    * (self.channels[i] / skymodel.catalog.frequency) ** skymodel.catalog.spectral_index[m2]
                )

            geometric_delays = DLY.geometric_delay(
                baseline_in_local_frame,
                source_positions,
                altaz=(coords_str == "altaz"),
                hadec=(coords_str == "hadec"),
                latitude=self.latitude,
            )
            self.geometric_delays = self.geometric_delays + [geometric_delays.reshape(len(source_positions))]

            phase_matrix = 2.0 * NP.pi * NP.repeat(
                geometric_delays.reshape(-1, 1), len(self.channels), axis=1
            ) * NP.repeat(self.channels.reshape(1, -1), len(d12), axis=0) - NP.repeat(pointing_phase, len(d12), axis=0)

            skyvis = NP.sum(
                pb
                * fluxes
                * NP.repeat(NP.asarray(bandpass).reshape(1, -1), len(d12), axis=0)
                * NP.exp(-1j * phase_matrix),
                axis=0,
            )
            if fov_radius is not None:
                self.obs_catalog_indices = self.obs_catalog_indices + [m2]
                # self.obs_catalog = self.obs_catalog + [skymodel.catalog.subset(m2)]
        else:
            print "No sources found in the catalog within matching radius. Simply populating the observed visibilities with noise."
            skyvis = NP.zeros((1, len(self.channels)))

        if self.timestamp == []:
            self.skyvis_freq = skyvis.reshape(1, -1)
            self.vis_noise_freq = self.vis_rms_freq[-1] * (
                NP.random.randn(len(self.channels)).reshape(1, -1)
                + 1j * NP.random.randn(len(self.channels)).reshape(1, -1)
            )
            self.vis_freq = self.skyvis_freq + self.vis_noise_freq
        else:
            self.skyvis_freq = NP.vstack((self.skyvis_freq, skyvis.reshape(1, -1)))
            self.vis_noise_freq = NP.vstack(
                (
                    self.vis_noise_freq,
                    self.vis_rms_freq[-1]
                    * (
                        NP.random.randn(len(self.channels)).reshape(1, -1)
                        + 1j * NP.random.randn(len(self.channels)).reshape(1, -1)
                    ),
                )
            )
            self.vis_freq = NP.vstack(
                (self.vis_freq, (self.skyvis_freq[-1, :] + self.vis_noise_freq[-1, :]).reshape(1, -1))
            )

        self.timestamp = self.timestamp + [timestamp]
        n_snaps = int(t_obs/t_snap)
    else:
        t_obs = n_snaps * t_snap
    t_snap = t_snap + NP.zeros(n_snaps)
    lst = (lst_init + (t_snap/3.6e3) * NP.arange(n_snaps)) * 15.0 # in degrees
    if obs_mode is None:
        obs_mode = 'track'

    if obs_mode == 'track':
        pointings_radec = NP.repeat(NP.asarray(pointing_init).reshape(-1,2), n_snaps, axis=0)
    else:
        ha_init = lst_init * 15.0 - pointing_init[0]
        pointings_radec = NP.hstack((NP.asarray(lst-ha_init).reshape(-1,1), pointing_init[1]+NP.zeros(n_snaps).reshape(-1,1)))

    pointings_hadec = NP.hstack(((lst-pointings_radec[:,0]).reshape(-1,1), pointings_radec[:,1].reshape(-1,1)))
    pointings_altaz = GEOM.hadec2altaz(pointings_hadec, latitude, units='degrees')
    pointings_dircos = GEOM.altaz2dircos(pointings_altaz, units='degrees')

    pointings_radec_orig = NP.copy(pointings_radec)
    pointings_hadec_orig = NP.copy(pointings_hadec)
    pointings_altaz_orig = NP.copy(pointings_altaz)
    pointings_dircos_orig = NP.copy(pointings_dircos)

    lst_wrapped = lst + 0.0
    lst_wrapped[lst_wrapped > 180.0] = lst_wrapped[lst_wrapped > 180.0] - 360.0
    if lst_wrapped.size > 1:
        lst_edges = NP.concatenate((lst_wrapped, [lst_wrapped[-1]+lst_wrapped[-1]-lst_wrapped[-2]]))
    else:
        lst_edges = NP.concatenate((lst_wrapped, lst_wrapped+t_snap/3.6e3*15))

    duration_str = '_{0:0d}x{1:.1f}s'.format(n_snaps, t_snap[0])
ant_locs = NP.loadtxt(antenna_file, skiprows=6, comments="#", usecols=(1, 2, 3))
bl = GEOM.baseline_generator(ant_locs, auto=False, conjugate=False)
bl_lengths = NP.sqrt(NP.sum(bl ** 2, axis=1))

decl = -27.0  # in degrees
lat = -27.0  # in degrees
ha_range = 4.0  # in hrs
ha_step = 1.0 / 60.0  # in hrs
ha = 15.0 * NP.arange(-ha_range / 2, ha_range / 2, ha_step)
ha = NP.asarray(ha).reshape(-1, 1)
dec = decl + NP.zeros((len(ha), 1))
dec.reshape(-1, 1)

hadec = NP.hstack((ha, dec))

altaz = GEOM.hadec2altaz(hadec, lat, units="degrees")

dircos = GEOM.altaz2dircos(altaz, units="degrees")

dm = DLY.delay_envelope(bl, dircos, units="mks")

min_delays = dm[:, :, 1] - dm[:, :, 0]
max_delays = NP.sum(dm, axis=2)

fig = PLT.figure(figsize=(14, 8))
ax = PLT.axes([0.12, 0.1, 0.8, 0.8])
PLT.xlim(NP.min(bl_lengths) - 1.0, NP.max(bl_lengths) + 100.0)
PLT.ylim(1e9 * (NP.min(min_delays) - 1.0e-8), 1e9 * (NP.max(max_delays) + 1.0e-8))
PLT.xlabel("Baseline Length [m]", fontsize=18, weight="semibold")
PLT.ylabel("Delay [ns]", fontsize=18, weight="semibold")
PLT.title("Delay Envelope", fontsize=18, weight="semibold")
## GSM and Power pattern animation data

gsm_cartesian = HP.cartview(fluxes.ravel(), coord=['G','E'], xsize=200, return_projected_map=True)
ragrid, decgrid = NP.meshgrid(NP.linspace(NP.amin(ra_deg), NP.amax(ra_deg), gsm_cartesian.shape[1]), NP.linspace(NP.amin(dec_deg), NP.amax(dec_deg), gsm_cartesian.shape[0]))
ravect = ragrid.ravel()
decvect = decgrid.ravel()
n_snaps = int(t_obs/t_snap)
lst = (lst_init + (t_snap/3.6e3) * NP.arange(n_snaps)) * 15.0 # in degrees
# Get pointings in RA-Dec coordinates for animation
if obs_mode == 'track':
    pointings_radec = NP.repeat(NP.asarray(pointing_init).reshape(-1,2), n_snaps, axis=0)
else:
    pointings_radec = NP.hstack((NP.asarray(lst-pointing_init[0]).reshape(-1,1), pointing_init[1]+NP.zeros(n_snaps).reshape(-1,1)))

pointings_hadec = NP.hstack(((lst-pointings_radec[:,0]).reshape(-1,1), pointings_radec[:,1].reshape(-1,1)))
pointings_altaz = GEOM.hadec2altaz(pointings_hadec, MWA_latitude, units='degrees')
pointings_dircos = GEOM.altaz2dircos(pointings_altaz, units='degrees')
delay_matrix = DLY.delay_envelope(intrfrmtr.baseline, pointings_dircos, units='mks')

pbeams = []
m2s = []
for i in xrange(n_snaps):
    havect = lst[i] - ravect
    altaz = GEOM.hadec2altaz(NP.hstack((havect.reshape(-1,1),decvect.reshape(-1,1))), MWA_latitude, units='degrees')
    # m1, m2, d12 = GEOM.spherematch(pointings[i,0], pointings[i,1], ravect, decvect, 90.0, maxmatches=0)
    roi_altaz = NP.asarray(NP.where(altaz[:,0] >= 0.0)).ravel()
    pb = PB.primary_beam_generator(altaz[roi_altaz,:], freq, telescope='mwa', skyunits='altaz', freq_scale='Hz', phase_center=pointings_altaz[i,:])
    pbeams += [pb]
    m2s += [roi_altaz]

## Plotting animation