如何用Python3的oifits模块筛选指定INSNAME(GRAVITY_SC_P1)数据
问题描述
在OIFitsExplorer中打开.fits文件时可看到对应结构,我希望通过Python3的oifits模块仅获取GRAVITY_SC_P1的数据。当前使用的代码会获取所有四个INSNAME(对应“子目录”)的数据,而非指定的单个数据,请问如何筛选出指定INSNAME的数据?
现有代码
target = "Zeta_Ori" for infile in sys.argv[1:]: obj = oifits.open(infile) obj.info() outfile = os.path.basename(infile).replace("fits", "dat") fout = open("dat_vis/" + outfile, "w") for vis2 in obj.vis2: if vis2.target.target == target: fout.write("# %s\n" % (vis2)) fout.write("# %s\n" % (vis2.target)) t1 = astropy.time.Time(vis2.timeobs, scale='utc', format='datetime') t2 = t1.tdb for i in range(len(vis2.wavelength.eff_wave)): if vis2.vis2data[i] != "--": fout.write("%22.8f %32.16e %32.16e %32.16e %32.16e %32.16e %32.16e %8s\n" % (t2.jd, vis2.ucoord, vis2.vcoord, vis2.wavelength.eff_wave[i], vis2.wavelength.eff_band[i], vis2.vis2data[i], vis2.vis2err[i], str(vis2.station[0])[:2]+str(vis2.station[1])[:2])) fout.close()
解决方案
只需在遍历obj.vis2的判断条件中,增加对INSNAME的匹配即可——OIFITS格式里的INSNAME字段对应vis2对象的insname属性,直接叠加该判断就能过滤出指定仪器的数据。
修改后的代码
import sys import os import astropy.time import oifits target = "Zeta_Ori" target_insname = "GRAVITY_SC_P1" # 定义要筛选的目标INSNAME for infile in sys.argv[1:]: obj = oifits.open(infile) obj.info() outfile = os.path.basename(infile).replace("fits", "dat") fout = open("dat_vis/" + outfile, "w") for vis2 in obj.vis2: # 同时匹配目标天体和指定INSNAME if vis2.target.target == target and vis2.insname == target_insname: fout.write("# %s\n" % (vis2)) fout.write("# %s\n" % (vis2.target)) t1 = astropy.time.Time(vis2.timeobs, scale='utc', format='datetime') t2 = t1.tdb for i in range(len(vis2.wavelength.eff_wave)): if vis2.vis2data[i] != "--": fout.write("%22.8f %32.16e %32.16e %32.16e %32.16e %32.16e %32.16e %8s\n" % (t2.jd, vis2.ucoord, vis2.vcoord, vis2.wavelength.eff_wave[i], vis2.wavelength.eff_band[i], vis2.vis2data[i], vis2.vis2err[i], str(vis2.station[0])[:2]+str(vis2.station[1])[:2])) fout.close()
内容的提问来源于stack exchange,提问作者Elena Greg
相关产品推荐
相关产品推荐

