work on the POST request for bulk-querying

This commit is contained in:
Никита Тырин 2024-09-19 16:12:29 +03:00
parent 77ae33a1e8
commit e9c38ab778
2 changed files with 84 additions and 11 deletions

View File

@ -1,7 +1,15 @@
# serializers.py
from rest_framework import serializers
from .models import GaiaSource
class GaiaSourceSerializer(serializers.ModelSerializer):
class Meta:
model = GaiaSource
fields = ['uuid', 'ra', 'dec']
fields = ['uuid', 'ra', 'dec']
class BulkSearchSerializer(serializers.Serializer):
uuid = serializers.CharField()
coordinates = serializers.ListField(child = serializers.FloatField())
radius = serializers.FloatField()
order = serializers.ChoiceField(choices=['ring', 'nested'])

View File

@ -1,5 +1,6 @@
# views.py
from rest_framework.views import APIView
#from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework import status
@ -9,7 +10,6 @@ from .serializers import GaiaSourceSerializer
from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiParameter
import numpy as np
# import healpy as hp #maybe move to astropy-healpix cone_search_skycoord
from astropy_healpix import HEALPix
from astropy.coordinates import SkyCoord
from astropy import units as u
@ -19,6 +19,19 @@ from astropy import units as u
class ConeSearchView(APIView):
@staticmethod
def get_healpix_indices(ra, dec, radius, nside, order):
# Create HEALPix object
healpix = HEALPix(nside=nside, order=order, frame='icrs')
# Convert the input coordinates to a SkyCoord object
center = SkyCoord(ra=ra*u.deg, dec=dec*u.deg, frame='icrs')
# Find the pixels within the given radius
indices = healpix.cone_search_skycoord(center, radius*u.deg)
return indices
serializer_class = GaiaSourceSerializer
@extend_schema(
@ -97,15 +110,67 @@ class ConeSearchView(APIView):
class BulkSearchView(APIView):
@staticmethod
def get_healpix_indices(ra, dec, radius, nside, order):
def list_to_dict(queries): #turn a list of dicts into a dict of lists
transformed = {
'uuids': [],
'coordinates': [],
'radii': []
'orders': []
}
for query in queries:
transformed['uuids'].append(query['uuid'])
transformed['coordinates'].append(query['coordinates'])
transformed['radii'].append(query['radius'])
transformed['orders'].append(query['order'])
return transformed
# Create HEALPix object
healpix = HEALPix(nside=nside, order=order, frame='icrs')
@staticmethod
def process_coordinates(transformed, order):
results = []
for i, coords in enumerate(transformed['coordinates']):
ra, dec = coords
radius = transformed['radii'][i]
uuid = transformed['uuids'][i]
order = transformed['orders'][i]
# Call your function to get HEALPix indices
healpix_indices = ConeSearchView.get_healpix_indices(ra, dec, radius, 2048, order)
results.append({
'uuid': uuid,
'coordinates': coords,
'healpix_indices': healpix_indices
'orders': order
})
return results
def post(self, request):
serializer = BulkSearchSerializer(data=request.data['queries'], many=True)
if serializer.is_valid():
transformed = list_to_dict(serializer.validated_data)
processed_results = process_coordinates(transformed)
final_results =
# Convert the input coordinates to a SkyCoord object
center = SkyCoord(ra=ra*u.deg, dec=dec*u.deg, frame='icrs')
# Find the pixels within the given radius
indices = healpix.cone_search_skycoord(center, radius*u.deg)
return indices