예제 #1
0
ant_kernshapeparms = {pol: {'xmax': 0.5 * ant_sizex, 'ymax': 0.5 * ant_sizey,
                            'rmin': 0.0, 'rmax': 0.5 * ant_diameter,
                            'rotangle': 0.0} for pol in ['P1', 'P2']}
ant_aprtr = APR.Aperture(pol_type=ant_pol_type, kernel_type=ant_kerntype,
                         shape=ant_kernshape, parms=ant_kernshapeparms,
                         lkpinfo=ant_lookupinfo, load_lookup=True)
if identical_antennas:
    ant_aprtrs = [ant_aprtr] * n_antennas

# Set up antenna array
ants = []
aar = AA.AntennaArray()
for i in xrange(n_antennas):
    ant = AA.Antenna('{0:0d}'.format(int(ant_info[i, 0])), '0', lat, -118.28, ant_info[i, 1:],
                     f0, nsamples=nts, aperture=ant_aprtrs[i])
    ant.f = ant.f0 + DSP.spectax(2 * nts, dt, shift=True)
    ants += [ant]
    aar = aar + ant

aar.grid(uvspacing=0.4, xypad=2 * NP.max([ant_sizex, ant_sizey]))
antpos_info = aar.antenna_positions(sort=True, centering=True)

# Select time steps
if max_n_timestamps is None:
    max_n_timestamps = len(timestamps)
else:
    max_n_timestamps = min(max_n_timestamps, len(timestamps))

timestamps = timestamps[min_timestamp:min_timestamp + max_n_timestamps]

