示例#1
0
#         skyvis_lag = hdulist['real_lag_sky_visibility'].data + 1j * hdulist['imag_lag_sky_visibility'].data
#     else:
#         vis_lag = NP.vstack((vis_lag, hdulist['real_lag_visibility'].data + 1j * hdulist['imag_lag_visibility'].data))
#         skyvis_lag = NP.vstack((skyvis_lag, hdulist['real_lag_sky_visibility'].data + 1j * hdulist['imag_lag_sky_visibility'].data))
#     hdulist.close()
#     progress.update(i+1)
# progress.finish()

small_delays_ind = NP.abs(lags) <= 2.5e-6
lags = lags[small_delays_ind]
vis_lag = vis_lag[:,small_delays_ind,:]
skyvis_lag = skyvis_lag[:,small_delays_ind,:]

## Delay limits estimation

delay_matrix = DLY.delay_envelope(bl, pointings_dircos, units='mks')

## Binning baselines by orientation

blo = bl_orientation[:min(20*baseline_chunk_size, total_baselines)]
# blo[blo < -0.5*360.0/n_bins_baseline_orientation] = 360.0 - NP.abs(blo[blo < -0.5*360.0/n_bins_baseline_orientation])
bloh, bloe, blon, blori = OPS.binned_statistic(blo, statistic='count', bins=n_bins_baseline_orientation, range=[(-0.5*180.0/n_bins_baseline_orientation, 180.0-0.5*180.0/n_bins_baseline_orientation)])

# blo = bl_orientation[:min(20*baseline_chunk_size, total_baselines)]
# blo[blo < -0.5*360.0/n_bins_baseline_orientation] = 360.0 - NP.abs(blo[blo < -0.5*360.0/n_bins_baseline_orientation])
# bloh, bloe, blon, blori = OPS.binned_statistic(blo, statistic='count', bins=n_bins_baseline_orientation, range=[(-0.5*360.0/n_bins_baseline_orientation, 360.0-0.5*360.0/n_bins_baseline_orientation)])


# # ia.observing_run(pointing_init, skymod, t_snap, t_obs, chans, bpass, Tsys, lst_init, mode=obs_mode, freq_scale='GHz', brightness_units=flux_unit)
# # print 'Elapsed time = {0:.1f} minutes'.format((time.time()-ts)/60.0)
# # ia.delay_transform()
                                     1.0 * clean_lags.size / ia.lags.size,
                                     axis=1)
fg_cc_skyvis_lag = DSP.downsampler(fg_cc_skyvis_lag,
                                   1.0 * clean_lags.size / ia.lags.size,
                                   axis=1)
fg_cc_skyvis_lag_res = DSP.downsampler(fg_cc_skyvis_lag_res,
                                       1.0 * clean_lags.size / ia.lags.size,
                                       axis=1)

clean_lags_orig = NP.copy(clean_lags)
clean_lags = DSP.downsampler(clean_lags,
                             1.0 * clean_lags.size / ia.lags.size,
                             axis=-1)
clean_lags = clean_lags.ravel()

delaymat = DLY.delay_envelope(bl, pc_dircos, units='mks')
min_delay = -delaymat[0, :, 1] - delaymat[0, :, 0]
max_delay = delaymat[0, :, 0] - delaymat[0, :, 1]
clags = clean_lags.reshape(1, -1)
min_delay = min_delay.reshape(-1, 1)
max_delay = max_delay.reshape(-1, 1)
thermal_noise_window = NP.abs(clags) >= max_abs_delay * 1e-6
thermal_noise_window = NP.repeat(thermal_noise_window, bl.shape[0], axis=0)
EoR_window = NP.logical_or(clags > max_delay + 1 / bw,
                           clags < min_delay - 1 / bw)
wedge_window = NP.logical_and(clags <= max_delay, clags >= min_delay)
non_wedge_window = NP.logical_not(wedge_window)

