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(),
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:
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)