master_pb = PGB.ProgressBar(widgets=[PGB.Percentage(),
예제 #2
0
antpos = antpos[core_ind, :]
ant_info = NP.hstack((antid.reshape(-1, 1), antpos))
n_antennas = ant_info.shape[0]
ant_data = ant_data[:, core_ind, :, :]

with PyCallGraph(output=graphviz, config=config):

    ants = []
    aar = AA.AntennaArray()
    for i in xrange(n_antennas):
        ant = AA.Antenna('{0:0d}'.format(int(ant_info[i, 0])),
                         lat,
                         ant_info[i, 1:],
                         f0,
                         nsamples=nts)
        ant.f = ant.f0 + DSP.spectax(2 * nts, dt, shift=True)
        ants += [ant]
        aar = aar + ant

    aar.grid()

    antpos_info = aar.antenna_positions(sort=True)

    if max_n_timestamps is None:
        max_n_timestamps = len(timestamps)
    else:
        max_n_timestamps = min(max_n_timestamps, len(timestamps))

    timestamps = timestamps[:max_n_timestamps]

    stand_cable_delays = NP.loadtxt(
     PDB.set_trace()
     orig_n_antennas = ant_info2.shape[0]
     final_n_antennas = NP.round(layout_fraction[ind]*ant_info2.shape[0]).astype(int)
     if final_n_antennas <= 1: final_n_antennas = 2
     ant_seed = 10
     randstate = NP.random.RandomState(ant_seed)
     randint = NP.sort(randstate.choice(ant_info2.shape[0], final_n_antennas, replace=False))
     ant_info2 = ant_info2[randint,:]
     ant_id2 = ant_id2[randint]
     n_antennas = ant_info2.shape[0]
     for ti in nts:
         ants = []
         aar = AA.AntennaArray()
         for ai in xrange(n_antennas):
             ant = AA.Antenna('{0:0d}'.format(int(ant_id2[ai])), 0.0, ant_info2[ai,:], f0, nsamples=ti)
             ant.f = ant.f0 + DSP.spectax(2*ti, 1/(2*ti*freq_resolution), shift=True)
             ants += [ant]
             aar = aar + ant
     
         aar.grid(xypad=2*NP.max([ant_sizex, ant_sizey]))
         du = aar.gridu[0,1] - aar.gridu[0,0]
         dv = aar.gridv[1,0] - aar.gridv[0,0]
         dxdy = du * dv * (FCNST.c/aar.f.max())**2
         if layout.split('-')[0] == 'MWA':
             fillfrac = n_antennas*ant_sizex*ant_sizey / (dxdy*aar.gridu.size) * 100
         elif layout.split('-')[0] == 'HEX':
             fillfrac = n_antennas*NP.pi*(ant_diameter/2)**2 / (dxdy*aar.gridu.size) * 100
 
         for itr in niter:
             if layout.split('-')[0] == 'MWA':
                 fname = '/data3/t_nithyanandan/project_MOFF/simulated/MWA/profiling/FX_serial_all_lines/MOFF_FX_performance_comparison_{0}_{1:.1f}mx{2:.1f}m_{3:0d}x{4:.1f}_kHz_{5:.1f}_MHz_{6:0d}_of_{7:0d}_ant_{8:0d}_acc_{9:0d}_pix_fillfrac_{10:.1f}_r{11:0d}'.format(layout,ant_sizex,ant_sizey,2*ti,freq_resolution/1e3,f0/1e6,n_antennas,orig_n_antennas,itr,aar.gridu.size,fillfrac,rnum)
# antpos -= NP.mean(antpos, axis=0).reshape(1,-1)

core_ind = NP.logical_and((NP.abs(antpos[:, 0]) < max_antenna_radius),
                          (NP.abs(antpos[:, 1]) < max_antenna_radius))
# core_ind = NP.logical_and((NP.abs(antpos[:,0]) <= NP.max(NP.abs(antpos[:,0]))), (NP.abs(antpos[:,1]) < NP.max(NP.abs(antpos[:,1]))))
ant_info = NP.hstack((antid[core_ind].reshape(-1, 1), antpos[core_ind, :]))
n_antennas = ant_info.shape[0]
ants = []
aar = AA.AntennaArray()
for i in xrange(n_antennas):
    ant = AA.Antenna('{0:0d}'.format(int(ant_info[i, 0])),
                     lat,
                     ant_info[i, 1:],
                     f0,
                     nsamples=nchan)
    ant.f = ant.f0 + DSP.spectax(2 * nchan, dt, shift=True)
    ants += [ant]
    aar = aar + ant

timestamps = hdulist0['TIMESTAMPS'].data['timestamp']
if max_n_timestamps is None:
    max_n_timestamps = len(timestamps)
else:
    max_n_timestamps = min(max_n_timestamps, len(timestamps))

timestamps = timestamps[:max_n_timestamps]

stand_cable_delays = NP.loadtxt(
    '/data3/t_nithyanandan/project_MOFF/data/samples/cable_delays.txt',
    skiprows=1)
antennas = stand_cable_delays[:, 0].astype(NP.int).astype(str)
# n_src = 4
# src_flux = NP.ones(n_src)
# skypos = 0.25*NP.hstack((NP.cos(2.0*NP.pi*NP.arange(n_src).reshape(-1,1)/n_src),
#                          NP.sin(2.0*NP.pi*NP.arange(n_src).reshape(-1,1)/n_src)))
# src_flux = [1.0, 1.0, 1.0, 1.0] 
# skypos = NP.asarray([[0.25, 0.0], [0.0, -0.25], [-0.25, 0.0], [0.0, 0.25]])
# skypos = NP.asarray([[0.0, 0.0], [0.2, 0.0], [0.0, 0.4], [0.0, -0.5]])

nvect = NP.sqrt(1.0-NP.sum(skypos**2, axis=1)).reshape(-1,1)
skypos = NP.hstack((skypos,nvect))

ants = []
aar = AA.AntennaArray()
for i in xrange(n_antennas):
    ant = AA.Antenna('{0:0d}'.format(int(ant_info[i,0])), lat, ant_info[i,1:], f0, nsamples=nchan/2)
    ant.f = ant.f0 + DSP.spectax(nchan, dt, shift=True)
    ants += [ant]
    aar = aar + ant

iar = AA.InterferometerArray(antenna_array=aar)

iar.grid()

antpos_info = aar.antenna_positions(sort=True)
Ef_runs = None

count = 0
for i in xrange(itr):
    E_timeseries_dict = SIM.stochastic_E_timeseries(f_center, nchan/2, 2*channel_width,
                                                    flux_ref=src_flux, skypos=skypos,
                                                    antpos=antpos_info['positions'],
def main():

    parser = argparse.ArgumentParser(description='Program to compare performance of MOFF and FX codes')
    parser.add_argument('--nts', help='Number of time samples per stream', dest='nts', default=8, type=int, metavar='nts')
    parser.add_argument('--xmax', help='Farthest x-location of antenna from core', dest='xmax', default=None, type=float, metavar='xmax', required=False)
    parser.add_argument('--ymax', help='Farthest y-location of antenna from core', dest='ymax', default=None, type=float, metavar='ymax', required=False)
    parser.add_argument('--ant-diameter', help='Antenna diameter (m)', dest='ant_diameter', default=None, type=float, metavar='ant_diameter', required=False)
    parser.add_argument('--ant-sizex', help='Antenna x-size (m)', dest='ant_sizex', default=None, type=float, metavar='ant_sizex', required=False)
    parser.add_argument('--ant-sizey', help='Antenna x-size (m)', dest='ant_sizey', default=None, type=float, metavar='ant_sizey', required=False)    
    parser.add_argument('--max-nt', help='Maximum number of time stamps', dest='ntmax', default=4, type=int, metavar='ntmax')
    parser.add_argument('--layout', help='Antenna array layout', dest='layout', default=None, type=str, metavar='layout', required=False)
    parser.add_argument('--layout-fraction', help='Fraction of original antenna array layout', dest='layout_fraction', default=1.0, type=float, metavar='layout_fraction', required=False)    
    parser.add_argument('--layout-file', help='Antenna array layout file', dest='layout_file', default=None, type=str, metavar='layout_file', required=False)

    args = vars(parser.parse_args())

    xmax = args['xmax']
    ymax = args['ymax']
    ant_sizex = args['ant_sizex']
    ant_sizey = args['ant_sizey']
    ant_diameter = args['ant_diameter']
    max_n_timestamps = args['ntmax']
    nts = args['nts']
    array_layout = args['layout']
    layout_fraction = args['layout_fraction']
    layout_file = args['layout_file']
    if (layout_fraction <= 0.0) or (layout_fraction > 1.0):
        raise ValueError('Fraction of original layout has to lie in the range 0-1')
    
    # Antenna initialization
    
    # lat = -26.701 # Latitude of MWA in degrees
    lat = -30.7224 # Latitude of HERA in degrees    
    f0 = 150e6 # Center frequency
    nchan = 2 * nts # number of frequency channels, factor 2 for padding before FFT
    
    identical_antennas = True
    if array_layout.split('-')[0] == 'MWA':
        ant_locs, ant_id = AL.MWA_128T(layout_file)
        ant_info = ant_locs - NP.mean(ant_locs, axis=0, keepdims=True)
        
        if (xmax is not None) and (ymax is not None):
            if (xmax < 160.0) and (ymax < 160.0):
                core_ind1 = NP.logical_and((NP.abs(ant_info[:,0]) < 160.0), (NP.abs(ant_info[:,1]) < 160.0))
            else:
                core_ind1 = NP.logical_and((NP.abs(ant_info[:,0]) < 600.0), (NP.abs(ant_info[:,1]) < 600.0))
            
            ant_info1 = ant_info[core_ind1,:]
            ant_info1 = ant_info1 - NP.mean(ant_info1, axis=0, keepdims=True)
            ant_id1 = ant_id[core_ind1]
        else:
            ant_info1 = NP.copy(ant_info)
            ant_id1 = NP.copy(ant_id)
            
        nx = 4 # dipoles along x
        ny = 4 # dipoles along y
        dx = 1.1 # dipole spacing along x
        dy = 1.1 # dipole spacing along y
        ant_sizex = nx * dx
        ant_sizey = ny * dy
        ant_diameter = NP.sqrt(ant_sizex**2 + ant_sizey**2)
        ant_kernshape = {pol: 'rect' for pol in ['P1','P2']}
        bl_kernshape = {pol: 'auto_convolved_rect' for pol in ['P11','P12','P21','P22']}
    elif array_layout.split('-')[0] == 'HEX':
        ant_locs, ant_id = AL.hexagon_generator(ant_diameter, n_total=int(array_layout.split('-')[1]))
        ant_diameter = ant_diameter
        ant_sizex = ant_diameter
        ant_sizey = ant_diameter
        ant_kernshape = {pol: 'circular' for pol in ['P1','P2']}
        bl_kernshape = {pol: 'auto_convolved_circular' for pol in ['P11','P12','P21','P22']}
        ant_info1 = NP.copy(ant_locs)
        ant_id1 = NP.copy(ant_id)
    else:
        raise ValueError('Other antenna array layouts not supported at the moment')

    core_ind2 = (NP.abs(ant_info1[:,0]) <= xmax) & (NP.abs(ant_info1[:,1]) <= ymax)
    ant_info2 = ant_info1[core_ind2,:]
    ant_info2 = ant_info2 - NP.mean(ant_info2, axis=0, keepdims=True)
    ant_id2 = ant_id1[core_ind2]
        
    orig_n_antennas = ant_info2.shape[0]
    final_n_antennas = NP.round(layout_fraction*ant_info2.shape[0]).astype(int)
    if final_n_antennas <= 1: final_n_antennas = 2
    ant_seed = 10
    randstate = NP.random.RandomState(ant_seed)
    randint = NP.sort(randstate.choice(ant_info2.shape[0], final_n_antennas, replace=False))
    ant_info2 = ant_info2[randint,:]
    ant_id2 = ant_id2[randint]
    n_antennas = ant_info2.shape[0]
    
    f_center = f0
    channel_width = 40e3
    bandwidth = nchan * channel_width
    dt = 1/bandwidth
    dts = 1/channel_width
    timestamps = 2*dts * NP.arange(max_n_timestamps)
    MOFF_tbinsize = None
    FX_tbinsize = None
    
    src_seed = 50
    rstate = NP.random.RandomState(src_seed)
    NP.random.seed(src_seed)
    # n_src = 1
    # lmrad = 0.0*NP.ones(n_src)
    # lmang = NP.zeros(n_src)
    n_src = 10
    lmrad = rstate.uniform(low=0.0, high=0.2, size=n_src).reshape(-1,1)
    lmang = rstate.uniform(low=0.0, high=2*NP.pi, size=n_src).reshape(-1,1)
    skypos = NP.hstack((lmrad * NP.cos(lmang), lmrad * NP.sin(lmang))).reshape(-1,2)
    skypos = NP.hstack((skypos, NP.sqrt(1.0-(skypos[:,0]**2 + skypos[:,1]**2)).reshape(-1,1)))
    src_flux = 10.0*NP.ones(n_src)
    
    grid_map_method = 'sparse'
    # grid_map_method = 'regular'
    
    ant_pol_type = 'dual'
    ant_kerntype = {pol: 'func' for pol in ['P1','P2']}
    ant_lookupinfo = None
    # ant_kerntype = {pol: 'lookup' for pol in ['P1','P2']}
    # ant_kernshape = None
    # ant_lookupinfo = {pol: '/data3/t_nithyanandan/project_MOFF/simulated/MWA/data/lookup/E_illumination_lookup_zenith.txt' for pol in ['P1','P2']}
    
    ant_kernshapeparms = {pol: {'xmax':0.5*ant_sizex, 'ymax':0.5*ant_sizey, 'rmin': 0.0, 'rmax': 0.5*ant_diameter, 'rotangle':0.0} for pol in ['P1','P2']}
    
    bl_pol_type = 'cross'
    bl_kerntype = {pol: 'func' for pol in ['P11','P12','P21','P22']}
    bl_lookupinfo = None
    # bl_kerntype = {pol: 'lookup' for pol in ['P11','P12','P21','P22']}
    # bl_kernshape = None
    # bl_lookupinfo = {pol:'/data3/t_nithyanandan/project_MOFF/simulated/MWA/data/lookup/E_illumination_lookup_zenith.txt' for pol in ['P11','P12','P21','P22']}
    
    bl_kernshapeparms = {pol: {'xmax':0.5*ant_sizex, 'ymax':0.5*ant_sizey, 'rmax': 0.5*ant_diameter, 'rotangle':0.0} for pol in ['P11','P12','P21','P22']}
    
    ant_aprtr = APR.Aperture(pol_type=ant_pol_type, kernel_type=ant_kerntype,
                             shape=ant_kernshape, parms=ant_kernshapeparms,
                             lkpinfo=ant_lookupinfo, load_lookup=True)
    bl_aprtr = APR.Aperture(pol_type=bl_pol_type, kernel_type=bl_kerntype,
                            shape=bl_kernshape, parms=bl_kernshapeparms,
                            lkpinfo=bl_lookupinfo, load_lookup=True)
    if identical_antennas:
        ant_aprtrs = [ant_aprtr] * n_antennas

# config = Config(max_depth=5, groups=True)
# graphviz = GraphvizOutput(output_file='/data3/t_nithyanandan/project_MOFF/simulated/MWA/figures/profile_graph_{0:0d}x{1:.1f}_kHz_{2:.1f}_MHz_{3:0d}_ant_{4:0d}_acc.png'.format(nchan, channel_width/1e3, f0/1e6, n_antennas, max_n_timestamps))
# config.trace_filter = GlobbingFilter(include=['antenna_array.*'])

# with PyCallGraph(output=graphviz, config=config):

    ants = []
    aar = AA.AntennaArray()
    for i in xrange(n_antennas):
        ant = AA.Antenna('{0:0d}'.format(int(ant_id2[i])), lat, ant_info2[i,:], f0, nsamples=nts, aperture=ant_aprtrs[i])
        ant.f = ant.f0 + DSP.spectax(2*nts, dt, shift=True)
        ants += [ant]
        aar = aar + ant

    aar.grid(xypad=2*NP.max([ant_sizex, ant_sizey]))
    antpos_info = aar.antenna_positions(sort=True, centering=True)
    
    efimgmax = []
        
    for i in xrange(max_n_timestamps):
        E_timeseries_dict = SIM.stochastic_E_timeseries(f_center, nchan/2, 2*channel_width,
                                                        flux_ref=src_flux, skypos=skypos,
                                                        antpos=antpos_info['positions'],
                                                        tshift=False)
        
        # ts = Time.now()
        # timestamp = ts.gps
        timestamp = timestamps[i]
        update_info = {}
        update_info['antennas'] = []
        update_info['antenna_array'] = {}
        update_info['antenna_array']['timestamp'] = timestamp

        print 'Consolidating Antenna updates...'
        progress = PGB.ProgressBar(widgets=[PGB.Percentage(), PGB.Bar(marker='-', left=' |', right='| '), PGB.Counter(), '/{0:0d} Antennas '.format(n_antennas), PGB.ETA()], maxval=n_antennas).start()
        antnum = 0

        for label in aar.antennas:
            adict = {}
            adict['label'] = label
            adict['action'] = 'modify'
            adict['timestamp'] = timestamp
            ind = antpos_info['labels'].index(label)
            adict['t'] = E_timeseries_dict['t']
            adict['gridfunc_freq'] = 'scale'    
            adict['gridmethod'] = 'NN'
            adict['distNN'] = 3.0
            adict['tol'] = 1.0e-6
            adict['maxmatch'] = 1
            adict['Et'] = {}
            adict['flags'] = {}
            adict['stack'] = True
            adict['wtsinfo'] = {}
            for pol in ['P1', 'P2']:
                adict['flags'][pol] = False
                adict['Et'][pol] = E_timeseries_dict['Et'][:,ind]
                # adict['wtsinfo'][pol] = [{'orientation':0.0, 'lookup':'/data3/t_nithyanandan/project_MOFF/simulated/MWA/data/lookup/E_illumination_lookup_zenith.txt'}]
                adict['wtsinfo'][pol] = [{'orientation':0.0, 'lookup':'/data3/t_nithyanandan/project_MOFF/simulated/LWA/data/lookup/E_illumination_isotropic_radiators_lookup_zenith.txt'}]
            update_info['antennas'] += [adict]

            progress.update(antnum+1)
            antnum += 1
        progress.finish()
        
        aar.update(update_info, parallel=True, verbose=True)
        if grid_map_method == 'regular':
            aar.grid_convolve_new(pol='P1', method='NN', distNN=0.5*NP.sqrt(ant_sizex**2+ant_sizey**2), identical_antennas=False, cal_loop=False, gridfunc_freq='scale', wts_change=False, parallel=False, pp_method='pool')    
        else:
            if i == 0:
                aar.genMappingMatrix(pol='P1', method='NN', distNN=0.5*NP.sqrt(ant_sizex**2+ant_sizey**2), identical_antennas=True, gridfunc_freq='scale', wts_change=False, parallel=False)

        if i == 0:
            efimgobj = AA.NewImage(antenna_array=aar, pol='P1')
        else:
            efimgobj.update(antenna_array=aar, reset=True)
        efimgobj.imagr(pol='P1', weighting='natural', pad=0, stack=True, grid_map_method=grid_map_method, cal_loop=False)

    efimgobj.accumulate(tbinsize=MOFF_tbinsize)
    efimgobj.removeAutoCorr(forceeval=True, datapool='avg', pad=0)
    avg_efimg = efimgobj.nzsp_img_avg['P1']
    if avg_efimg.ndim == 4:
        avg_efimg = avg_efimg[0,:,:,:]

    beam_MOFF = efimgobj.nzsp_beam_avg['P1']
    if beam_MOFF.ndim == 4:
        beam_MOFF = beam_MOFF[0,:,:,:]
    img_rms_MOFF = NP.std(NP.mean(avg_efimg, axis=2))
    beam_rms_MOFF = NP.std(NP.mean(beam_MOFF, axis=2))
    img_max_MOFF = NP.max(NP.mean(avg_efimg, axis=2))

    # Begin interferometry FX processing 

    iar = AA.InterferometerArray(antenna_array=aar)
    for bllabels in iar.interferometers:
        iar.interferometers[bllabels].aperture = copy.deepcopy(bl_aprtr)
    iar.refresh_antenna_pairs()
    iar.stack(on_flags=True, on_data=True, parallel=False, nproc=None)

    tbinsize = None
    iar.accumulate(tbinsize=tbinsize)
    interferometer_level_update_info = {}
    interferometer_level_update_info['interferometers'] = []
        
    for label in iar.interferometers:
        idict = {}
        idict['label'] = label
        idict['timestamp'] = timestamp
        idict['action'] = 'modify'
        idict['gridfunc_freq'] = 'scale'
        idict['gridmethod'] = 'NN'
        idict['distNN'] = 0.5 * FCNST.c / f0
        idict['tol'] = 1.0e-6
        idict['maxmatch'] = 1
        idict['wtsinfo'] = {}
        for pol in ['P11', 'P12', 'P21', 'P22']:
            idict['wtsinfo'][pol] = [{'orientation':0.0, 'lookup':'/data3/t_nithyanandan/project_MOFF/simulated/LWA/data/lookup/E_illumination_isotropic_radiators_lookup_zenith.txt'}]
        interferometer_level_update_info['interferometers'] += [idict]    
        
    iar.update(antenna_level_updates=None, interferometer_level_updates=interferometer_level_update_info, do_correlate=None, parallel=True, verbose=True)

    iar.grid(uvpad=2*NP.max([ant_sizex, ant_sizey]))
    if grid_map_method == 'regular':
        iar.grid_convolve_new(pol='P11', method='NN', distNN=NP.sqrt(ant_sizex**2+ant_sizey**2), identical_interferometers=True, gridfunc_freq='scale', wts_change=False, parallel=False, pp_method='pool')
    else:
        iar.genMappingMatrix(pol='P11', method='NN', distNN=NP.sqrt(ant_sizex**2+ant_sizey**2), identical_interferometers=True, gridfunc_freq='scale', wts_change=False, parallel=False)
    
    vfimgobj = AA.NewImage(interferometer_array=iar, pol='P11')
    vfimgobj.imagr(pol='P11', weighting='natural', pad=0, grid_map_method=grid_map_method)
            randstate.choice(ant_info2.shape[0],
                             final_n_antennas,
                             replace=False))
        ant_info2 = ant_info2[randint, :]
        ant_id2 = ant_id2[randint]
        n_antennas = ant_info2.shape[0]
        for ti in nts:
            ants = []
            aar = AA.AntennaArray()
            for ai in xrange(n_antennas):
                ant = AA.Antenna('{0:0d}'.format(int(ant_id2[ai])),
                                 0.0,
                                 ant_info2[ai, :],
                                 f0,
                                 nsamples=ti)
                ant.f = ant.f0 + DSP.spectax(
                    2 * ti, 1 / (2 * ti * freq_resolution), shift=True)
                ants += [ant]
                aar = aar + ant

            aar.grid(xypad=2 * NP.max([ant_sizex, ant_sizey]))
            du = aar.gridu[0, 1] - aar.gridu[0, 0]
            dv = aar.gridv[1, 0] - aar.gridv[0, 0]
            dxdy = du * dv * (FCNST.c / aar.f.max())**2
            if layout.split('-')[0] == 'MWA':
                fillfrac = n_antennas * ant_sizex * ant_sizey / (
                    dxdy * aar.gridu.size) * 100
            elif layout.split('-')[0] == 'HEX':
                fillfrac = n_antennas * NP.pi * (ant_diameter / 2)**2 / (
                    dxdy * aar.gridu.size) * 100

            for itr in niter:
예제 #8
0
def main():

    parser = argparse.ArgumentParser(
        description='Program to compare performance of MOFF and FX codes')
    parser.add_argument('--nts',
                        help='Number of time samples per stream',
                        dest='nts',
                        default=8,
                        type=int,
                        metavar='nts')
    parser.add_argument('--xmax',
                        help='Farthest x-location of antenna from core',
                        dest='xmax',
                        default=None,
                        type=float,
                        metavar='xmax',
                        required=False)
    parser.add_argument('--ymax',
                        help='Farthest y-location of antenna from core',
                        dest='ymax',
                        default=None,
                        type=float,
                        metavar='ymax',
                        required=False)
    parser.add_argument('--ant-diameter',
                        help='Antenna diameter (m)',
                        dest='ant_diameter',
                        default=None,
                        type=float,
                        metavar='ant_diameter',
                        required=False)
    parser.add_argument('--ant-sizex',
                        help='Antenna x-size (m)',
                        dest='ant_sizex',
                        default=None,
                        type=float,
                        metavar='ant_sizex',
                        required=False)
    parser.add_argument('--ant-sizey',
                        help='Antenna x-size (m)',
                        dest='ant_sizey',
                        default=None,
                        type=float,
                        metavar='ant_sizey',
                        required=False)
    parser.add_argument('--max-nt',
                        help='Maximum number of time stamps',
                        dest='ntmax',
                        default=4,
                        type=int,
                        metavar='ntmax')
    parser.add_argument('--layout',
                        help='Antenna array layout',
                        dest='layout',
                        default=None,
                        type=str,
                        metavar='layout',
                        required=False)
    parser.add_argument('--layout-fraction',
                        help='Fraction of original antenna array layout',
                        dest='layout_fraction',
                        default=1.0,
                        type=float,
                        metavar='layout_fraction',
                        required=False)
    parser.add_argument('--layout-file',
                        help='Antenna array layout file',
                        dest='layout_file',
                        default=None,
                        type=str,
                        metavar='layout_file',
                        required=False)

    args = vars(parser.parse_args())

    xmax = args['xmax']
    ymax = args['ymax']
    ant_sizex = args['ant_sizex']
    ant_sizey = args['ant_sizey']
    ant_diameter = args['ant_diameter']
    max_n_timestamps = args['ntmax']
    nts = args['nts']
    array_layout = args['layout']
    layout_fraction = args['layout_fraction']
    layout_file = args['layout_file']
    if (layout_fraction <= 0.0) or (layout_fraction > 1.0):
        raise ValueError(
            'Fraction of original layout has to lie in the range 0-1')

    # Antenna initialization

    # lat = -26.701 # Latitude of MWA in degrees
    lat = -30.7224  # Latitude of HERA in degrees
    f0 = 150e6  # Center frequency
    nchan = 2 * nts  # number of frequency channels, factor 2 for padding before FFT

    identical_antennas = True
    if array_layout.split('-')[0] == 'MWA':
        ant_locs, ant_id = AL.MWA_128T(layout_file)
        ant_info = ant_locs - NP.mean(ant_locs, axis=0, keepdims=True)

        if (xmax is not None) and (ymax is not None):
            if (xmax < 160.0) and (ymax < 160.0):
                core_ind1 = NP.logical_and((NP.abs(ant_info[:, 0]) < 160.0),
                                           (NP.abs(ant_info[:, 1]) < 160.0))
            else:
                core_ind1 = NP.logical_and((NP.abs(ant_info[:, 0]) < 600.0),
                                           (NP.abs(ant_info[:, 1]) < 600.0))

            ant_info1 = ant_info[core_ind1, :]
            ant_info1 = ant_info1 - NP.mean(ant_info1, axis=0, keepdims=True)
            ant_id1 = ant_id[core_ind1]
        else:
            ant_info1 = NP.copy(ant_info)
            ant_id1 = NP.copy(ant_id)

        nx = 4  # dipoles along x
        ny = 4  # dipoles along y
        dx = 1.1  # dipole spacing along x
        dy = 1.1  # dipole spacing along y
        ant_sizex = nx * dx
        ant_sizey = ny * dy
        ant_diameter = NP.sqrt(ant_sizex**2 + ant_sizey**2)
        ant_kernshape = {pol: 'rect' for pol in ['P1', 'P2']}
        bl_kernshape = {
            pol: 'auto_convolved_rect'
            for pol in ['P11', 'P12', 'P21', 'P22']
        }
    elif array_layout.split('-')[0] == 'HEX':
        ant_locs, ant_id = AL.hexagon_generator(
            ant_diameter, n_total=int(array_layout.split('-')[1]))
        ant_diameter = ant_diameter
        ant_sizex = ant_diameter
        ant_sizey = ant_diameter
        ant_kernshape = {pol: 'circular' for pol in ['P1', 'P2']}
        bl_kernshape = {
            pol: 'auto_convolved_circular'
            for pol in ['P11', 'P12', 'P21', 'P22']
        }
        ant_info1 = NP.copy(ant_locs)
        ant_id1 = NP.copy(ant_id)
    else:
        raise ValueError(
            'Other antenna array layouts not supported at the moment')

    core_ind2 = (NP.abs(ant_info1[:, 0]) <= xmax) & (NP.abs(ant_info1[:, 1]) <=
                                                     ymax)
    ant_info2 = ant_info1[core_ind2, :]
    ant_info2 = ant_info2 - NP.mean(ant_info2, axis=0, keepdims=True)
    ant_id2 = ant_id1[core_ind2]

    orig_n_antennas = ant_info2.shape[0]
    final_n_antennas = NP.round(layout_fraction *
                                ant_info2.shape[0]).astype(int)
    if final_n_antennas <= 1: final_n_antennas = 2
    ant_seed = 10
    randstate = NP.random.RandomState(ant_seed)
    randint = NP.sort(
        randstate.choice(ant_info2.shape[0], final_n_antennas, replace=False))
    ant_info2 = ant_info2[randint, :]
    ant_id2 = ant_id2[randint]
    n_antennas = ant_info2.shape[0]

    f_center = f0
    channel_width = 40e3
    bandwidth = nchan * channel_width
    dt = 1 / bandwidth
    dts = 1 / channel_width
    timestamps = 2 * dts * NP.arange(max_n_timestamps)
    MOFF_tbinsize = None
    FX_tbinsize = None

    src_seed = 50
    rstate = NP.random.RandomState(src_seed)
    NP.random.seed(src_seed)
    # n_src = 1
    # lmrad = 0.0*NP.ones(n_src)
    # lmang = NP.zeros(n_src)
    n_src = 10
    lmrad = rstate.uniform(low=0.0, high=0.2, size=n_src).reshape(-1, 1)
    lmang = rstate.uniform(low=0.0, high=2 * NP.pi, size=n_src).reshape(-1, 1)
    skypos = NP.hstack(
        (lmrad * NP.cos(lmang), lmrad * NP.sin(lmang))).reshape(-1, 2)
    skypos = NP.hstack(
        (skypos,
         NP.sqrt(1.0 - (skypos[:, 0]**2 + skypos[:, 1]**2)).reshape(-1, 1)))
    src_flux = 10.0 * NP.ones(n_src)

    grid_map_method = 'sparse'
    # grid_map_method = 'regular'

    ant_pol_type = 'dual'
    ant_kerntype = {pol: 'func' for pol in ['P1', 'P2']}
    ant_lookupinfo = None
    # ant_kerntype = {pol: 'lookup' for pol in ['P1','P2']}
    # ant_kernshape = None
    # ant_lookupinfo = {pol: '/data3/t_nithyanandan/project_MOFF/simulated/MWA/data/lookup/E_illumination_lookup_zenith.txt' for pol in ['P1','P2']}

    ant_kernshapeparms = {
        pol: {
            'xmax': 0.5 * ant_sizex,
            'ymax': 0.5 * ant_sizey,
            'rmin': 0.0,
            'rmax': 0.5 * ant_diameter,
            'rotangle': 0.0
        }
        for pol in ['P1', 'P2']
    }

    bl_pol_type = 'cross'
    bl_kerntype = {pol: 'func' for pol in ['P11', 'P12', 'P21', 'P22']}
    bl_lookupinfo = None
    # bl_kerntype = {pol: 'lookup' for pol in ['P11','P12','P21','P22']}
    # bl_kernshape = None
    # bl_lookupinfo = {pol:'/data3/t_nithyanandan/project_MOFF/simulated/MWA/data/lookup/E_illumination_lookup_zenith.txt' for pol in ['P11','P12','P21','P22']}

    bl_kernshapeparms = {
        pol: {
            'xmax': 0.5 * ant_sizex,
            'ymax': 0.5 * ant_sizey,
            'rmax': 0.5 * ant_diameter,
            'rotangle': 0.0
        }
        for pol in ['P11', 'P12', 'P21', 'P22']
    }

    ant_aprtr = APR.Aperture(pol_type=ant_pol_type,
                             kernel_type=ant_kerntype,
                             shape=ant_kernshape,
                             parms=ant_kernshapeparms,
                             lkpinfo=ant_lookupinfo,
                             load_lookup=True)
    bl_aprtr = APR.Aperture(pol_type=bl_pol_type,
                            kernel_type=bl_kerntype,
                            shape=bl_kernshape,
                            parms=bl_kernshapeparms,
                            lkpinfo=bl_lookupinfo,
                            load_lookup=True)
    if identical_antennas:
        ant_aprtrs = [ant_aprtr] * n_antennas


# config = Config(max_depth=5, groups=True)
# graphviz = GraphvizOutput(output_file='/data3/t_nithyanandan/project_MOFF/simulated/MWA/figures/profile_graph_{0:0d}x{1:.1f}_kHz_{2:.1f}_MHz_{3:0d}_ant_{4:0d}_acc.png'.format(nchan, channel_width/1e3, f0/1e6, n_antennas, max_n_timestamps))
# config.trace_filter = GlobbingFilter(include=['antenna_array.*'])

# with PyCallGraph(output=graphviz, config=config):

    ants = []
    aar = AA.AntennaArray()
    for i in xrange(n_antennas):
        ant = AA.Antenna('{0:0d}'.format(int(ant_id2[i])),
                         lat,
                         ant_info2[i, :],
                         f0,
                         nsamples=nts,
                         aperture=ant_aprtrs[i])
        ant.f = ant.f0 + DSP.spectax(2 * nts, dt, shift=True)
        ants += [ant]
        aar = aar + ant

    aar.grid(xypad=2 * NP.max([ant_sizex, ant_sizey]))
    antpos_info = aar.antenna_positions(sort=True, centering=True)

    efimgmax = []

    for i in xrange(max_n_timestamps):
        E_timeseries_dict = SIM.stochastic_E_timeseries(
            f_center,
            nchan / 2,
            2 * channel_width,
            flux_ref=src_flux,
            skypos=skypos,
            antpos=antpos_info['positions'],
            tshift=False)

        # ts = Time.now()
        # timestamp = ts.gps
        timestamp = timestamps[i]
        update_info = {}
        update_info['antennas'] = []
        update_info['antenna_array'] = {}
        update_info['antenna_array']['timestamp'] = timestamp

        print 'Consolidating Antenna updates...'
        progress = PGB.ProgressBar(widgets=[
            PGB.Percentage(),
            PGB.Bar(marker='-', left=' |', right='| '),
            PGB.Counter(), '/{0:0d} Antennas '.format(n_antennas),
            PGB.ETA()
        ],
                                   maxval=n_antennas).start()
        antnum = 0

        for label in aar.antennas:
            adict = {}
            adict['label'] = label
            adict['action'] = 'modify'
            adict['timestamp'] = timestamp
            ind = antpos_info['labels'].index(label)
            adict['t'] = E_timeseries_dict['t']
            adict['gridfunc_freq'] = 'scale'
            adict['gridmethod'] = 'NN'
            adict['distNN'] = 3.0
            adict['tol'] = 1.0e-6
            adict['maxmatch'] = 1
            adict['Et'] = {}
            adict['flags'] = {}
            adict['stack'] = True
            adict['wtsinfo'] = {}
            for pol in ['P1', 'P2']:
                adict['flags'][pol] = False
                adict['Et'][pol] = E_timeseries_dict['Et'][:, ind]
                # adict['wtsinfo'][pol] = [{'orientation':0.0, 'lookup':'/data3/t_nithyanandan/project_MOFF/simulated/MWA/data/lookup/E_illumination_lookup_zenith.txt'}]
                adict['wtsinfo'][pol] = [{
                    'orientation':
                    0.0,
                    'lookup':
                    '/data3/t_nithyanandan/project_MOFF/simulated/LWA/data/lookup/E_illumination_isotropic_radiators_lookup_zenith.txt'
                }]
            update_info['antennas'] += [adict]

            progress.update(antnum + 1)
            antnum += 1
        progress.finish()

        aar.update(update_info, parallel=True, verbose=True)
        if grid_map_method == 'regular':
            aar.grid_convolve_new(pol='P1',
                                  method='NN',
                                  distNN=0.5 *
                                  NP.sqrt(ant_sizex**2 + ant_sizey**2),
                                  identical_antennas=False,
                                  cal_loop=False,
                                  gridfunc_freq='scale',
                                  wts_change=False,
                                  parallel=False,
                                  pp_method='pool')
        else:
            if i == 0:
                aar.genMappingMatrix(pol='P1',
                                     method='NN',
                                     distNN=0.5 *
                                     NP.sqrt(ant_sizex**2 + ant_sizey**2),
                                     identical_antennas=True,
                                     gridfunc_freq='scale',
                                     wts_change=False,
                                     parallel=False)

        if i == 0:
            efimgobj = AA.NewImage(antenna_array=aar, pol='P1')
        else:
            efimgobj.update(antenna_array=aar, reset=True)
        efimgobj.imagr(pol='P1',
                       weighting='natural',
                       pad=0,
                       stack=True,
                       grid_map_method=grid_map_method,
                       cal_loop=False)

    efimgobj.accumulate(tbinsize=MOFF_tbinsize)
    efimgobj.removeAutoCorr(forceeval=True, datapool='avg', pad=0)
    avg_efimg = efimgobj.nzsp_img_avg['P1']
    if avg_efimg.ndim == 4:
        avg_efimg = avg_efimg[0, :, :, :]

    beam_MOFF = efimgobj.nzsp_beam_avg['P1']
    if beam_MOFF.ndim == 4:
        beam_MOFF = beam_MOFF[0, :, :, :]
    img_rms_MOFF = NP.std(NP.mean(avg_efimg, axis=2))
    beam_rms_MOFF = NP.std(NP.mean(beam_MOFF, axis=2))
    img_max_MOFF = NP.max(NP.mean(avg_efimg, axis=2))

    # Begin interferometry FX processing

    iar = AA.InterferometerArray(antenna_array=aar)
    for bllabels in iar.interferometers:
        iar.interferometers[bllabels].aperture = copy.deepcopy(bl_aprtr)
    iar.refresh_antenna_pairs()
    iar.stack(on_flags=True, on_data=True, parallel=False, nproc=None)

    tbinsize = None
    iar.accumulate(tbinsize=tbinsize)
    interferometer_level_update_info = {}
    interferometer_level_update_info['interferometers'] = []

    for label in iar.interferometers:
        idict = {}
        idict['label'] = label
        idict['timestamp'] = timestamp
        idict['action'] = 'modify'
        idict['gridfunc_freq'] = 'scale'
        idict['gridmethod'] = 'NN'
        idict['distNN'] = 0.5 * FCNST.c / f0
        idict['tol'] = 1.0e-6
        idict['maxmatch'] = 1
        idict['wtsinfo'] = {}
        for pol in ['P11', 'P12', 'P21', 'P22']:
            idict['wtsinfo'][pol] = [{
                'orientation':
                0.0,
                'lookup':
                '/data3/t_nithyanandan/project_MOFF/simulated/LWA/data/lookup/E_illumination_isotropic_radiators_lookup_zenith.txt'
            }]
        interferometer_level_update_info['interferometers'] += [idict]

    iar.update(antenna_level_updates=None,
               interferometer_level_updates=interferometer_level_update_info,
               do_correlate=None,
               parallel=True,
               verbose=True)

    iar.grid(uvpad=2 * NP.max([ant_sizex, ant_sizey]))
    if grid_map_method == 'regular':
        iar.grid_convolve_new(pol='P11',
                              method='NN',
                              distNN=NP.sqrt(ant_sizex**2 + ant_sizey**2),
                              identical_interferometers=True,
                              gridfunc_freq='scale',
                              wts_change=False,
                              parallel=False,
                              pp_method='pool')
    else:
        iar.genMappingMatrix(pol='P11',
                             method='NN',
                             distNN=NP.sqrt(ant_sizex**2 + ant_sizey**2),
                             identical_interferometers=True,
                             gridfunc_freq='scale',
                             wts_change=False,
                             parallel=False)

    vfimgobj = AA.NewImage(interferometer_array=iar, pol='P11')
    vfimgobj.imagr(pol='P11',
                   weighting='natural',
                   pad=0,
                   grid_map_method=grid_map_method)