bll_bin_count, bll_edges, bll_binnum, bll_ri = OPS.binned_statistic(
    bl_length,
    values=None,
    bl = bl[valid_ind,:]
    bl_length = bl_length[valid_ind]
    bl_orientation = bl_orientation[valid_ind]
    neg_bl_orientation_ind = bl_orientation > 90.0 + 0.5*180.0/n_bins_baseline_orientation
    bl_orientation[neg_bl_orientation_ind] -= 180.0
    bl[neg_bl_orientation_ind,:] = -bl[neg_bl_orientation_ind,:]

    fhd_vis_lag_noisy *= 2.78*nchan*freq_resolution/fhd_C
    fhd_obsid_pointing_dircos = pointings_dircos[obs_id==str(fhd_obsid[j]),:].reshape(1,-1)
    fhd_obsid_pointing_altaz = pointings_altaz[obs_id==str(fhd_obsid[j]),:].reshape(1,-1)
    fhd_obsid_pointing_hadec = pointings_hadec[obs_id==str(fhd_obsid[j]),:].reshape(1,-1)
    fhd_lst = NP.asscalar(lst[obs_id==str(fhd_obsid[j])])
    fhd_obsid_pointing_radec = NP.copy(fhd_obsid_pointing_hadec)
    fhd_obsid_pointing_radec[0,0] = fhd_lst - fhd_obsid_pointing_hadec[0,0]
    
    delay_matrix = DLY.delay_envelope(bl, fhd_obsid_pointing_dircos, units='mks')
    delaymat = DLY.delay_envelope(bl, pc, units='mks')

    min_delay = -delaymat[0,:,1]-delaymat[0,:,0]
    max_delay = delaymat[0,:,0]-delaymat[0,:,1]
    min_delay = min_delay.reshape(-1,1)
    max_delay = max_delay.reshape(-1,1)

    thermal_noise_window = NP.abs(fhd_delays) >= max_abs_delay*1e-6
    thermal_noise_window = thermal_noise_window.reshape(1,-1)
    thermal_noise_window = NP.repeat(thermal_noise_window, bl.shape[0], axis=0)
    EoR_window = NP.logical_or(fhd_delays > max_delay+1/bw, fhd_delays < min_delay-1/bw)
    wedge_window = NP.logical_and(fhd_delays <= max_delay, fhd_delays >= min_delay)
    fhd_vis_rms_lag = OPS.rms(fhd_vis_lag_noisy[:,:,0], mask=NP.logical_not(thermal_noise_window), axis=1)
    fhd_vis_rms_freq = NP.abs(fhd_vis_rms_lag) / NP.sqrt(nchan) / freq_resolution
    PDB.set_trace()
#     else:
#         vis_lag = DSP.downsampler(intrfrmtr.skyvis_lag, oversampling_factor)        

# if bpass_shape == 'bnw':
#     lags = DSP.downsampler(lags, eff_bw_ratio)
#     vis_lag = DSP.downsampler(vis_lag, eff_bw_ratio)

band_avg_noise_info = intrfrmtr.band_averaged_noise_estimate(filter_method='hpf')

outfile = '/data3/t_nithyanandan/project_MWA/obs_data_'+telescope+'_'+obs_mode+'_baseline_'+baseline_length_str+'m_'+baseline_orientation_str+'_deg_FG_model_'+fg_str+'_{0:.1f}_MHz_'.format(nchan*freq_resolution/1e3)+bpass_shape+'{0:.1f}'.format(oversampling_factor)

intrfrmtr.save(outfile, verbose=True, tabtype='BinTableHDU', overwrite=True)

## Delay limits estimation

delay_matrix = DLY.delay_envelope(intrfrmtr.baseline, pointings_dircos, units='mks')

## Foreground model backdrop

backdrop_coords = 'dircos'
if use_GSM:
    backdrop_coords = 'radec'

if backdrop_coords == 'radec':
    xmin = 0.0
    xmax = 360.0
    ymin = -90.0
    ymax = 90.0

    xgrid, ygrid = NP.meshgrid(NP.linspace(xmin, xmax, backdrop_xsize), NP.linspace(ymin, ymax, backdrop_xsize/2))
    xvect = xgrid.ravel()
            bl_length[baseline_bin_indices[0]], bl_length[min(
                baseline_bin_indices[n_bl_chunks - 1] + baseline_chunk_size -
                1, total_baselines - 1)]
        ) + fg_str + sky_sector_str + 'sprms_{0:.1f}_'.format(
            spindex_rms) + spindex_seed_str + 'nside_{0:0d}_'.format(
                nside
            ) + delaygain_err_str + 'Tsys_{0:.1f}K_{1}_{2:.1f}_MHz_'.format(
                Tsys, bandpass_str, freq / 1e6) + pfb_outstr + bpass_shape

    # infile = '/data3/t_nithyanandan/project_MWA/multi_baseline_visibilities_'+avg_drifts_str+obs_mode+'_baseline_range_{0:.1f}-{1:.1f}_'.format(bl_length[baseline_bin_indices[0]],bl_length[min(baseline_bin_indices[n_bl_chunks-1]+baseline_chunk_size-1,total_baselines-1)])+'gaussian_FG_model_'+fg_str+'_{0:0d}_'.format(nside)+'{0:.1f}_MHz'.format(nchan*freq_resolution/1e6)

    ia = RI.InterferometerArray(None, None, None, init_file=infile + '.fits')
    ia.phase_centering(phase_center=pc, phase_center_coords=pc_coords)
    ia.delay_transform(oversampling_factor - 1.0, freq_wts=window)

    delay_matrix = DLY.delay_envelope(ia.baselines, pc_dircos, units='mks')

    # lags = DSP.spectral_axis(ia.channels.size, delx=ia.freq_resolution, use_real=False, shift=True)
    # clean_area = NP.zeros(ia.channels.size, dtype=int)
    npad = ia.channels.size
    lags = DSP.spectral_axis(ia.channels.size + npad,
                             delx=ia.freq_resolution,
                             use_real=False,
                             shift=False)
    clean_area = NP.zeros(ia.channels.size + npad, dtype=int)
    skyvis_lag = (npad + ia.channels.size) * ia.freq_resolution * DSP.FT1D(
        NP.pad(ia.skyvis_freq * ia.bp * ia.bp_wts, ((0, 0), (0, npad), (0, 0)),
               mode='constant'),
        ax=1,
        inverse=True,
        use_real=False,
dsm_cc_vis_lag = DSP.downsampler(dsm_cc_vis_lag, 1.0*clean_lags.size/ia.lags.size, axis=1)
csm_cc_skyvis_lag = DSP.downsampler(csm_cc_skyvis_lag, 1.0*clean_lags.size/ia.lags.size, axis=1)
csm_cc_vis_lag = DSP.downsampler(csm_cc_vis_lag, 1.0*clean_lags.size/ia.lags.size, axis=1)
clean_lags = DSP.downsampler(clean_lags, 1.0*clean_lags.size/ia.lags.size, axis=-1)
clean_lags = clean_lags.ravel()

vis_noise_lag = NP.copy(ia.vis_noise_lag)
vis_noise_lag = vis_noise_lag[truncated_ref_bl_ind,:,:]
asm_cc_skyvis_lag = asm_cc_skyvis_lag[truncated_ref_bl_ind,:,:]
asm_cc_vis_lag = asm_cc_vis_lag[truncated_ref_bl_ind,:,:]
csm_cc_skyvis_lag = csm_cc_skyvis_lag[truncated_ref_bl_ind,:,:]
csm_cc_vis_lag = csm_cc_vis_lag[truncated_ref_bl_ind,:,:]
dsm_cc_skyvis_lag = dsm_cc_skyvis_lag[truncated_ref_bl_ind,:,:]
dsm_cc_vis_lag = dsm_cc_vis_lag[truncated_ref_bl_ind,:,:]

delaymat = DLY.delay_envelope(ia.baselines[truncated_ref_bl_ind,:], pc, units='mks')
bw = nchan * freq_resolution
min_delay = -delaymat[0,:,1]-delaymat[0,:,0]
max_delay = delaymat[0,:,0]-delaymat[0,:,1]
clags = clean_lags.reshape(1,-1)
min_delay = min_delay.reshape(-1,1)
max_delay = max_delay.reshape(-1,1)
thermal_noise_window = NP.abs(clags) >= max_abs_delay*1e-6
thermal_noise_window = NP.repeat(thermal_noise_window, ia.baselines[truncated_ref_bl_ind,:].shape[0], axis=0)
EoR_window = NP.logical_or(clags > max_delay+3/bw, clags < min_delay-3/bw)
strict_EoR_window = NP.logical_and(EoR_window, NP.abs(clags) < 1/coarse_channel_resolution)
wedge_window = NP.logical_and(clags <= max_delay, clags >= min_delay)
non_wedge_window = NP.logical_not(wedge_window)
vis_rms_lag = OPS.rms(asm_cc_vis_lag, mask=NP.logical_not(NP.repeat(thermal_noise_window[:,:,NP.newaxis], n_snaps, axis=2)), axis=1)
vis_rms_freq = NP.abs(vis_rms_lag) / NP.sqrt(nchan) / freq_resolution
T_rms_freq = vis_rms_freq / (2.0 * FCNST.k) * NP.mean(ia.A_eff[truncated_ref_bl_ind,:]) * NP.mean(ia.eff_Q[truncated_ref_bl_ind,:]) * NP.sqrt(2.0*freq_resolution*NP.asarray(ia.t_acc).reshape(1,1,-1)) * CNST.Jy
    spindex_seed_str = '{0:0d}_'.format(spindex_seed)

for k in range(n_sky_sectors):
    if n_sky_sectors == 1:
        sky_sector_str = '_all_sky_'
    else:
        sky_sector_str = '_sky_sector_{0:0d}_'.format(k)
    
    infile = rootdir+project_dir+telescope_str+'multi_baseline_visibilities_'+ground_plane_str+snapshot_type_str+obs_mode+duration_str+'_baseline_range_{0:.1f}-{1:.1f}_'.format(bl_length[baseline_bin_indices[0]],bl_length[min(baseline_bin_indices[n_bl_chunks-1]+baseline_chunk_size-1,total_baselines-1)])+fg_str+sky_sector_str+'sprms_{0:.1f}_'.format(spindex_rms)+spindex_seed_str+'nside_{0:0d}_'.format(nside)+delaygain_err_str+'Tsys_{0:.1f}K_{1}_{2:.1f}_MHz'.format(Tsys, bandpass_str, freq/1e6)+pfb_instr
    outfile = rootdir+project_dir+telescope_str+'multi_baseline_CLEAN_visibilities_'+ground_plane_str+snapshot_type_str+obs_mode+duration_str+'_baseline_range_{0:.1f}-{1:.1f}_'.format(bl_length[baseline_bin_indices[0]],bl_length[min(baseline_bin_indices[n_bl_chunks-1]+baseline_chunk_size-1,total_baselines-1)])+fg_str+sky_sector_str+'sprms_{0:.1f}_'.format(spindex_rms)+spindex_seed_str+'nside_{0:0d}_'.format(nside)+delaygain_err_str+'Tsys_{0:.1f}K_{1}_{2:.1f}_MHz_'.format(Tsys, bandpass_str, freq/1e6)+pfb_outstr+bpass_shape

    ia = RI.InterferometerArray(None, None, None, init_file=infile+'.fits') 
    ia.phase_centering(phase_center=pc, phase_center_coords=pc_coords)   
    ia.delay_transform(oversampling_factor-1.0, freq_wts=window)
    
    delay_matrix = DLY.delay_envelope(ia.baselines, pc_dircos, units='mks')

    npad = ia.channels.size
    lags = DSP.spectral_axis(ia.channels.size + npad, delx=ia.freq_resolution, use_real=False, shift=False)
    clean_area = NP.zeros(ia.channels.size + npad, dtype=int)
    skyvis_lag = (npad + ia.channels.size) * ia.freq_resolution * DSP.FT1D(NP.pad(ia.skyvis_freq*ia.bp*ia.bp_wts, ((0,0),(0,npad),(0,0)), mode='constant'), ax=1, inverse=True, use_real=False, shift=False)
    vis_lag = (npad + ia.channels.size) * ia.freq_resolution * DSP.FT1D(NP.pad(ia.vis_freq*ia.bp*ia.bp_wts, ((0,0),(0,npad),(0,0)), mode='constant'), ax=1, inverse=True, use_real=False, shift=False)
    lag_kernel = (npad + ia.channels.size) * ia.freq_resolution * DSP.FT1D(NP.pad(ia.bp, ((0,0),(0,npad),(0,0)), mode='constant'), ax=1, inverse=True, use_real=False, shift=False)

    ccomponents_noiseless = NP.zeros_like(skyvis_lag)
    ccres_noiseless = NP.zeros_like(skyvis_lag)

    ccomponents_noisy = NP.zeros_like(vis_lag)
    ccres_noisy = NP.zeros_like(vis_lag)
    
    for snap_iter in xrange(ia.skyvis_freq.shape[2]):
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')

hadec_text = ax.text(0.05, 0.9, '', transform=ax.transAxes, fontsize=18)

l, = PLT.plot([], [], 'k.', markersize=2)
fg_cc_skyvis_lag = hdulist['CLEAN NOISELESS DELAY SPECTRA REAL'].data + 1j * hdulist['CLEAN NOISELESS DELAY SPECTRA IMAG'].data
fg_cc_skyvis_lag_res = hdulist['CLEAN NOISELESS DELAY SPECTRA RESIDUALS REAL'].data + 1j * hdulist['CLEAN NOISELESS DELAY SPECTRA RESIDUALS IMAG'].data
hdulist.close()

geor_cc_skyvis_lag += geor_cc_skyvis_lag_res
fg_cc_skyvis_lag += fg_cc_skyvis_lag_res

geor_cc_skyvis_lag = DSP.downsampler(geor_cc_skyvis_lag, 1.0*clean_lags.size/ia.lags.size, axis=1)
fg_cc_skyvis_lag = DSP.downsampler(fg_cc_skyvis_lag, 1.0*clean_lags.size/ia.lags.size, axis=1)
fg_cc_skyvis_lag_res = DSP.downsampler(fg_cc_skyvis_lag_res, 1.0*clean_lags.size/ia.lags.size, axis=1)

clean_lags_orig = NP.copy(clean_lags)
clean_lags = DSP.downsampler(clean_lags, 1.0*clean_lags.size/ia.lags.size, axis=-1)
clean_lags = clean_lags.ravel()

delaymat = DLY.delay_envelope(bl, pc_dircos, units='mks')
min_delay = -delaymat[0,:,1]-delaymat[0,:,0]
max_delay = delaymat[0,:,0]-delaymat[0,:,1]
clags = clean_lags.reshape(1,-1)
min_delay = min_delay.reshape(-1,1)
max_delay = max_delay.reshape(-1,1)
thermal_noise_window = NP.abs(clags) >= max_abs_delay*1e-6
thermal_noise_window = NP.repeat(thermal_noise_window, bl.shape[0], axis=0)
EoR_window = NP.logical_or(clags > max_delay+1/bw, clags < min_delay-1/bw)
wedge_window = NP.logical_and(clags <= max_delay, clags >= min_delay)
non_wedge_window = NP.logical_not(wedge_window)

bll_bin_count, bll_edges, bll_binnum, bll_ri = OPS.binned_statistic(bl_length, values=None, statistic='count', bins=NP.hstack((geor_bl_length-1e-10, geor_bl_length.max()+1e-10)))

snap_min = 0
snap_max = 39
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")

hadec_text = ax.text(0.05, 0.9, "", transform=ax.transAxes, fontsize=18)

l, = PLT.plot([], [], "k.", markersize=2)
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

fig = PLT.figure(figsize=(14,14))
    bl_orientation[neg_bl_orientation_ind] -= 180.0
    bl[neg_bl_orientation_ind, :] = -bl[neg_bl_orientation_ind, :]

    fhd_vis_lag_noisy *= 2.78 * nchan * freq_resolution / fhd_C
    fhd_obsid_pointing_dircos = pointings_dircos[
        obs_id == str(fhd_obsid[j]), :].reshape(1, -1)
    fhd_obsid_pointing_altaz = pointings_altaz[
        obs_id == str(fhd_obsid[j]), :].reshape(1, -1)
    fhd_obsid_pointing_hadec = pointings_hadec[
        obs_id == str(fhd_obsid[j]), :].reshape(1, -1)
    fhd_lst = NP.asscalar(lst[obs_id == str(fhd_obsid[j])])
    fhd_obsid_pointing_radec = NP.copy(fhd_obsid_pointing_hadec)
    fhd_obsid_pointing_radec[0, 0] = fhd_lst - fhd_obsid_pointing_hadec[0, 0]

    delay_matrix = DLY.delay_envelope(bl,
                                      fhd_obsid_pointing_dircos,
                                      units='mks')
    delaymat = DLY.delay_envelope(bl, pc, units='mks')

    min_delay = -delaymat[0, :, 1] - delaymat[0, :, 0]
    max_delay = delaymat[0, :, 0] - delaymat[0, :, 1]
    min_delay = min_delay.reshape(-1, 1)
    max_delay = max_delay.reshape(-1, 1)

    thermal_noise_window = NP.abs(fhd_delays) >= max_abs_delay * 1e-6
    thermal_noise_window = thermal_noise_window.reshape(1, -1)
    thermal_noise_window = NP.repeat(thermal_noise_window, bl.shape[0], axis=0)
    EoR_window = NP.logical_or(fhd_delays > max_delay + 1 / bw,
                               fhd_delays < min_delay - 1 / bw)
    wedge_window = NP.logical_and(fhd_delays <= max_delay,
                                  fhd_delays >= min_delay)