srg/heasarc/management/commands/00_heasarc_match_gaia3.py
2024-04-25 17:50:51 +03:00

126 lines
4.0 KiB
Python

from django.core.management.base import BaseCommand, CommandError
from django.core.paginator import Paginator
from astropy_healpix import HEALPix
from astropy.coordinates import SkyCoord # High-level coordinates
from astropy.coordinates import ICRS, Galactic, FK4, FK5 # Low-level frames
from astropy.coordinates import Angle, Latitude, Longitude # Angles
import astropy.units as u
from multiprocessing import Pool, cpu_count
from datetime import date
import datetime
import time
from django.utils import timezone
import astropy
from astropy.io import ascii
import pandas as pd
import pymysql
from sqlalchemy import create_engine
from heasarc.models import HeasarcBase
from artsurvey.models import ArtSurveySource, ArtSurvey
from srglib.utils import load_vizier_nvss
from srglib.utils import load_vizier_first
from srglib.utils import load_vizier_sumss
from astrobasis.models import GAIADR3
from astrobasis.models import GLIMPSE
from srglib.utils import find_counterparts
from srglib.utils import load_vizier_allwise
from srglib.utils import load_simbad_for_skymap_sources
from heasarc.models import NSIDE_SOURCES, ORDER
NPARTS=10
def do_match():
minrad=5
maxdist=30
hp = HEALPix(nside=NSIDE_SOURCES, order=ORDER, frame=FK5())
"""
g=GLIMPSE.objects.all()
g2=g.filter(healpix__exact=0)
print("Total {} healpix=NULL {}".format(g.count(),g2.count()))
print(g2[0].ra,g2[0].dec,g2[0].healpix)
return
"""
srcs = HeasarcBase.objects.all().filter(error_radius__lte=minrad)#.order_by("-id")
pages = Paginator(srcs, 100000)
pages_count = pages.count
pages_num = pages.num_pages
pages_range = pages.page_range
gaia3_all = GAIADR3.objects.all()
for i in pages_range:
page = pages.page(i)
start_time0 = time.time()
for src in page.object_list:
crd = SkyCoord(src.ra, src.dec, frame="fk5", unit="deg")
heal = hp.cone_search_skycoord(crd, radius=maxdist*u.arcsecond)
src.gaia3.clear()
try:
gaia3_all_cone = gaia3_all.filter(healpix__in=heal)
except:
continue
gaia_list=[]
gaia_crd_cone = SkyCoord(gaia3_all_cone.values_list('ra', flat=True),
gaia3_all_cone.values_list('dec', flat=True),
frame="fk5", unit="deg")
sep_cone = crd.separation(gaia_crd_cone).arcsecond
isel = (sep_cone <= minrad)
index=0
for gaia in gaia3_all_cone:
#gaia_crd = SkyCoord(gaia.ra, gaia.dec, frame="fk5", unit="deg")
#sep=crd.separation(gaia_crd).arcsecond
if(isel[index]):
gaia_list.append(gaia)
index=index+1
if(gaia_list):
src.gaia3.add(*gaia_list)
elapsed = time.time() - start_time0
estimated = (elapsed*(pages_num-i))/60/60
print("Page {}/{} for {:.2f} sec, est. {:.2f} hours".format(i,pages_num,elapsed,estimated))
#load_simbad_for_skymap_sources(srcs,minrad=minrad,maxdist=maxdist)
#load_vizier_allwise(srcs, minrad=minrad, maxdist=maxdist)
#load_vizier_nvss(srcs, minrad=minrad, maxdist=maxdist)
#load_vizier_first(srcs, minrad=minrad, maxdist=maxdist)
#load_vizier_sumss(srcs, minrad=minrad, maxdist=maxdist)
#find_counterparts(srcs, GAIADR3.objects.all(), "gaia3", maxdist=maxdist, minrad=minrad)
#for src in srcs:
# src.heasarc.clear()
#find_counterparts(srcs, GAIADR3.objects.all(),'gaia3', maxdist=maxdist, minrad=minrad)
#find_counterparts(srcs, GLIMPSE.objects.all(),'glimpse', maxdist=maxdist, minrad=minrad)
class Command(BaseCommand):
help = 'Initiates data dase'
def handle(self, *args, **options):
start_time = time.time()
do_match()
hours = (time.time() - start_time)/60/60
print("--- {:.2f} hours ---".format(hours))
self.stdout.write(self.style.SUCCESS('Done'))