From bb7ff8739ccb3e24dc3cf0c90a39f1e8b414f7ff Mon Sep 17 00:00:00 2001 From: Carolina Capetillo Date: Fri, 21 Aug 2026 11:06:37 -0700 Subject: [PATCH 1/5] adds logic to return ra and dec of target from header --- .../analysis/target_position.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 datalab/datalab_session/analysis/target_position.py diff --git a/datalab/datalab_session/analysis/target_position.py b/datalab/datalab_session/analysis/target_position.py new file mode 100644 index 0000000..0be6343 --- /dev/null +++ b/datalab/datalab_session/analysis/target_position.py @@ -0,0 +1,27 @@ +from urllib.error import HTTPError + +from django.contrib.auth.models import User + +from datalab.datalab_session.exceptions import ClientAlertException +from datalab.datalab_session.utils.file_utils import get_fits_header +from datalab.datalab_session.utils.filecache import FileCache +from datalab.datalab_session.utils.fits_metadata import target_radec_from_header + + +def target_position(input: dict, user: User): + try: + file_path = FileCache().get_fits(input['basename'], input.get('source', 'archive'), user) + sci_header = get_fits_header(file_path, 'SCI') + except TimeoutError: + raise ClientAlertException(f"Download of {input['basename']} FITs timed out") + except TypeError as e: + raise ClientAlertException(e) + except HTTPError: + raise ClientAlertException(f"No FITs file found for this image") + + try: + ra, dec = target_radec_from_header(sci_header) + except ValueError as e: + raise ClientAlertException(e) + + return {'ra': ra, 'dec': dec} From eed012f6df57b4a6f5f58394d6398ac0eee2f8b2 Mon Sep 17 00:00:00 2001 From: Carolina Capetillo Date: Fri, 21 Aug 2026 11:07:19 -0700 Subject: [PATCH 2/5] updates test to include returning target position --- datalab/datalab_session/tests/test_analysis.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/datalab/datalab_session/tests/test_analysis.py b/datalab/datalab_session/tests/test_analysis.py index 68293f5..1c6d0a8 100644 --- a/datalab/datalab_session/tests/test_analysis.py +++ b/datalab/datalab_session/tests/test_analysis.py @@ -7,7 +7,7 @@ import numpy as np from numpy.testing import assert_almost_equal -from datalab.datalab_session.analysis import centroiding, line_profile, source_catalog +from datalab.datalab_session.analysis import centroiding, line_profile, source_catalog, target_position from datalab.datalab_session.data_operations import light_curve as light_curve_module @@ -73,6 +73,20 @@ def test_source_catalog(self, mock_file_cache): self.assertAlmostEqual(output[0]['mag'], expected_mag) self.assertAlmostEqual(output[0]['magerr'], expected_magerr) + @mock.patch('datalab.datalab_session.analysis.target_position.get_fits_header') + @mock.patch('datalab.datalab_session.analysis.target_position.FileCache') + def test_target_position(self, mock_file_cache, mock_get_fits_header): + mock_file_cache.return_value.get_fits.return_value = self.analysis_fits_1_path + mock_get_fits_header.return_value = {"CAT-RA": "18:07:23.824", "CAT-DEC": "-07:28:36.39"} + + output = target_position.target_position({ + 'basename': 'fits_1', + 'source': 'archive' + }, None) + + self.assertAlmostEqual(output['ra'], 271.84927, places=4) + self.assertAlmostEqual(output['dec'], -7.47677, places=4) + @mock.patch('datalab.datalab_session.data_operations.light_curve.find_target_source') @mock.patch('datalab.datalab_session.data_operations.light_curve.get_hdu') @mock.patch('datalab.datalab_session.data_operations.light_curve.FileCache') From 3e801713d60ea31484091d8c3303f6c9009f3a31 Mon Sep 17 00:00:00 2001 From: Carolina Capetillo Date: Fri, 21 Aug 2026 11:07:59 -0700 Subject: [PATCH 3/5] retrieves target position --- datalab/datalab_session/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/datalab/datalab_session/views.py b/datalab/datalab_session/views.py index 12b3558..f7c08cd 100644 --- a/datalab/datalab_session/views.py +++ b/datalab/datalab_session/views.py @@ -12,6 +12,7 @@ from datalab.datalab_session.analysis.get_jpg import get_jpg from datalab.datalab_session.analysis.raw_data import raw_data from datalab.datalab_session.analysis.wcs import wcs +from datalab.datalab_session.analysis.target_position import target_position from datalab.datalab_session.exceptions import ClientAlertException log = logging.getLogger() @@ -38,7 +39,8 @@ class AnalysisView(RetrieveAPIView): "get-tif": get_tif, "get-jpg": get_jpg, "raw-data": raw_data, - "wcs": wcs + "wcs": wcs, + "target-position": target_position, } def post(self, request, action): From d19c1c0851a496939f5e26c85b46af146f9b08ce Mon Sep 17 00:00:00 2001 From: Carolina Capetillo Date: Thu, 24 Sep 2026 11:37:31 -0700 Subject: [PATCH 4/5] changes the default (it was random before) --- datalab/datalab_session/utils/aperture_light_curve.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/datalab/datalab_session/utils/aperture_light_curve.py b/datalab/datalab_session/utils/aperture_light_curve.py index 0fd7ca9..32af0da 100644 --- a/datalab/datalab_session/utils/aperture_light_curve.py +++ b/datalab/datalab_session/utils/aperture_light_curve.py @@ -65,9 +65,9 @@ # A larger recenter than this means the centroid was pulled onto a neighbour or host galaxy. TARGET_RECENTER_MAX_SHIFT_PX = 6.0 DEFAULT_CROSSMATCH_ARCSEC = 1.0 -DEFAULT_APERTURE_RADIUS = 7.64 -DEFAULT_ANNULUS_INNER_RADIUS = 12.73 -DEFAULT_ANNULUS_OUTER_RADIUS = 19.10 +DEFAULT_APERTURE_RADIUS = 35.64 +DEFAULT_ANNULUS_INNER_RADIUS = 62.73 +DEFAULT_ANNULUS_OUTER_RADIUS = 89.10 DEFAULT_MIN_COMPARISONS = 5 DEFAULT_MAX_COMPARISONS = 10 # Cost runs as candidates x frames, so bound that product. Sized to clear an ordinary deep field, From 32e27587df82e5f50d92f31c1eedd8cfe2f25526 Mon Sep 17 00:00:00 2001 From: Carolina Capetillo Date: Thu, 24 Sep 2026 11:39:02 -0700 Subject: [PATCH 5/5] not arbitrary numbers. my bad --- datalab/datalab_session/utils/aperture_light_curve.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/datalab/datalab_session/utils/aperture_light_curve.py b/datalab/datalab_session/utils/aperture_light_curve.py index 32af0da..0fd7ca9 100644 --- a/datalab/datalab_session/utils/aperture_light_curve.py +++ b/datalab/datalab_session/utils/aperture_light_curve.py @@ -65,9 +65,9 @@ # A larger recenter than this means the centroid was pulled onto a neighbour or host galaxy. TARGET_RECENTER_MAX_SHIFT_PX = 6.0 DEFAULT_CROSSMATCH_ARCSEC = 1.0 -DEFAULT_APERTURE_RADIUS = 35.64 -DEFAULT_ANNULUS_INNER_RADIUS = 62.73 -DEFAULT_ANNULUS_OUTER_RADIUS = 89.10 +DEFAULT_APERTURE_RADIUS = 7.64 +DEFAULT_ANNULUS_INNER_RADIUS = 12.73 +DEFAULT_ANNULUS_OUTER_RADIUS = 19.10 DEFAULT_MIN_COMPARISONS = 5 DEFAULT_MAX_COMPARISONS = 10 # Cost runs as candidates x frames, so bound that product. Sized to clear an ordinary deep field,