def fs_from_file(filename, frq, src, del_t=900, transposed=True, subtract_avg=False): f = h5py.File(filename, 'r') times = f['index_map']['time'].value['ctime'] + 10.6 src_trans = eph.transit_times(src, times[0]) # try to account for differential arrival time from cylinder rotation. del_phi = (src._dec - np.radians(eph.CHIMELATITUDE)) * np.sin(np.radians(1.988)) del_phi *= (24 * 3600.0) / (2 * np.pi) # Adjust the transit time accordingly src_trans += del_phi # Select +- del_t of transit, accounting for the mispointing t_range = np.where((times < src_trans + del_t) & (times > src_trans - del_t))[0] times = times[t_range[0]:t_range[-1]]#[offp::2] test print "Time range:", times[0], times[-1] print "\n...... This data is from %s starting at RA: %f ...... \n" \ % (eph.unix_to_datetime(times[0]), eph.transit_RA(times[0])) if transposed is True: v = f['vis'][frq[0]:frq[-1]+1, :] v = v[..., t_range[0]:t_range[-1]] vis = v['r'] + 1j * v['i'] del v # Read in time and freq slice if data has not yet been transposed if transposed is False: v = f['vis'][t_range[0]:t_range[-1], frq[0]:frq[-1]+1, :] vis = v['r'][:] + 1j * v['i'][:] del v vis = np.transpose(vis, (1, 2, 0)) inp = gen_inp()[0] # Remove offset from galaxy if subtract_avg is True: vis -= 0.5 * (vis[..., 0] + vis[..., -1])[..., np.newaxis] freq_MHZ = 800.0 - np.array(frq) / 1024.0 * 400. print len(inp) baddies = np.where(np.isnan(tools.get_feed_positions(inp)[:, 0]))[0] # Fringestop to location of "src" data_fs = tools.fringestop_pathfinder(vis, eph.transit_RA(times), freq_MHZ, inp, src) # data_fs = fringestop_pathfinder(vis, eph.transit_RA(times), freq_MHZ, inp, src) return data_fs
def fringestop_and_sum(fn, feeds, freq, src, transposed=True, return_unfs=True, meridian=False, del_t=1500, frick=None): """ Take an input file fn and a set of feeds and return a formed beam on src. """ if transposed is True: r = andata.Reader(fn) r.freq_sel = freq X = r.read() times = r.time else: f = h5py.File(fn, 'r') times = f['index_map']['time'].value['ctime'] print "Read in data" # Get transit time for source src_trans = eph.transit_times(src, times[0]) del_phi = 1.30 * (src._dec - np.radians(eph.CHIMELATITUDE)) * np.sin(np.radians(1.988)) del_phi *= (24 * 3600.0) / (2 * np.pi) # Adjust the transit time accordingly src_trans += del_phi # Select +- del_t of transit, accounting for the mispointing t_range = np.where((times < src_trans + del_t) & (times > src_trans - del_t))[0] times = times[t_range[0]:t_range[-1]]#[offp::2] test print "Time range:", times[0], times[-1] # Generate correctly ordered corrinputs corrinput_real = gen_inp()[0] inp = np.array(corrinput_real) # Ensure vis array is in correct order (freq, prod, time) if transposed is True: data = X.vis[:, :, t_range[0]:t_range[-1]] freq = X.freq else: v = f['vis'][t_range[0]:t_range[-1], freq, :] vis = v['r'] + 1j * v['i'] data = vis.transpose()[np.newaxis] del vis freq = 800 - 400.0 / 1024 * freq freq = np.array([freq]) # autos = auto_corrs(256) # offp = (abs(data[:, autos, 0::2]).mean() > (abs(data[:, autos, 1::2]).mean())).astype(int) # data = data[..., offp::2] test data_unfs = sum_corrs(data.copy(), feeds) ra_ = eph.transit_RA(times) ra_2 = nolan_ra(times) #ra_ = ra_2.copy() if meridian is True: ra = np.ones_like(ra_) * np.degrees(src._ra) else: ra = ra_ print len(inp) dfs = tools.fringestop_pathfinder(data.copy(), ra, freq, inp, src) #dfs = fringestop_pathfinder(data.copy(), ra_2, freq, inp, src, frick=frick) # dfs = fringestop_pathfinder(data.copy(), ra_1, freq, inp, src, frick=frick) # fp = np.loadtxt('/home/connor/feed_layout_decrease.txt') # PH = fill_nolan(times, src._ra * 180.0 / np.pi, src._dec * 180.0 / np.pi, fp) dfs_sum = sum_corrs(dfs, feeds) if return_unfs is True: return dfs_sum, ra_, dfs, data else: return dfs_sum, ra_
def solve_ps_transit(filename, corrs, feeds, inp, src, nfreq=1024, transposed=False, nfeed=128): """ Function that fringestops time slice where point source is in the beam, takes all correlations for a given polarization, and then eigendecomposes the correlation matrix freq by freq after removing the fpga phases. It will also plot intermediate steps to verify the phase solution. Parameters ---------- filename : np.str Full-path filename corrs : list List of correlations to use in solver feeds : list List of feeds to use inp : Correlator inputs (output of ch_util.tools.get_correlator_inputs) src : ephem.FixedBody Source to calibrate off of. e.g. ch_util.ephemeris.TauA Returns ------- Gains : np.array Complex gain array (nfreq, nfeed) """ nsplit = 32 # Number of freq chunks to divide nfreq into del_t = 800 f = h5py.File(filename, 'r') # Add half an integration time to each. Hack. times = f['index_map']['time'].value['ctime'] + 10.50 src_trans = eph.transit_times(src, times[0]) # try to account for differential arrival time from # cylinder rotation. del_phi = (src._dec - np.radians(eph.CHIMELATITUDE)) \ * np.sin(np.radians(1.988)) del_phi *= (24 * 3600.0) / (2 * np.pi) # Adjust the transit time accordingly src_trans += del_phi # Select +- del_t of transit, accounting for the mispointing t_range = np.where((times < src_trans + del_t) & (times > src_trans - del_t))[0] print "\n...... This data is from %s starting at RA: %f ...... \n" \ % (eph.unix_to_datetime(times[0]), eph.transit_RA(times[0])) assert (len(t_range) > 0), "Source is not in this acq" # Create gains array to fill in solution Gains = np.zeros([nfreq, nfeed], np.complex128) print "Starting the solver" times = times[t_range[0]:t_range[-1]] k=0 # Start at a strong freq channel that can be plotted # and from which we can find the noise source on-sample for i in range(12, nsplit) + range(0, 12): k+=1 # Divides the arrays up into nfreq / nsplit freq chunks and solves those frq = range(i * nfreq // nsplit, (i+1) * nfreq // nsplit) print " %d:%d \n" % (frq[0], frq[-1]) # Read in time and freq slice if data has already been transposed if transposed is True: v = f['vis'][frq[0]:frq[-1]+1, corrs, :] v = v[..., t_range[0]:t_range[-1]] vis = v['r'] + 1j * v['i'] if k==1: autos = auto_corrs(nfeed) offp = (abs(vis[:, autos, 0::2]).mean() > \ (abs(vis[:, autos, 1::2]).mean())).astype(int) times = times[offp::2] vis = vis[..., offp::2] gg = f['gain_coeff'][frq[0]:frq[-1]+1, feeds, t_range[0]:t_range[-1]][..., offp::2] gain_coeff = gg['r'] + 1j * gg['i'] del gg # Read in time and freq slice if data has not yet been transposed if transposed is False: print "TRANSPOSED V OF CODE DOESN'T WORK YET!" v = f['vis'][t_range[0]:t_range[-1]:2, frq[0]:frq[-1]+1, corrs] vis = v['r'][:] + 1j * v['i'][:] del v gg = f['gain_coeff'][0, frq[0]:frq[-1]+1, feeds] gain_coeff = gg['r'][:] + 1j * gg['i'][:] vis = vis[..., offp::2] vis = np.transpose(vis, (1, 2, 0)) # Remove fpga gains from data vis = remove_fpga_gains(vis, gain_coeff, nfeed=nfeed, triu=False) # Remove offset from galaxy vis -= 0.5 * (vis[..., 0] + vis[..., -1])[..., np.newaxis] # Get physical freq for fringestopper freq_MHZ = 800.0 - np.array(frq) / 1024.0 * 400. baddies = np.where(np.isnan(tools.get_feed_positions(inp)[:, 0]))[0] a, b, c = select_corrs(baddies, nfeed=128) vis[:, a + b] = 0.0 # Fringestop to location of "src" data_fs = tools.fringestop_pathfinder(vis, eph.transit_RA(times), freq_MHZ, inp, src) del vis dr, sol_arr = solve_gain(data_fs) # Find index of point source transit drlist = np.argmax(dr, axis=-1) # If multiple freq channels are zerod, the trans_pix # will end up being 0. This is bad, so ensure that # you are only looking for non-zero transit pixels. drlist = [x for x in drlist if x != 0] trans_pix = np.argmax(np.bincount(drlist)) assert trans_pix != 0.0 Gains[frq] = sol_arr[..., trans_pix-3:trans_pix+4].mean(-1) zz = h5py.File('data' + str(i) + '.hdf5','w') zz.create_dataset('data', data=dr) zz.close() print "%f, %d Nans out of %d" % (np.isnan(sol_arr).sum(), np.isnan(Gains[frq]).sum(), np.isnan(Gains[frq]).sum()) print trans_pix, sol_arr[..., trans_pix-3:trans_pix+4].mean(-1).sum(), sol_arr.mean(-1).sum() # Plot up post-fs phases to see if everything has been fixed if frq[0] == 12 * nsplit: print "======================" print " Plotting up freq: %d" % frq[0] print "======================" img_nm = './phs_plots/dfs' + np.str(frq[17]) + np.str(np.int(time.time())) +'.png' img_nmcorr = './phs_plots/dfs' + np.str(frq[17]) + np.str(np.int(time.time())) +'corr.png' plt_gains(data_fs, 0, img_name=img_nm, bad_chans=baddies) dfs_corr = correct_dfs(data_fs, np.angle(Gains[frq])[..., np.newaxis], nfeed=128) plt_gains(dfs_corr, 0, img_name=img_nmcorr, bad_chans=baddies) del dfs_corr del data_fs, a return Gains
def fringestop_and_sum(fn, feeds, freq, src, transposed=True, return_unfs=True, meridian=False, del_t=1500, frick=None): """ Take an input file fn and a set of feeds and return a formed beam on src. """ if transposed is True: r = andata.Reader(fn) r.freq_sel = freq X = r.read() times = r.time else: f = h5py.File(fn, 'r') times = f['index_map']['time'].value['ctime'] print "Read in data" # Get transit time for source src_trans = eph.transit_times(src, times[0]) del_phi = 1.30 * (src._dec - np.radians(eph.CHIMELATITUDE)) * np.sin( np.radians(1.988)) del_phi *= (24 * 3600.0) / (2 * np.pi) # Adjust the transit time accordingly src_trans += del_phi # Select +- del_t of transit, accounting for the mispointing t_range = np.where((times < src_trans + del_t) & (times > src_trans - del_t))[0] times = times[t_range[0]:t_range[-1]] #[offp::2] test print "Time range:", times[0], times[-1] # Generate correctly ordered corrinputs corrinput_real = gen_inp()[0] inp = np.array(corrinput_real) # Ensure vis array is in correct order (freq, prod, time) if transposed is True: data = X.vis[:, :, t_range[0]:t_range[-1]] freq = X.freq else: v = f['vis'][t_range[0]:t_range[-1], freq, :] vis = v['r'] + 1j * v['i'] data = vis.transpose()[np.newaxis] del vis freq = 800 - 400.0 / 1024 * freq freq = np.array([freq]) # autos = auto_corrs(256) # offp = (abs(data[:, autos, 0::2]).mean() > (abs(data[:, autos, 1::2]).mean())).astype(int) # data = data[..., offp::2] test data_unfs = sum_corrs(data.copy(), feeds) ra_ = eph.transit_RA(times) ra_2 = nolan_ra(times) #ra_ = ra_2.copy() if meridian is True: ra = np.ones_like(ra_) * np.degrees(src._ra) else: ra = ra_ print len(inp) dfs = tools.fringestop_pathfinder(data.copy(), ra, freq, inp, src) #dfs = fringestop_pathfinder(data.copy(), ra_2, freq, inp, src, frick=frick) # dfs = fringestop_pathfinder(data.copy(), ra_1, freq, inp, src, frick=frick) # fp = np.loadtxt('/home/connor/feed_layout_decrease.txt') # PH = fill_nolan(times, src._ra * 180.0 / np.pi, src._dec * 180.0 / np.pi, fp) dfs_sum = sum_corrs(dfs, feeds) if return_unfs is True: return dfs_sum, ra_, dfs, data else: return dfs_sum, ra_
def fs_from_file(filename, frq, src, del_t=900, transposed=True, subtract_avg=False): f = h5py.File(filename, 'r') times = f['index_map']['time'].value['ctime'] + 10.6 src_trans = eph.transit_times(src, times[0]) # try to account for differential arrival time from cylinder rotation. del_phi = (src._dec - np.radians(eph.CHIMELATITUDE)) * np.sin( np.radians(1.988)) del_phi *= (24 * 3600.0) / (2 * np.pi) # Adjust the transit time accordingly src_trans += del_phi # Select +- del_t of transit, accounting for the mispointing t_range = np.where((times < src_trans + del_t) & (times > src_trans - del_t))[0] times = times[t_range[0]:t_range[-1]] #[offp::2] test print "Time range:", times[0], times[-1] print "\n...... This data is from %s starting at RA: %f ...... \n" \ % (eph.unix_to_datetime(times[0]), eph.transit_RA(times[0])) if transposed is True: v = f['vis'][frq[0]:frq[-1] + 1, :] v = v[..., t_range[0]:t_range[-1]] vis = v['r'] + 1j * v['i'] del v # Read in time and freq slice if data has not yet been transposed if transposed is False: v = f['vis'][t_range[0]:t_range[-1], frq[0]:frq[-1] + 1, :] vis = v['r'][:] + 1j * v['i'][:] del v vis = np.transpose(vis, (1, 2, 0)) inp = gen_inp()[0] # Remove offset from galaxy if subtract_avg is True: vis -= 0.5 * (vis[..., 0] + vis[..., -1])[..., np.newaxis] freq_MHZ = 800.0 - np.array(frq) / 1024.0 * 400. print len(inp) baddies = np.where(np.isnan(tools.get_feed_positions(inp)[:, 0]))[0] # Fringestop to location of "src" data_fs = tools.fringestop_pathfinder(vis, eph.transit_RA(times), freq_MHZ, inp, src) # data_fs = fringestop_pathfinder(vis, eph.transit_RA(times), freq_MHZ, inp, src) return data_fs
def solve_ps_transit(filename, corrs, feeds, inp, src, nfreq=1024, transposed=False, nfeed=128): """ Function that fringestops time slice where point source is in the beam, takes all correlations for a given polarization, and then eigendecomposes the correlation matrix freq by freq after removing the fpga phases. It will also plot intermediate steps to verify the phase solution. Parameters ---------- filename : np.str Full-path filename corrs : list List of correlations to use in solver feeds : list List of feeds to use inp : Correlator inputs (output of ch_util.tools.get_correlator_inputs) src : ephem.FixedBody Source to calibrate off of. e.g. ch_util.ephemeris.TauA Returns ------- Gains : np.array Complex gain array (nfreq, nfeed) """ nsplit = 32 # Number of freq chunks to divide nfreq into del_t = 800 f = h5py.File(filename, 'r') # Add half an integration time to each. Hack. times = f['index_map']['time'].value['ctime'] + 10.50 src_trans = eph.transit_times(src, times[0]) # try to account for differential arrival time from # cylinder rotation. del_phi = (src._dec - np.radians(eph.CHIMELATITUDE)) \ * np.sin(np.radians(1.988)) del_phi *= (24 * 3600.0) / (2 * np.pi) # Adjust the transit time accordingly src_trans += del_phi # Select +- del_t of transit, accounting for the mispointing t_range = np.where((times < src_trans + del_t) & (times > src_trans - del_t))[0] print "\n...... This data is from %s starting at RA: %f ...... \n" \ % (eph.unix_to_datetime(times[0]), eph.transit_RA(times[0])) assert (len(t_range) > 0), "Source is not in this acq" # Create gains array to fill in solution Gains = np.zeros([nfreq, nfeed], np.complex128) print "Starting the solver" times = times[t_range[0]:t_range[-1]] k = 0 # Start at a strong freq channel that can be plotted # and from which we can find the noise source on-sample for i in range(12, nsplit) + range(0, 12): k += 1 # Divides the arrays up into nfreq / nsplit freq chunks and solves those frq = range(i * nfreq // nsplit, (i + 1) * nfreq // nsplit) print " %d:%d \n" % (frq[0], frq[-1]) # Read in time and freq slice if data has already been transposed if transposed is True: v = f['vis'][frq[0]:frq[-1] + 1, corrs, :] v = v[..., t_range[0]:t_range[-1]] vis = v['r'] + 1j * v['i'] if k == 1: autos = auto_corrs(nfeed) offp = (abs(vis[:, autos, 0::2]).mean() > \ (abs(vis[:, autos, 1::2]).mean())).astype(int) times = times[offp::2] vis = vis[..., offp::2] gg = f['gain_coeff'][frq[0]:frq[-1] + 1, feeds, t_range[0]:t_range[-1]][..., offp::2] gain_coeff = gg['r'] + 1j * gg['i'] del gg # Read in time and freq slice if data has not yet been transposed if transposed is False: print "TRANSPOSED V OF CODE DOESN'T WORK YET!" v = f['vis'][t_range[0]:t_range[-1]:2, frq[0]:frq[-1] + 1, corrs] vis = v['r'][:] + 1j * v['i'][:] del v gg = f['gain_coeff'][0, frq[0]:frq[-1] + 1, feeds] gain_coeff = gg['r'][:] + 1j * gg['i'][:] vis = vis[..., offp::2] vis = np.transpose(vis, (1, 2, 0)) # Remove fpga gains from data vis = remove_fpga_gains(vis, gain_coeff, nfeed=nfeed, triu=False) # Remove offset from galaxy vis -= 0.5 * (vis[..., 0] + vis[..., -1])[..., np.newaxis] # Get physical freq for fringestopper freq_MHZ = 800.0 - np.array(frq) / 1024.0 * 400. baddies = np.where(np.isnan(tools.get_feed_positions(inp)[:, 0]))[0] a, b, c = select_corrs(baddies, nfeed=128) vis[:, a + b] = 0.0 # Fringestop to location of "src" data_fs = tools.fringestop_pathfinder(vis, eph.transit_RA(times), freq_MHZ, inp, src) del vis dr, sol_arr = solve_gain(data_fs) # Find index of point source transit drlist = np.argmax(dr, axis=-1) # If multiple freq channels are zerod, the trans_pix # will end up being 0. This is bad, so ensure that # you are only looking for non-zero transit pixels. drlist = [x for x in drlist if x != 0] trans_pix = np.argmax(np.bincount(drlist)) assert trans_pix != 0.0 Gains[frq] = sol_arr[..., trans_pix - 3:trans_pix + 4].mean(-1) zz = h5py.File('data' + str(i) + '.hdf5', 'w') zz.create_dataset('data', data=dr) zz.close() print "%f, %d Nans out of %d" % (np.isnan(sol_arr).sum(), np.isnan(Gains[frq]).sum(), np.isnan(Gains[frq]).sum()) print trans_pix, sol_arr[..., trans_pix - 3:trans_pix + 4].mean(-1).sum(), sol_arr.mean(-1).sum() # Plot up post-fs phases to see if everything has been fixed if frq[0] == 12 * nsplit: print "======================" print " Plotting up freq: %d" % frq[0] print "======================" img_nm = './phs_plots/dfs' + np.str(frq[17]) + np.str( np.int(time.time())) + '.png' img_nmcorr = './phs_plots/dfs' + np.str(frq[17]) + np.str( np.int(time.time())) + 'corr.png' plt_gains(data_fs, 0, img_name=img_nm, bad_chans=baddies) dfs_corr = correct_dfs(data_fs, np.angle(Gains[frq])[..., np.newaxis], nfeed=128) plt_gains(dfs_corr, 0, img_name=img_nmcorr, bad_chans=baddies) del dfs_corr del data_fs, a return Gains