diff --git a/serializers.py b/serializers.py index 6787ef9..f69d24e 100644 --- a/serializers.py +++ b/serializers.py @@ -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'] \ No newline at end of file + 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']) \ No newline at end of file diff --git a/views.py b/views.py index a4c6bc5..f0dac4f 100644 --- a/views.py +++ b/views.py @@ -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 \ No newline at end of file