65 lines
2.6 KiB
Python
65 lines
2.6 KiB
Python
from django.core.management.base import BaseCommand
|
|
from GaiaDBInterface.models import GaiaSource, CatalogFile
|
|
from astropy.coordinates import SkyCoord
|
|
import astropy_healpix as ah
|
|
import numpy as np
|
|
from datetime import datetime, timedelta
|
|
|
|
def current_time():
|
|
return (datetime.now() + timedelta(hours=3)).strftime("%H:%M:%S")
|
|
|
|
def update_catalog_file_status(catalog_file, status): #catalog file status updater
|
|
catalog_file.status = status
|
|
catalog_file.save()
|
|
|
|
def healpix(nside, order):
|
|
|
|
#NSIDE=2048
|
|
#ORDER='ring'
|
|
|
|
for catalog_file in CatalogFile.objects.all():
|
|
|
|
print(f'[{current_time()}] Loading sources from the database...')
|
|
sources = list(catalog_file.sources.all())
|
|
print(f'[{current_time()}] Sources ready. Forming ra & dec arrays...')
|
|
|
|
ra_list = np.array([source.ra for source in sources])
|
|
dec_list = np.array([source.dec for source in sources])
|
|
print(f'[{current_time()}] ra & dec arrays ready. Creating SkyCoord objects...')
|
|
|
|
skycoord = SkyCoord(ra=ra_list, dec=dec_list, unit='deg', frame='fk5')
|
|
print(f'[{current_time()}] SkyCoord objects ready. Calculating healpix indices...')
|
|
|
|
healpix = ah.HEALPix(nside=nside, order=order, frame='fk5')
|
|
healpix_indices = healpix.skycoord_to_healpix(skycoord)
|
|
print(f'[{current_time()}] Indices ready. Assigning indices to source instances...')
|
|
|
|
for source, healpix_index in zip(sources, healpix_indices):
|
|
source.healpix_ring_index = healpix_index
|
|
print(f'[{current_time()}] Instances ready. Bulk updating the database...')
|
|
|
|
if order == "ring":
|
|
GaiaSource.objects.bulk_update(sources, ['healpix_ring_index'])
|
|
print(f'[{current_time()}] Database updated, sources ring-indexed successfully.')
|
|
update_catalog_file_status(catalog_file, 'INDEXED')
|
|
elif order == "nested":
|
|
GaiaSource.objects.bulk_update(sources, ['helpix_nested_index'])
|
|
print(f'[{current_time()}] Database updated, sources nested-indexed successfully.')
|
|
update_catalog_file_status(catalog_file, 'INDEXED')
|
|
else:
|
|
pass
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Index sources using healpix.'
|
|
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('nside', type=int, help='NSIDE parameter for HEALPix')
|
|
parser.add_argument('order', type=str, help='ORDER parameter for HEALPix')
|
|
|
|
def handle(self, *args, **options):
|
|
nside = options['nside']
|
|
order = options['order']
|
|
healpix(nside, order)
|
|
|