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

140 lines
6.1 KiB
Python

from django.core.management.base import BaseCommand, CommandError
from datetime import date
from heasarc.models import INPUT_DATA_DIR
import datetime
from django.utils import timezone
import astropy
from astropy.io import ascii
import pandas as pd
import pymysql
from sqlalchemy import create_engine
import numpy.ma as ma
from heasarc.tdat import tDat
from heasarc.models import HeasarcTable, TableColumn, HeasarcCSC, HeasarcObjectClass
from heasarc.models import NSIDE_SOURCES, ORDER
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
def load_heasarc_table(filename):
tdatfile=INPUT_DATA_DIR+'/dump/'+filename
data = astropy.table.Table.read(tdatfile, format='ascii.tdat',encoding='latin1')
keywords = data.meta['keywords']
for key, value in keywords.items():
print(key, '->', value)
try:
table=HeasarcTable.objects.get(name__exact=keywords['table_name'])
table.delete()
except:
pass
table_name=keywords['table_name']
table = HeasarcTable(name=keywords['table_name'])
table.description=keywords['table_description'].replace('\"', '')
table.document_url=keywords['table_document_url']
if 'default_search_radius' in keywords:
table.search_radius=int(keywords['default_search_radius'])
if 'frequency_regime' in keywords:
table.frequency_regime=keywords['frequency_regime']
table.observatory_name=keywords['observatory_name']
table.security=keywords['table_security']
if 'table_author' in keywords:
table.author=keywords['table_author']
if 'catalog_bibcode' in keywords:
table.bibcode=keywords['catalog_bibcode']
if 'declination' in keywords:
table.declination=keywords['declination'].replace('@', '')
if 'right_ascension' in keywords:
table.right_ascension=keywords['right_ascension'].replace('@', '')
table.observatory_name = keywords['observatory_name']
if 'parameter_defaults' in keywords:
table.parameter_defaults = keywords['parameter_defaults']
table.save()
cols = data.meta['cols']
for key, value in cols.items():
column = TableColumn(table=table)
column.name=key
column.tdat_type=value['type']
column.description=value['description']
column.save()
print(key, '->', value)
# convert data frame to pandas
# df = data.to_pandas()
# sql = 'DROP TABLE IF EXISTS '+table_name+';'
# result = engine.execute(sql)
# Insert whole DataFrame into MySQL
# df.to_sql(table_name, con = engine, if_exists = 'append', chunksize = 200000)
tables = HeasarcCSC.objects.all()
tables.delete()
hp = HEALPix(nside=NSIDE_SOURCES, order=ORDER, frame=FK5())
for item in data:
#crd = SkyCoord(item['ra'], item['dec'], frame=FK5(), unit="deg")
#healpix = hp.skycoord_to_healpix(crd)
conf_flag=''
if(item['conf_flag'] == 'NULL'):
conf_flag = 'N'
healpix = 0
ra = 0.0
dec = 0.0
if not (ma.is_masked(item['ra']) or ma.is_masked(item['dec'])):
ra = float(item['ra'])
dec = float(item['dec'])
crd = SkyCoord(ra, dec, frame=FK5(), unit="deg")
healpix = hp.skycoord_to_healpix(crd)
obj = HeasarcCSC.objects.create(healpix=healpix,
ra=ra,
dec=dec,
lii=item['lii'],
bii=item['bii'],
name=item['name'],
significance=item['significance'],
extent_flag=item['extent_flag'],
conf_flag=conf_flag,
error_ellipse_r0=item['error_ellipse_r0'],
error_ellipse_r1=item['error_ellipse_r1'],
error_ellipse_angle=item['error_ellipse_angle'],
b_flux_ap=item['b_flux_ap'],
b_flux_ap_hi=item['b_flux_ap_hi'],
b_flux_ap_lo=item['b_flux_ap_lo'],
m_flux_ap=item['m_flux_ap'],
m_flux_ap_hi=item['m_flux_ap_hi'],
m_flux_ap_lo=item['m_flux_ap_lo'],
s_flux_ap = item['s_flux_ap'],
s_flux_ap_hi = item['s_flux_ap_hi'],
m_photflux_ap=item['m_photflux_ap'],
m_photflux_ap_hi=item['m_photflux_ap_hi'],
m_photflux_ap_lo=item['m_photflux_ap_lo'],
s_photflux_ap=item['s_photflux_ap'],
s_photflux_ap_hi=item['s_photflux_ap_hi'],
s_photflux_ap_lo=item['s_photflux_ap_lo'],)
obj.save()
print('--> Successfully loaded "%s"' % table_name)
pass
class Command(BaseCommand):
help = 'Initiates data dase'
# def add_arguments(self, parser):
# parser.add_argument('poll_id', nargs='+', type=int)
def handle(self, *args, **options):
load_heasarc_table('heasarc_csc.tdat.gz')
self.stdout.write(self.style.SUCCESS('Done'))