def make_completeness_table(loga_mag_file, matchup_files, filt_names=None): """ Read in the output of KS2 (post processed with xym2mat and xym2bar) and match it up with the input planted stars. Input --------- loga_mag_file : string The name of the LOGA_MAGS.INPUT.fits file (produced by remake_loga_input() matchup_files : list A list of matchup files that corresponds to the filters in the LOGA file. The matchup files are assumed to be in the same order as the LOGA magnitude columns. """ # Read files loga = atpy.Table(loga_mag_file) mat = [starlists.read_matchup(mat_file) for mat_file in matchup_files] # Figure out the number of filters... make sure the match in input/output num_filt = len(matchup_files) num_filt2 = len(loga.columns) - 3 if num_filt != num_filt2: print('Filter mismatch: {0} in input, {1} in output'.format()) return # First modify the column names in loga to reflect that these are # input values loga.rename_column('x', 'x_in') loga.rename_column('y', 'y_in') for ff in range(num_filt): print('Processing Filter #{0}'.format(ff+1)) if filt_names != None: filt = '_{0}'.format(filt_names[ff]) else: filt = '_{0}'.format(ff+1) # Rename the input magnitude columns old_col_name = 'm{0}'.format(ff+1) new_col_name = 'm_in' + filt loga.rename_column(old_col_name, new_col_name) # Add the new columns to the table for all of the output data. loga.add_column('x_out' + filt, mat[ff].x) loga.add_column('y_out' + filt, mat[ff].y) loga.add_column('m_out' + filt, mat[ff].m) loga.add_column('xe_out' + filt, mat[ff].xe) loga.add_column('ye_out' + filt, mat[ff].ye) loga.add_column('me_out' + filt, mat[ff].me) loga.table_name = '' outfile_name = os.path.dirname(loga_mag_file) + 'completeness_matched.fits' loga.write(outfile_name) return loga
def make_master_lists(): """ Trim the ref5 master lists for each filter down to just stars with proper motions within 1 mas/yr of the cluster motion. """ # Read in matched and aligned star lists from the *.ref5 analysis. # Recall these data sets are in the F814W reference frame with a 50 mas plate scale. print('Loading Data') t2005_814 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F814W.2005.ref5') t2010_125 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F125W.2010.ref5') t2010_139 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F139M.2010.ref5') t2010_160 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F160W.2010.ref5') t2013_160 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F160W.2013.ref5') t2013_160s = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F160Ws.2013.ref5') scale = 50.0 # mas per pixel # Trim down to only those stars that are detected in all epochs. # Also make cuts on astrometric/photometric errors, etc. # We only want the well measured stars in this analysis. perrLim2005 = 3.0 / scale perrLim2010 = 4.0 / scale perrLim2013 = 5.0 / scale merrLim2005 = 0.05 merrLim2010 = 0.1 merrLim2013 = 0.1 print('Trimming Data') cond = ((t2005_814['m'] != 0) & (t2010_125['m'] != 0) & (t2010_139['m'] != 0) & (t2010_160['m'] != 0) & (t2013_160['m'] != 0) & (t2005_814['xe'] < perrLim2005) & (t2005_814['ye'] < perrLim2005) & (t2010_125['xe'] < perrLim2010) & (t2010_125['ye'] < perrLim2010) & (t2010_139['xe'] < perrLim2010) & (t2010_139['ye'] < perrLim2010) & (t2010_160['xe'] < perrLim2010) & (t2010_160['ye'] < perrLim2010) & (t2013_160['xe'] < perrLim2013) & (t2013_160['ye'] < perrLim2013) & (t2005_814['me'] < merrLim2005) & (t2010_125['me'] < merrLim2010) & (t2010_139['me'] < merrLim2010) & (t2010_160['me'] < merrLim2010) & (t2013_160['me'] < merrLim2013)) print(' Cutting down to {0} from {1}'.format(cond.sum(), len(t2005_814))) t2005_814 = t2005_814[cond] t2010_125 = t2010_125[cond] t2010_139 = t2010_139[cond] t2010_160 = t2010_160[cond] t2013_160 = t2013_160[cond] t2013_160s = t2013_160s[cond] # Calculate proper motions print('Calculating velocities') t = np.array([years['2005_F814W'], years['2010_F160W'], years['2013_F160W']]) x = np.array([t2005_814['x'], t2010_160['x'], t2013_160['x']]).T y = np.array([t2005_814['y'], t2010_160['y'], t2013_160['y']]).T xe = np.array([t2005_814['xe'], t2010_160['xe'], t2013_160['xe']]).T ye = np.array([t2005_814['ye'], t2010_160['ye'], t2013_160['ye']]).T def linefit2(time, pos, pos_err): epochs = np.tile(time, (pos_err.shape[1], 1)).T # t_w = epochs / (pos_err ** 2) # p_w = pos / (pos_err ** 2) w = 1.0 / (pos_err ** 2) w_sum = w.sum(axis=0) wxy = (w * epochs * pos).sum(axis=0) wx = (w * epochs).sum(axis=0) wy = (w * pos).sum(axis=0) wxx = (w * epochs ** 2).sum(axis=0) denom = (w_sum * wxx) - (wx ** 2) vel = (w_sum * wxy - wx * wy) / denom pos0 = (wxx * wy - wx * wxy) / denom vel_err = np.sqrt( w_sum / denom ) pos0_err = np.sqrt( wxx / denom ) return pos0, vel, pos0_err, vel_err # Lets set a t0 value: t0 = 2010.0 x0, vx, x0e, vxe = linefit2(t - t0, x.T, xe.T) y0, vy, y0e, vye = linefit2(t - t0, y.T, ye.T) vx *= scale vy *= scale vxe *= scale vye *= scale # Add the velocity fits to the 2005 table t2005_814['vx'] = vx t2005_814['vy'] = vy t2005_814['vxe'] = vxe t2005_814['vye'] = vye # Get rid of stars without velocities good = ((np.isnan(vx) == False) & (np.isnan(vy) == False)) print(' Cutting down to {0} from {1}'.format(good.sum(), len(t2005_814))) t2005_814 = t2005_814[good] t2010_125 = t2010_125[good] t2010_139 = t2010_139[good] t2010_160 = t2010_160[good] t2013_160 = t2013_160[good] t2013_160s = t2013_160s[good] vx = vx[good] vy = vy[good] vxe = vxe[good] vye = vye[good] # Trim down to a 1 mas/yr radius # vx_mean = statsIter.mean(vx, lsigma=4, hsigma=4, iter=10, verbose=True) # vy_mean = statsIter.mean(vy, lsigma=4, hsigma=4, iter=10, verbose=True) vx_mean = 0.0 vy_mean = 0.0 velCut = 0.7 velErrCut = 0.2 # Make a couple of plots to decide on (and show) the cuts py.clf() py.plot(vx, vy, 'k.', alpha=0.2) circ = py.Circle([vx_mean, vy_mean], radius=velCut, color='red', fill=False) py.gca().add_artist(circ) py.xlabel('X Velocity (mas/yr)') py.ylabel('Y Velocity (mas/yr)') py.axis([-2, 2, -2, 2]) py.savefig('plots/make_master_vpd_cuts.png') py.clf() py.plot(t2005_814.m, vxe, 'r.', alpha=0.2, label='X') py.plot(t2005_814.m, vye, 'b.', alpha=0.2, label='Y') py.axhline(velErrCut, color='black') py.xlabel('F814W Magnitude') py.ylabel('Velocity Error (mas/yr)') py.legend() py.savefig('plots/make_master_verr_cuts.png') dv = np.hypot(vx - vx_mean, vy - vy_mean) idx2 = ((dv < velCut) & (vxe < velErrCut) & (vye < velErrCut)) print('Making Velocity Cuts: v < {0:3.1f} mas/yr and verr < {1:3.1f} mas/yr'.format(velCut, velErrCut)) print(' Cutting down to {0} from {1}'.format(idx2.sum(), len(t2005_814))) t2005_814 = t2005_814[idx2] t2010_125 = t2010_125[idx2] t2010_139 = t2010_139[idx2] t2010_160 = t2010_160[idx2] t2013_160 = t2013_160[idx2] t2013_160s = t2013_160s[idx2] _o814_05 = open(workDir + '02.MAT/MASTER.F814W.2005.ref5', 'w') _o125_10 = open(workDir + '02.MAT/MASTER.F125W.2010.ref5', 'w') _o139_10 = open(workDir + '02.MAT/MASTER.F139M.2010.ref5', 'w') _o160_10 = open(workDir + '02.MAT/MASTER.F160W.2010.ref5', 'w') _o160_13 = open(workDir + '02.MAT/MASTER.F160W.2013.ref5', 'w') _o160s_13 = open(workDir + '02.MAT/MASTER.F160Ws.2013.ref5', 'w') ofmt = '{0:10.4f} {1:10.4f} {2:8.4f} {3:10.4f} {4:10.4f} {5:8.4f} {6}\n' for ii in range(len(t2005_814)): _o814_05.write(ofmt.format(t2005_814.x[ii], t2005_814.y[ii], t2005_814.m[ii], t2005_814.xe[ii], t2005_814.ye[ii], t2005_814.me[ii], t2005_814.index[ii])) _o125_10.write(ofmt.format(t2010_125.x[ii], t2010_125.y[ii], t2010_125.m[ii], t2010_125.xe[ii], t2010_125.ye[ii], t2010_125.me[ii], t2010_125.index[ii])) _o139_10.write(ofmt.format(t2010_139.x[ii], t2010_139.y[ii], t2010_139.m[ii], t2010_139.xe[ii], t2010_139.ye[ii], t2010_139.me[ii], t2010_139.index[ii])) _o160_10.write(ofmt.format(t2010_160.x[ii], t2010_160.y[ii], t2010_160.m[ii], t2010_160.xe[ii], t2010_160.ye[ii], t2010_160.me[ii], t2010_160.index[ii])) _o160_13.write(ofmt.format(t2013_160.x[ii], t2013_160.y[ii], t2013_160.m[ii], t2013_160.xe[ii], t2013_160.ye[ii], t2013_160.me[ii], t2013_160.index[ii])) _o160s_13.write(ofmt.format(t2013_160s.x[ii], t2013_160s.y[ii], t2013_160s.m[ii], t2013_160s.xe[ii], t2013_160s.ye[ii], t2013_160s.me[ii], t2013_160s.index[ii])) _o814_05.close() _o125_10.close() _o139_10.close() _o160_10.close() _o160_13.close() _o160s_13.close()
def plot_vpd_across_field(nside=4, interact=False): """ Plot the VPD at different field positions so we can see if there are systematic discrepancies due to residual distortions. """ # Read in matched and aligned star lists from the *.ref5 analysis. # Recall these data sets are in the F814W reference frame with a 50 mas plate scale. t2005 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F814W.ref5') t2010 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F125W.ref5') scale = 50.0 # mas per pixel # Trim down to only those stars that are detected in both epochs. # Also make cuts on astrometric/photometric errors, etc. # We only want the well measured stars in this analysis. perrLim814 = 1.0 / scale perrLim125 = 4.0 / scale merrLim814 = 0.05 merrLim125 = 0.1 cond = ((t2005.m != 0) & (t2010.m != 0) & (t2005.xe < perrLim814) & (t2005.ye < perrLim814) & (t2010.xe < perrLim125) & (t2010.ye < perrLim125) & (t2005.me < merrLim814) & (t2010.me < merrLim125)) t2005 = t2005.where(cond) t2010 = t2010.where(cond) # Calculate proper motions dt = years['2010_F125W'] - years['2005_F814W'] dx = t2010.x - t2005.x dy = t2010.y - t2005.y pmx = dx * scale / dt pmy = dy * scale / dt pm = np.hypot(pmx, pmy) t2005.add_column('pmx', pmx) t2005.add_column('pmy', pmy) t2005.add_column('pm', pm) # Divide up the region into N x N boxes and plot up the VPD for each. xlo = math.floor(t2005.x.min()) xhi = math.ceil(t2005.x.max()) ylo = math.floor(t2005.y.min()) yhi = math.ceil(t2005.y.max()) xboxsize = round((xhi - xlo) / nside) yboxsize = round((yhi - ylo) / nside) # Setup colors jet = py.get_cmap('jet') cNorm = colors.Normalize(vmin=0, vmax=nside**2) colorMap = py.cm.ScalarMappable(norm=cNorm, cmap=jet) # Save the average proper motions in each box pmx = np.zeros((nside, nside), dtype=float) pmy = np.zeros((nside, nside), dtype=float) pmxe = np.zeros((nside, nside), dtype=float) pmye = np.zeros((nside, nside), dtype=float) xcen = np.zeros((nside, nside), dtype=float) ycen = np.zeros((nside, nside), dtype=float) pmCut = 1.0 # Calculate the global mean proper motion # Start by trimming down to a 1 mas/yr radius idx2 = np.where(pm < pmCut)[0] pmx_all = np.median( t2005.pmx[idx2] ) pmy_all = np.median( t2005.pmy[idx2] ) out = 'All X:{0:5.0f}-{1:5.0f} Y:{2:5.0f}-{3:5.0f} ' out += 'PMX:{4:5.2f} +/- {5:5.2f} PMY:{6:5.2f} +/- {7:5.2f} ' out += 'N:{8:5d}' print((out.format(xlo, xhi, ylo, yhi, pmx_all, 0.0, pmy_all, 0.0, len(idx2)))) # Make a global proper motion diagram of star with a proper motion within # 1 mas/yr. This is mainly to see systematic flows due to residual distortion. pmTot = np.hypot(t2005.pmx, t2005.pmy) clust = np.where(pmTot < pmCut)[0] py.clf() q = py.quiver(t2005.x[clust], t2005.y[clust], t2005.pmx[clust], t2005.pmy[clust], scale=18) py.quiverkey(q, 0.5, 0.98, 1, '1 mas/yr', color='red', labelcolor='red') py.xlabel('X Position (pixels)') py.ylabel('Y Position (pixels)') py.xlim(xlo, xhi) py.ylim(ylo, yhi) out = '{0}/plots/vec_proper_motion_all.png' py.savefig(out.format(workDir)) py.clf() for xx in range(nside): for yy in range(nside): xlo_box = xlo + xx * xboxsize ylo_box = ylo + yy * yboxsize xhi_box = xlo + (1+xx) * xboxsize yhi_box = ylo + (1+yy) * yboxsize idx = np.where((t2005.x > xlo_box) & (t2005.x <= xhi_box) & (t2005.y > ylo_box) & (t2005.y <= yhi_box))[0] if interact: color = colorMap.to_rgba(yy + xx * nside) lim = 5 py.plot(t2005.pmx[idx], t2005.pmy[idx], 'k.', ms=2, color=color) py.axis([-lim, lim, -lim, lim]) py.xlabel('X Proper Motion (mas/yr)') py.ylabel('Y Proper Motion (mas/yr)') # Lets get the mean and std-dev (iterative) for the box. # Start by trimming down to a 1 mas/yr circle. idx2 = np.where(t2005.pm[idx] < pmCut)[0] xmean = np.median( t2005.pmx[idx][idx2] ) ymean = np.median( t2005.pmy[idx][idx2] ) xstd = t2005.pmx[idx][idx2].std() ystd = t2005.pmy[idx][idx2].std() xmean_err = xstd / np.sqrt(len(idx2)) ymean_err = ystd / np.sqrt(len(idx2)) xcen[xx, yy] = xlo_box + (xboxsize / 2.0) ycen[xx, yy] = ylo_box + (yboxsize / 2.0) pmx[xx, yy] = xmean - pmx_all pmy[xx, yy] = ymean - pmx_all pmxe[xx, yy] = xmean_err pmye[xx, yy] = ymean_err out = 'Box X:{0:5.0f}-{1:5.0f} Y:{2:5.0f}-{3:5.0f} ' out += 'PMX:{4:5.2f} +/- {5:5.2f} PMY:{6:5.2f} +/- {7:5.2f} ' out += 'N:{8:5d} ' if interact: out += 'Continue?' input(out.format(xlo_box, xhi_box, ylo_box, yhi_box, xmean, xmean_err, ymean, ymean_err, len(idx2))) else: print((out.format(xlo_box, xhi_box, ylo_box, yhi_box, xmean, xmean_err, ymean, ymean_err, len(idx2)))) if interact: out = '{0}/plots/vpd_grid_nside{1}.png' py.savefig(out.format(workDir, nside)) py.clf() q = py.quiver(xcen, ycen, pmx, pmy) py.quiverkey(q, 0.5, 0.98, 0.1, '0.1 mas/yr', color='red', labelcolor='red') py.xlabel('X Position (pixels)') py.ylabel('Y Position (pixels)') py.xlim(xlo, xhi) py.ylim(ylo, yhi) for xx in range(nside+1): py.axvline(xlo + xx * xboxsize, linestyle='--', color='grey') for yy in range(nside+1): py.axhline(ylo + yy * yboxsize, linestyle='--', color='grey') out = '{0}/plots/vec_proper_motion_grid_nside{1}.png' py.savefig(out.format(workDir, nside)) py.clf() q = py.quiver(xcen, ycen, pmx/pmxe, pmy/pmye) py.quiverkey(q, 0.5, 0.98, 3, '3 sigma', color='red', labelcolor='red') py.xlabel('X Position (pixels)') py.ylabel('Y Position (pixels)') py.xlim(xlo, xhi) py.ylim(ylo, yhi) for xx in range(nside+1): py.axvline(xlo + xx * xboxsize, linestyle='--', color='grey') for yy in range(nside+1): py.axhline(ylo + yy * yboxsize, linestyle='--', color='grey') out = '{0}/plots/vec_proper_motion_grid_sig_nside{1}.png' py.savefig(out.format(workDir, nside))
def plot_quiver_one_pass(reread=False): """ Plot a quiver vector plot between F814W in 2005 and F160W in 2010 and 2013. This is just to check that we don't hae any gross flows between the two cameras. """ if reread: t2005 = starlists.read_matchup('MATCHUP.XYMEEE.F814W.2005.ref5') t2010 = starlists.read_matchup('MATCHUP.XYMEEE.F160W.2010.ref5') t2013 = starlists.read_matchup('MATCHUP.XYMEEE.F160W.2013.ref5') t2005.write('MATCHUP.XYMEEE.F814W.2005.ref5.fits') t2010.write('MATCHUP.XYMEEE.F160W.2010.ref5.fits') t2013.write('MATCHUP.XYMEEE.F160W.2013.ref5.fits') else: t2005 = Table.read('MATCHUP.XYMEEE.F814W.2005.ref5.fits') t2010 = Table.read('MATCHUP.XYMEEE.F160W.2010.ref5.fits') t2013 = Table.read('MATCHUP.XYMEEE.F160W.2013.ref5.fits') good = np.where((t2005['m'] < -8) & (t2010['m'] < -8) & (t2013['m'] < -8) & (t2005['xe'] < 0.05) & (t2010['xe'] < 0.05) & (t2013['xe'] < 0.05) & (t2005['ye'] < 0.05) & (t2010['ye'] < 0.05) & (t2013['ye'] < 0.05) & (t2005['me'] < 0.05) & (t2010['me'] < 0.05) & (t2013['me'] < 0.05))[0] g2005 = t2005[good] g2010 = t2010[good] g2013 = t2013[good] dx_05_10 = (g2010['x'] - g2005['x']) * ast.scale['WFC'] * 1e3 dy_05_10 = (g2010['y'] - g2005['y']) * ast.scale['WFC'] * 1e3 dx_05_13 = (g2013['x'] - g2005['x']) * ast.scale['WFC'] * 1e3 dy_05_13 = (g2013['y'] - g2005['y']) * ast.scale['WFC'] * 1e3 dx_10_13 = (g2013['x'] - g2010['x']) * ast.scale['WFC'] * 1e3 dy_10_13 = (g2013['y'] - g2010['y']) * ast.scale['WFC'] * 1e3 small = np.where((np.abs(dx_05_10) < 20) & (np.abs(dy_05_10) < 20) & (np.abs(dx_05_13) < 20) & (np.abs(dy_05_13) < 20) & (np.abs(dx_10_13) < 20) & (np.abs(dy_10_13) < 20))[0] print(len(g2005), len(small), len(dx_05_10)) g2005 = g2005[small] g2010 = g2010[small] g2013 = g2013[small] dx_05_10 = dx_05_10[small] dx_05_13 = dx_05_13[small] dx_10_13 = dx_10_13[small] dy_05_10 = dy_05_10[small] dy_05_13 = dy_05_13[small] dy_10_13 = dy_10_13[small] print(len(g2005), len(small), len(dx_05_10)) py.clf() q = py.quiver(g2005['x'], g2005['y'], dx_05_10, dy_05_10, scale=2e2) py.quiverkey(q, 0.95, 0.95, 5, '5 mas', color='red', labelcolor='red') py.title('2010 - 2005') py.savefig('vec_diff_ref5_05_10.png') py.clf() q = py.quiver(g2005['x'], g2005['y'], dx_05_13, dy_05_13, scale=2e2) py.quiverkey(q, 0.95, 0.95, 5, '5 mas', color='red', labelcolor='red') py.title('2013 - 2005') py.savefig('vec_diff_ref5_05_13.png') py.clf() q = py.quiver(g2005['x'], g2005['y'], dx_10_13, dy_10_13, scale=1e2) py.quiverkey(q, 0.95, 0.95, 5, '5 mas', color='red', labelcolor='red') py.title('2013 - 2010') py.savefig('vec_diff_ref5_10_13.png') py.clf() py.plot(dx_05_10, dy_05_10, 'k.', ms=2) lim = 10 py.axis([-lim, lim, -lim, lim]) py.xlabel('X Proper Motion (mas)') py.ylabel('Y Proper Motion (mas)') py.title('2010 - 2005') py.savefig('pm_diff_ref5_05_10.png') py.clf() py.plot(dx_05_13, dy_05_13, 'k.', ms=2) py.axis([-lim, lim, -lim, lim]) py.xlabel('X Proper Motion (mas)') py.ylabel('Y Proper Motion (mas)') py.title('2013 - 2005') py.savefig('pm_diff_ref5_05_13.png') py.clf() py.plot(dx_10_13, dy_10_13, 'k.', ms=2) py.axis([-lim, lim, -lim, lim]) py.xlabel('X Proper Motion (mas)') py.ylabel('Y Proper Motion (mas)') py.title('2013 - 2010') py.savefig('pm_diff_ref5_10_13.png') print('2010 - 2005') print(' dx = {dx:6.2f} +/- {dxe:6.2f} mas'.format(dx=dx_05_10.mean(), dxe=dx_05_10.std())) print(' dy = {dy:6.2f} +/- {dye:6.2f} mas'.format(dy=dy_05_10.mean(), dye=dy_05_10.std())) print('2013 - 2005') print(' dx = {dx:6.2f} +/- {dxe:6.2f} mas'.format(dx=dx_05_13.mean(), dxe=dx_05_13.std())) print(' dy = {dy:6.2f} +/- {dye:6.2f} mas'.format(dy=dy_05_13.mean(), dye=dy_05_13.std())) print('2013 - 2010') print(' dx = {dx:6.2f} +/- {dxe:6.2f} mas'.format(dx=dx_10_13.mean(), dxe=dx_10_13.std())) print(' dy = {dy:6.2f} +/- {dye:6.2f} mas'.format(dy=dy_10_13.mean(), dye=dy_10_13.std()))
def make_master_lists(): """ Trim the ref5 master lists for each filter down to just stars with proper motions within 1 mas/yr of the cluster motion. """ # Read in matched and aligned star lists from the *.ref5 analysis. # Recall these data sets are in the F814W reference frame with a 50 mas plate scale. t2005_814 = starlists.read_matchup(workDir + '02.PMA/MATCHUP.XYMEEE.F814W.ref5') t2010_125 = starlists.read_matchup(workDir + '02.PMA/MATCHUP.XYMEEE.F125W.ref5') t2010_139 = starlists.read_matchup(workDir + '02.PMA/MATCHUP.XYMEEE.F139M.ref5') t2010_160 = starlists.read_matchup(workDir + '02.PMA/MATCHUP.XYMEEE.F160W.ref5') scale = 50.0 # mas per pixel # Trim down to only those stars that are detected in both epochs. # Also make cuts on astrometric/photometric errors, etc. # We only want the well measured stars in this analysis. perrLim814 = 1.0 / scale perrLim125 = 4.0 / scale merrLim814 = 0.05 merrLim125 = 0.1 cond = ((t2005_814.m != 0) & (t2010_125.m != 0) & (t2010_139.m != 0) & (t2010_160.m != 0) & (t2005_814.xe < perrLim814) & (t2005_814.ye < perrLim814) & (t2010_125.xe < perrLim125) & (t2010_125.ye < perrLim125) & (t2010_139.xe < perrLim125) & (t2010_139.ye < perrLim125) & (t2010_160.xe < perrLim125) & (t2010_160.ye < perrLim125) & (t2005_814.me < merrLim814) & (t2010_125.me < merrLim125) & (t2010_139.me < merrLim125) & (t2010_160.me < merrLim125)) t2005_814 = t2005_814.where(cond) t2010_125 = t2010_125.where(cond) t2010_139 = t2010_139.where(cond) t2010_160 = t2010_160.where(cond) # Calculate proper motions dt = years['2010_F125W'] - years['2005_F814W'] dx = t2010_125.x - t2005_814.x dy = t2010_125.y - t2005_814.y pmx = dx * scale / dt pmy = dy * scale / dt pm = np.hypot(pmx, pmy) t2005_814.add_column('pmx', pmx) t2005_814.add_column('pmy', pmy) t2005_814.add_column('pm', pm) # Trim down to a 1 mas/yr radius pmCut = 1.0 idx2 = np.where(pm < pmCut)[0] t2005_814 = t2005_814.where(idx2) t2010_125 = t2010_125.where(idx2) t2010_139 = t2010_139.where(idx2) t2010_160 = t2010_160.where(idx2) _o814 = open(workDir + '02.PMA/MASTER.F814W.ref5', 'w') _o125 = open(workDir + '02.PMA/MASTER.F125W.ref5', 'w') _o139 = open(workDir + '02.PMA/MASTER.F139M.ref5', 'w') _o160 = open(workDir + '02.PMA/MASTER.F160W.ref5', 'w') ofmt = '{0:10.4f} {1:10.4f} {2:8.4f} {3:10.4f} {4:10.4f} {5:8.4f} {6}\n' for ii in range(len(t2005_814)): _o814.write(ofmt.format(t2005_814.x[ii], t2005_814.y[ii], t2005_814.m[ii], t2005_814.xe[ii], t2005_814.ye[ii], t2005_814.me[ii], t2005_814.name[ii])) _o125.write(ofmt.format(t2010_125.x[ii], t2010_125.y[ii], t2010_125.m[ii], t2010_125.xe[ii], t2010_125.ye[ii], t2010_125.me[ii], t2010_125.name[ii])) _o139.write(ofmt.format(t2010_139.x[ii], t2010_139.y[ii], t2010_139.m[ii], t2010_139.xe[ii], t2010_139.ye[ii], t2010_139.me[ii], t2010_139.name[ii])) _o160.write(ofmt.format(t2010_160.x[ii], t2010_160.y[ii], t2010_160.m[ii], t2010_160.xe[ii], t2010_160.ye[ii], t2010_160.me[ii], t2010_160.name[ii])) _o814.close() _o125.close() _o139.close() _o160.close()
def plot_vpd_across_field(nside=4, interact=False): """ Plot the VPD at different field positions so we can see if there are systematic discrepancies due to residual distortions. """ # Read in matched and aligned star lists from the *.ref5 analysis. # Recall these data sets are in the F814W reference frame with a 50 mas plate scale. t2005 = starlists.read_matchup(workDir + '02.PMA/MATCHUP.XYMEEE.F814W.ref5') t2010 = starlists.read_matchup(workDir + '02.PMA/MATCHUP.XYMEEE.F125W.ref5') scale = 50.0 # mas per pixel # Trim down to only those stars that are detected in both epochs. # Also make cuts on astrometric/photometric errors, etc. # We only want the well measured stars in this analysis. perrLim814 = 1.0 / scale perrLim125 = 4.0 / scale merrLim814 = 0.05 merrLim125 = 0.1 cond = ((t2005.m != 0) & (t2010.m != 0) & (t2005.xe < perrLim814) & (t2005.ye < perrLim814) & (t2010.xe < perrLim125) & (t2010.ye < perrLim125) & (t2005.me < merrLim814) & (t2010.me < merrLim125)) t2005 = t2005.where(cond) t2010 = t2010.where(cond) # Calculate proper motions dt = years['2010_F125W'] - years['2005_F814W'] dx = t2010.x - t2005.x dy = t2010.y - t2005.y pmx = dx * scale / dt pmy = dy * scale / dt pm = np.hypot(pmx, pmy) t2005.add_column('pmx', pmx) t2005.add_column('pmy', pmy) t2005.add_column('pm', pm) # Divide up the region into N x N boxes and plot up the VPD for each. xlo = math.floor(t2005.x.min()) xhi = math.ceil(t2005.x.max()) ylo = math.floor(t2005.y.min()) yhi = math.ceil(t2005.y.max()) xboxsize = round((xhi - xlo) / nside) yboxsize = round((yhi - ylo) / nside) # Setup colors jet = py.get_cmap('jet') cNorm = colors.Normalize(vmin=0, vmax=nside**2) colorMap = py.cm.ScalarMappable(norm=cNorm, cmap=jet) # Save the average proper motions in each box pmx = np.zeros((nside, nside), dtype=float) pmy = np.zeros((nside, nside), dtype=float) pmxe = np.zeros((nside, nside), dtype=float) pmye = np.zeros((nside, nside), dtype=float) xcen = np.zeros((nside, nside), dtype=float) ycen = np.zeros((nside, nside), dtype=float) pmCut = 1.0 # Calculate the global mean proper motion # Start by trimming down to a 1 mas/yr radius idx2 = np.where(pm < pmCut)[0] pmx_all = np.median( t2005.pmx[idx2] ) pmy_all = np.median( t2005.pmy[idx2] ) out = 'All X:{0:5.0f}-{1:5.0f} Y:{2:5.0f}-{3:5.0f} ' out += 'PMX:{4:5.2f} +/- {5:5.2f} PMY:{6:5.2f} +/- {7:5.2f} ' out += 'N:{8:5d}' print((out.format(xlo, xhi, ylo, yhi, pmx_all, 0.0, pmy_all, 0.0, len(idx2)))) # Make a global proper motion diagram of star with a proper motion within # 1 mas/yr. This is mainly to see systematic flows due to residual distortion. pmTot = np.hypot(t2005.pmx, t2005.pmy) clust = np.where(pmTot < pmCut)[0] py.clf() q = py.quiver(t2005.x[clust], t2005.y[clust], t2005.pmx[clust], t2005.pmy[clust], scale=18) py.quiverkey(q, 0.5, 0.98, 1, '1 mas/yr', color='red', labelcolor='red') py.xlabel('X Position (pixels)') py.ylabel('Y Position (pixels)') py.xlim(xlo, xhi) py.ylim(ylo, yhi) out = '{0}/plots/vec_proper_motion_all.png' py.savefig(out.format(workDir)) py.clf() for xx in range(nside): for yy in range(nside): xlo_box = xlo + xx * xboxsize ylo_box = ylo + yy * yboxsize xhi_box = xlo + (1+xx) * xboxsize yhi_box = ylo + (1+yy) * yboxsize idx = np.where((t2005.x > xlo_box) & (t2005.x <= xhi_box) & (t2005.y > ylo_box) & (t2005.y <= yhi_box))[0] if interact: color = colorMap.to_rgba(yy + xx * nside) lim = 5 py.plot(t2005.pmx[idx], t2005.pmy[idx], 'k.', ms=2, color=color) py.axis([-lim, lim, -lim, lim]) py.xlabel('X Proper Motion (mas/yr)') py.ylabel('Y Proper Motion (mas/yr)') # Lets get the mean and std-dev (iterative) for the box. # Start by trimming down to a 1 mas/yr circle. idx2 = np.where(t2005.pm[idx] < pmCut)[0] xmean = np.median( t2005.pmx[idx][idx2] ) ymean = np.median( t2005.pmy[idx][idx2] ) xstd = t2005.pmx[idx][idx2].std() ystd = t2005.pmy[idx][idx2].std() xmean_err = xstd / np.sqrt(len(idx2)) ymean_err = ystd / np.sqrt(len(idx2)) xcen[xx, yy] = xlo_box + (xboxsize / 2.0) ycen[xx, yy] = ylo_box + (yboxsize / 2.0) pmx[xx, yy] = xmean - pmx_all pmy[xx, yy] = ymean - pmx_all pmxe[xx, yy] = xmean_err pmye[xx, yy] = ymean_err out = 'Box X:{0:5.0f}-{1:5.0f} Y:{2:5.0f}-{3:5.0f} ' out += 'PMX:{4:5.2f} +/- {5:5.2f} PMY:{6:5.2f} +/- {7:5.2f} ' out += 'N:{8:5d} ' if interact: out += 'Continue?' input(out.format(xlo_box, xhi_box, ylo_box, yhi_box, xmean, xmean_err, ymean, ymean_err, len(idx2))) else: print((out.format(xlo_box, xhi_box, ylo_box, yhi_box, xmean, xmean_err, ymean, ymean_err, len(idx2)))) if interact: out = '{0}/plots/vpd_grid_nside{1}.png' py.savefig(out.format(workDir, nside)) py.clf() q = py.quiver(xcen, ycen, pmx, pmy) py.quiverkey(q, 0.5, 0.98, 0.1, '0.1 mas/yr', color='red', labelcolor='red') py.xlabel('X Position (pixels)') py.ylabel('Y Position (pixels)') py.xlim(xlo, xhi) py.ylim(ylo, yhi) for xx in range(nside+1): py.axvline(xlo + xx * xboxsize, linestyle='--', color='grey') for yy in range(nside+1): py.axhline(ylo + yy * yboxsize, linestyle='--', color='grey') out = '{0}/plots/vec_proper_motion_grid_nside{1}.png' py.savefig(out.format(workDir, nside)) py.clf() q = py.quiver(xcen, ycen, pmx/pmxe, pmy/pmye) py.quiverkey(q, 0.5, 0.98, 3, '3 sigma', color='red', labelcolor='red') py.xlabel('X Position (pixels)') py.ylabel('Y Position (pixels)') py.xlim(xlo, xhi) py.ylim(ylo, yhi) for xx in range(nside+1): py.axvline(xlo + xx * xboxsize, linestyle='--', color='grey') for yy in range(nside+1): py.axhline(ylo + yy * yboxsize, linestyle='--', color='grey') out = '{0}/plots/vec_proper_motion_grid_sig_nside{1}.png' py.savefig(out.format(workDir, nside))
def plot_quiver_one_pass(reread=False): """ Plot a quiver vector plot between F814W in 2005 and F160W in 2010 and 2013. This is just to check that we don't hae any gross flows between the two cameras. """ if reread: t2005 = starlists.read_matchup('MATCHUP.XYMEEE.F814W.ref5') t2010 = starlists.read_matchup('MATCHUP.XYMEEE.F160W.2010.ref5') t2013 = starlists.read_matchup('MATCHUP.XYMEEE.F160W.2013.ref5') t2005.write('MATCHUP.XYMEEE.F814W.ref5.fits') t2010.write('MATCHUP.XYMEEE.F160W.2010.ref5.fits') t2013.write('MATCHUP.XYMEEE.F160W.2013.ref5.fits') else: t2005 = Table.read('MATCHUP.XYMEEE.F814W.ref5.fits') t2010 = Table.read('MATCHUP.XYMEEE.F160W.2010.ref5.fits') t2013 = Table.read('MATCHUP.XYMEEE.F160W.2013.ref5.fits') good = np.where((t2005['m'] < -8) & (t2010['m'] < -8) & (t2013['m'] < -8) & (t2005['xe'] < 0.05) & (t2010['xe'] < 0.05) & (t2013['xe'] < 0.05) & (t2005['ye'] < 0.05) & (t2010['ye'] < 0.05) & (t2013['ye'] < 0.05) & (t2005['me'] < 0.05) & (t2010['me'] < 0.05) & (t2013['me'] < 0.05))[0] g2005 = t2005[good] g2010 = t2010[good] g2013 = t2013[good] dx_05_10 = (g2010['x'] - g2005['x']) * ast.scale['WFC'] * 1e3 dy_05_10 = (g2010['y'] - g2005['y']) * ast.scale['WFC'] * 1e3 dx_05_13 = (g2013['x'] - g2005['x']) * ast.scale['WFC'] * 1e3 dy_05_13 = (g2013['y'] - g2005['y']) * ast.scale['WFC'] * 1e3 dx_10_13 = (g2013['x'] - g2010['x']) * ast.scale['WFC'] * 1e3 dy_10_13 = (g2013['y'] - g2010['y']) * ast.scale['WFC'] * 1e3 small = np.where((np.abs(dx_05_10) < 20) & (np.abs(dy_05_10) < 20) & (np.abs(dx_05_13) < 20) & (np.abs(dy_05_13) < 20) & (np.abs(dx_10_13) < 20) & (np.abs(dy_10_13) < 20))[0] print(len(g2005), len(small), len(dx_05_10)) g2005 = g2005[small] g2010 = g2010[small] g2013 = g2013[small] dx_05_10 = dx_05_10[small] dx_05_13 = dx_05_13[small] dx_10_13 = dx_10_13[small] dy_05_10 = dy_05_10[small] dy_05_13 = dy_05_13[small] dy_10_13 = dy_10_13[small] print(len(g2005), len(small), len(dx_05_10)) py.clf() q = py.quiver(g2005['x'], g2005['y'], dx_05_10, dy_05_10, scale=2e2) py.quiverkey(q, 0.95, 0.95, 5, '5 mas', color='red', labelcolor='red') py.title('2010 - 2005') py.savefig('vec_diff_ref5_05_10.png') py.clf() q = py.quiver(g2005['x'], g2005['y'], dx_05_13, dy_05_13, scale=2e2) py.quiverkey(q, 0.95, 0.95, 5, '5 mas', color='red', labelcolor='red') py.title('2013 - 2005') py.savefig('vec_diff_ref5_05_13.png') py.clf() q = py.quiver(g2005['x'], g2005['y'], dx_10_13, dy_10_13, scale=1e2) py.quiverkey(q, 0.95, 0.95, 5, '5 mas', color='red', labelcolor='red') py.title('2013 - 2010') py.savefig('vec_diff_ref5_10_13.png') py.clf() py.plot(dx_05_10, dy_05_10, 'k.', ms=2) lim = 10 py.axis([-lim, lim, -lim, lim]) py.xlabel('X Proper Motion (mas)') py.ylabel('Y Proper Motion (mas)') py.title('2010 - 2005') py.savefig('pm_diff_ref5_05_10.png') py.clf() py.plot(dx_05_13, dy_05_13, 'k.', ms=2) py.axis([-lim, lim, -lim, lim]) py.xlabel('X Proper Motion (mas)') py.ylabel('Y Proper Motion (mas)') py.title('2013 - 2005') py.savefig('pm_diff_ref5_05_13.png') py.clf() py.plot(dx_10_13, dy_10_13, 'k.', ms=2) py.axis([-lim, lim, -lim, lim]) py.xlabel('X Proper Motion (mas)') py.ylabel('Y Proper Motion (mas)') py.title('2013 - 2010') py.savefig('pm_diff_ref5_10_13.png') print('2010 - 2005') print(' dx = {dx:6.2f} +/- {dxe:6.2f} mas'.format(dx=dx_05_10.mean(), dxe=dx_05_10.std())) print(' dy = {dy:6.2f} +/- {dye:6.2f} mas'.format(dy=dy_05_10.mean(), dye=dy_05_10.std())) print('2013 - 2005') print(' dx = {dx:6.2f} +/- {dxe:6.2f} mas'.format(dx=dx_05_13.mean(), dxe=dx_05_13.std())) print(' dy = {dy:6.2f} +/- {dye:6.2f} mas'.format(dy=dy_05_13.mean(), dye=dy_05_13.std())) print('2013 - 2010') print(' dx = {dx:6.2f} +/- {dxe:6.2f} mas'.format(dx=dx_10_13.mean(), dxe=dx_10_13.std())) print(' dy = {dy:6.2f} +/- {dye:6.2f} mas'.format(dy=dy_10_13.mean(), dye=dy_10_13.std()))
def make_master_lists(): """ Trim the ref5 master lists for each filter down to just stars with proper motions within 1 mas/yr of the cluster motion. """ # Read in matched and aligned star lists from the *.ref5 analysis. # Recall these data sets are in the F814W reference frame with a 50 mas plate scale. print('Loading Data') t2005_814 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F814W.2005.ref5') t2010_125 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F125W.2010.ref5') t2010_139 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F139M.2010.ref5') t2010_160 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F160W.2010.ref5') t2013_160 = starlists.read_matchup(workDir + '02.MAT/MATCHUP.XYMEEE.F160W.2013.ref5') t2013_160s = starlists.read_matchup( workDir + '02.MAT/MATCHUP.XYMEEE.F160Ws.2013.ref5') scale = 50.0 # mas per pixel # Trim down to only those stars that are detected in all epochs. # Also make cuts on astrometric/photometric errors, etc. # We only want the well measured stars in this analysis. perrLim2005 = 3.0 / scale perrLim2010 = 4.0 / scale perrLim2013 = 5.0 / scale merrLim2005 = 0.05 merrLim2010 = 0.1 merrLim2013 = 0.1 print('Trimming Data') cond = ((t2005_814['m'] != 0) & (t2010_125['m'] != 0) & (t2010_139['m'] != 0) & (t2010_160['m'] != 0) & (t2013_160['m'] != 0) & (t2005_814['xe'] < perrLim2005) & (t2005_814['ye'] < perrLim2005) & (t2010_125['xe'] < perrLim2010) & (t2010_125['ye'] < perrLim2010) & (t2010_139['xe'] < perrLim2010) & (t2010_139['ye'] < perrLim2010) & (t2010_160['xe'] < perrLim2010) & (t2010_160['ye'] < perrLim2010) & (t2013_160['xe'] < perrLim2013) & (t2013_160['ye'] < perrLim2013) & (t2005_814['me'] < merrLim2005) & (t2010_125['me'] < merrLim2010) & (t2010_139['me'] < merrLim2010) & (t2010_160['me'] < merrLim2010) & (t2013_160['me'] < merrLim2013)) print(' Cutting down to {0} from {1}'.format(cond.sum(), len(t2005_814))) t2005_814 = t2005_814[cond] t2010_125 = t2010_125[cond] t2010_139 = t2010_139[cond] t2010_160 = t2010_160[cond] t2013_160 = t2013_160[cond] t2013_160s = t2013_160s[cond] # Calculate proper motions print('Calculating velocities') t = np.array( [years['2005_F814W'], years['2010_F160W'], years['2013_F160W']]) x = np.array([t2005_814['x'], t2010_160['x'], t2013_160['x']]).T y = np.array([t2005_814['y'], t2010_160['y'], t2013_160['y']]).T xe = np.array([t2005_814['xe'], t2010_160['xe'], t2013_160['xe']]).T ye = np.array([t2005_814['ye'], t2010_160['ye'], t2013_160['ye']]).T def linefit2(time, pos, pos_err): epochs = np.tile(time, (pos_err.shape[1], 1)).T # t_w = epochs / (pos_err ** 2) # p_w = pos / (pos_err ** 2) w = 1.0 / (pos_err**2) w_sum = w.sum(axis=0) wxy = (w * epochs * pos).sum(axis=0) wx = (w * epochs).sum(axis=0) wy = (w * pos).sum(axis=0) wxx = (w * epochs**2).sum(axis=0) denom = (w_sum * wxx) - (wx**2) vel = (w_sum * wxy - wx * wy) / denom pos0 = (wxx * wy - wx * wxy) / denom vel_err = np.sqrt(w_sum / denom) pos0_err = np.sqrt(wxx / denom) return pos0, vel, pos0_err, vel_err # Lets set a t0 value: t0 = 2010.0 x0, vx, x0e, vxe = linefit2(t - t0, x.T, xe.T) y0, vy, y0e, vye = linefit2(t - t0, y.T, ye.T) vx *= scale vy *= scale vxe *= scale vye *= scale # Add the velocity fits to the 2005 table t2005_814['vx'] = vx t2005_814['vy'] = vy t2005_814['vxe'] = vxe t2005_814['vye'] = vye # Get rid of stars without velocities good = ((np.isnan(vx) == False) & (np.isnan(vy) == False)) print(' Cutting down to {0} from {1}'.format(good.sum(), len(t2005_814))) t2005_814 = t2005_814[good] t2010_125 = t2010_125[good] t2010_139 = t2010_139[good] t2010_160 = t2010_160[good] t2013_160 = t2013_160[good] t2013_160s = t2013_160s[good] vx = vx[good] vy = vy[good] vxe = vxe[good] vye = vye[good] # Trim down to a 1 mas/yr radius # vx_mean = statsIter.mean(vx, lsigma=4, hsigma=4, iter=10, verbose=True) # vy_mean = statsIter.mean(vy, lsigma=4, hsigma=4, iter=10, verbose=True) vx_mean = 0.0 vy_mean = 0.0 velCut = 0.7 velErrCut = 0.2 # Make a couple of plots to decide on (and show) the cuts py.clf() py.plot(vx, vy, 'k.', alpha=0.2) circ = py.Circle([vx_mean, vy_mean], radius=velCut, color='red', fill=False) py.gca().add_artist(circ) py.xlabel('X Velocity (mas/yr)') py.ylabel('Y Velocity (mas/yr)') py.axis([-2, 2, -2, 2]) py.savefig('plots/make_master_vpd_cuts.png') py.clf() py.plot(t2005_814.m, vxe, 'r.', alpha=0.2, label='X') py.plot(t2005_814.m, vye, 'b.', alpha=0.2, label='Y') py.axhline(velErrCut, color='black') py.xlabel('F814W Magnitude') py.ylabel('Velocity Error (mas/yr)') py.legend() py.savefig('plots/make_master_verr_cuts.png') dv = np.hypot(vx - vx_mean, vy - vy_mean) idx2 = ((dv < velCut) & (vxe < velErrCut) & (vye < velErrCut)) print( 'Making Velocity Cuts: v < {0:3.1f} mas/yr and verr < {1:3.1f} mas/yr'. format(velCut, velErrCut)) print(' Cutting down to {0} from {1}'.format(idx2.sum(), len(t2005_814))) t2005_814 = t2005_814[idx2] t2010_125 = t2010_125[idx2] t2010_139 = t2010_139[idx2] t2010_160 = t2010_160[idx2] t2013_160 = t2013_160[idx2] t2013_160s = t2013_160s[idx2] _o814_05 = open(workDir + '02.MAT/MASTER.F814W.2005.ref5', 'w') _o125_10 = open(workDir + '02.MAT/MASTER.F125W.2010.ref5', 'w') _o139_10 = open(workDir + '02.MAT/MASTER.F139M.2010.ref5', 'w') _o160_10 = open(workDir + '02.MAT/MASTER.F160W.2010.ref5', 'w') _o160_13 = open(workDir + '02.MAT/MASTER.F160W.2013.ref5', 'w') _o160s_13 = open(workDir + '02.MAT/MASTER.F160Ws.2013.ref5', 'w') ofmt = '{0:10.4f} {1:10.4f} {2:8.4f} {3:10.4f} {4:10.4f} {5:8.4f} {6}\n' for ii in range(len(t2005_814)): _o814_05.write( ofmt.format(t2005_814.x[ii], t2005_814.y[ii], t2005_814.m[ii], t2005_814.xe[ii], t2005_814.ye[ii], t2005_814.me[ii], t2005_814.index[ii])) _o125_10.write( ofmt.format(t2010_125.x[ii], t2010_125.y[ii], t2010_125.m[ii], t2010_125.xe[ii], t2010_125.ye[ii], t2010_125.me[ii], t2010_125.index[ii])) _o139_10.write( ofmt.format(t2010_139.x[ii], t2010_139.y[ii], t2010_139.m[ii], t2010_139.xe[ii], t2010_139.ye[ii], t2010_139.me[ii], t2010_139.index[ii])) _o160_10.write( ofmt.format(t2010_160.x[ii], t2010_160.y[ii], t2010_160.m[ii], t2010_160.xe[ii], t2010_160.ye[ii], t2010_160.me[ii], t2010_160.index[ii])) _o160_13.write( ofmt.format(t2013_160.x[ii], t2013_160.y[ii], t2013_160.m[ii], t2013_160.xe[ii], t2013_160.ye[ii], t2013_160.me[ii], t2013_160.index[ii])) _o160s_13.write( ofmt.format(t2013_160s.x[ii], t2013_160s.y[ii], t2013_160s.m[ii], t2013_160s.xe[ii], t2013_160s.ye[ii], t2013_160s.me[ii], t2013_160s.index[ii])) _o814_05.close() _o125_10.close() _o139_10.close() _o160_10.close() _o160_13.close() _o160s_13.close()