object_extract_rate.py

import os

import numpy as np
import matplotlib.pyplot as plt
from astropy import units as u
from astropy.coordinates import SkyCoord
from astropy.io import fits, votable
from astropy.wcs import WCS
from astropy.table import Table
from astropy.coordinates import Angle
import pandas as pd
'''
midify time:2021-08-10
verion:V2.0
Note: modify the input file path and name(137rows)
'''
def qurey (acatfile2,wcsfitsfile,refc,newxypanstar,regionpanstar):
    print('----------------------------------------')
    print('obs file:  ',acatfile2)
    # 提取观测数据*3acat文件中恒星数据
    hdu=  fits.open(acatfile2)
    obsdata = hdu[1].data
    obs_ra = obsdata['RA']
    num_obs_star = len(obsdata)
    obs_dec = obsdata['DEC']
    obs_mag = obsdata['VIS_MAG']
    print('obs star:  ', len(obs_ra))
    obsc = SkyCoord(obs_ra, obs_dec, unit=(u.deg, u.deg), frame='fk5')


    # 读取星表数据(ra,dec,mag)
    f = fits.open(wcsfitsfile) #读取wcs信息,将re dec 转换为x y,并写入newxypanstar***.csv中,
    w = WCS(f[0].header)    # 每张图像的WCS不相同,因此有几张图,就生成几个带有x,y坐标的星表
    refdata = Table.read(refc)
    refdata = np.array(refdata)
    print('ref star:  ', len(refdata))
    ref_ra0 = refdata['raMean']
    ref_dec0 = refdata['decMean']
    ref_gmag0 = refdata['gMeanPSFMag']
    ref_rmag0 = refdata['rMeanPSFMag']
    ref_vmag0 = refdata['vMeanPSFMag']
    ref_coord = list(zip(ref_ra0, ref_dec0))
    ref_coord = SkyCoord(ref_coord, frame='fk5', unit='degree')
    c = w.world_to_pixel(ref_coord)
    x0 = c[0]
    y0 = c[1]
    df = pd.DataFrame(
        {'raMean': ref_ra0, 'decMean': ref_dec0, 'gMeanPSFMag': ref_gmag0, 'rMeanPSFMag': ref_rmag0,
         'vMeanPSFMag': ref_vmag0, 'x': x0, 'y': y0})
    df.to_csv(newxypanstar, index=False)

    '''
    读取带有xy坐标的星表,根据xy坐标提取与观测图像区域一致的参考恒星,并将其写入4681***.region.csv中
    '''

    refdata1 = Table.read(newxypanstar)
    x1 = refdata1['x']
    y1 = refdata1['y']
    mask = (x1 < 4076) & (x1 > 20) & (y1 < 4076) & (y1 > 20)
    newrefdata = refdata1[mask]
    print('region ref star',len(newrefdata))

    # 将参考数据的检索范围内的恒星数据提取到*4acat文件中
    ref_ra1 = newrefdata['raMean']
    ref_dec1 = newrefdata['decMean']
    ref_gmag1 = newrefdata['gMeanPSFMag']
    ref_rmag1 = newrefdata['rMeanPSFMag']
    ref_vmag1 = newrefdata['vMeanPSFMag']
    x1 = newrefdata['x']
    y1 = newrefdata['y']
    # print(r1,d1)
    df = pd.DataFrame(
        {'raMean': ref_ra1, 'decMean': ref_dec1, 'gMeanPSFMag': ref_gmag1, 'rMeanPSFMag': ref_rmag1,
         'vMeanPSFMag': ref_vmag1, 'x': x1, 'y': y1})
    # print(df)
    df.to_csv(regionpanstar, index=False)


    '''
    提取公共区域内大于极限星等的参考恒星,与观测数据进行交叉匹配,匹配成功的数量作为提取概率的分子,
    公共区域内大于极限星等的参考恒星数量作为提取概率的分母
    '''
    ls_mag = []
    ls_extractor_rate = []
    ls_false_rate = []
    for mag in range(10, 20, 1):
        ls_mag.append(mag)
        mask3 = (ref_vmag1 < mag)  # 提取星表中大于极限星等的恒星
        # print(type(newrefdata))
        new_refdata = newrefdata[mask3]
        # print(new_refdata)
        new_refdata = np.array(new_refdata)
        denominator = len(new_refdata)
        print('region ref star(refmag<limitmag)fenmu:  ', denominator)

        mask4 =(obs_mag<mag)
        new_obsdata = obsdata[mask4]
        new_obsdata = np.array(new_obsdata)
        num_new_obsstar = len(new_obsdata)  #xiao yu jixian xingdeng de guance hengxing shuliang


        ref_ra = new_refdata['raMean']
        ref_dec = new_refdata['decMean']
        ref_radec = list(zip(ref_ra, ref_dec))
        newrefc = SkyCoord(ref_radec, frame='fk5', unit='degree')


        odd = open('extract_rate.txt', 'a')
        idx1, d2d1, d3d1 = newrefc.match_to_catalog_sky(obsc, nthneighbor=1)
        idindex = []
        for j in range(len(idx1)):
            idindex.append(j)

        uidlim1 = d2d1[idindex].arcsecond < 3
        # print(uidlim1)
        t = []
        for i in range(len(uidlim1)):
            if uidlim1[i] == True:
                t.append(uidlim1[i])
            else:
                i = i + 1
        fenzi = len(t)
        print('region match star(fenzi)', len(t))

        extractor_odds =fenzi/ denominator  # denominator 所在检索区域内星等小于极限星等的参考恒星的数量
        false_odds = abs(num_new_obsstar - fenzi) / denominator
        print(str('%.2f' % extractor_odds) + ' ' + str('%.2f' % false_odds))
        ls_extractor_rate.append(extractor_odds)
        ls_false_rate.append(false_odds)

        odd.write(acatfile2[num:-5] + ' ' + str('%.2f' % extractor_odds) + '(Extraction rate)' + '  ' + str(
            '%.2f' % false_odds) + '(False rate)' +'  limitmag'+str(mag)+ '\n')


    plt.scatter(ls_mag,ls_extractor_rate)
    # plt.scatter(ls_mag,ls_false_rate)
    plt.grid(linewidth = 0.5)
    plt.plot(ls_mag,ls_extractor_rate)
    # plt.plot(ls_mag,ls_false_rate)
    # 设置图表标题,并给坐标轴添加标签
    # plt.title("limit magnitude", fontsize=20)
    plt.ylim(0,1)
    plt.xlabel("Vmag ", fontsize=12)
    plt.ylabel("Probability", fontsize=12)

    # 设置数字标签
    for a, b in zip(ls_mag, ls_extractor_rate):
        plt.text(a, b, '%.2f'%b, ha='center', va='bottom')
    # for c, d in zip(ls_mag, ls_false_rate):
    #     plt.text(c, d, '%.2f'%d, ha='center', va='bottom')
    plt.legend(['Extraction probability','False probability'],loc='lower left')
    # 设置坐标轴刻度标记的大小
    # plt.tick_params(axis='both', labelsize=10)
    # plt.show()
    extractor_png ='extractor_odd'+ acatfile2[0:-5]+'png'
    plt.savefig(extractor_png)
    # plt.show()
    plt.close()
    print('please check result---extractor_odd*png')

cmd = 'ls *2acat >acatfile2.dat'
os.system(cmd)
alist = [line.rstrip()for line in open('acatfile2.dat')]
num = 0
for f in alist:
    acatfile2 = f
    refc = 'panstarr_ali.csv'
    wcsfitsfile = f[0:-6]+'.fits'
    newxypanstar = 'newxypanstar'+acatfile2[num:-6]+'.csv'
    regionpanstar = 'region_panstar'+acatfile2[num:-6] +'.csv'
    qurey(acatfile2,wcsfitsfile,refc,newxypanstar,regionpanstar)

cmd2 = 'rm newxypanstar* region_panstar*'
os.system(cmd2)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值