work on the POST request for bulk-querying
This commit is contained in:
parent
77ae33a1e8
commit
e9c38ab778
@ -1,7 +1,15 @@
|
|||||||
|
# serializers.py
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import GaiaSource
|
from .models import GaiaSource
|
||||||
|
|
||||||
class GaiaSourceSerializer(serializers.ModelSerializer):
|
class GaiaSourceSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = GaiaSource
|
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'])
|
85
views.py
85
views.py
@ -1,5 +1,6 @@
|
|||||||
|
# views.py
|
||||||
|
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
#from rest_framework.generics import GenericAPIView
|
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
|
||||||
@ -9,7 +10,6 @@ from .serializers import GaiaSourceSerializer
|
|||||||
from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiParameter
|
from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiParameter
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
# import healpy as hp #maybe move to astropy-healpix cone_search_skycoord
|
|
||||||
from astropy_healpix import HEALPix
|
from astropy_healpix import HEALPix
|
||||||
from astropy.coordinates import SkyCoord
|
from astropy.coordinates import SkyCoord
|
||||||
from astropy import units as u
|
from astropy import units as u
|
||||||
@ -19,6 +19,19 @@ from astropy import units as u
|
|||||||
|
|
||||||
class ConeSearchView(APIView):
|
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
|
serializer_class = GaiaSourceSerializer
|
||||||
|
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
@ -97,15 +110,67 @@ class ConeSearchView(APIView):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class BulkSearchView(APIView):
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@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
|
@staticmethod
|
||||||
healpix = HEALPix(nside=nside, order=order, frame='icrs')
|
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
|
|
Loading…
x
Reference in New Issue
Block a user