diff --git a/CHANGES.rst b/CHANGES.rst index 6710e9e9cc..148aec8a03 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -193,6 +193,10 @@ esa.hubble - New methods to retrieve metadata (``get_observations_from_program``) and files (``download_files_from_program``) associated to a proposal. [#2910] +- New method ``get_datalabs_path`` to return the complete path of a file in + datalabs by combining the datalabs volume path with the path of the file + in the table ehst.artifact [#2998] + esa.jwst ^^^^^^^^ diff --git a/astroquery/esa/hubble/core.py b/astroquery/esa/hubble/core.py index 79678a20cf..1e24aa2643 100644 --- a/astroquery/esa/hubble/core.py +++ b/astroquery/esa/hubble/core.py @@ -1003,5 +1003,37 @@ def _get_decoded_string(self, string): except (UnicodeDecodeError, AttributeError): return string + def get_datalabs_path(self, filename, default_volume=None): + """Get the available columns for a table in EHST TAP service + + Parameters + ---------- + filename : string, mandatory, default None + file name to search for its full path + default_volume : string, optional, default None + Default folder name in datalabs. If None, it is filled automatically + + Returns + ------- + The complete path of the file name in Datalabs + """ + + query = f"select file_path from ehst.artifact where file_name = '{filename}'" + job = self.query_tap(query=query) + if job is None: + return None + + # Output example for path: /hstdata/hstdata_i/i/b4x/04, or hstdata_i/i/b4x/04 for path_parsed + path = self._get_decoded_string(string=job["file_path"][0]) + path_parsed = path.split("hstdata/", 1)[1] + + # Automatic fill: convert /hstdata/hstdata_i/i/b4x/04 to /data/user/hub_hstdata_i/i/b4x/04 + if default_volume is None: + return "/data/user/hub_" + path_parsed + "/" + filename + + # Use the path provided by the user: convert /hstdata/hstdata_i/i/b4x/04 to /data/user/myPath/i/b4x/04 + path_parsed = path_parsed.split("/", 1)[1] + return "/data/user/" + default_volume + "/" + path_parsed + "/" + filename + ESAHubble = ESAHubbleClass() diff --git a/astroquery/esa/hubble/tests/test_esa_hubble.py b/astroquery/esa/hubble/tests/test_esa_hubble.py index 084459bbe3..c26d5ecdc6 100644 --- a/astroquery/esa/hubble/tests/test_esa_hubble.py +++ b/astroquery/esa/hubble/tests/test_esa_hubble.py @@ -751,3 +751,12 @@ def test_show_messages(self, mock_conn, mock_res): mock_conn.getresponse = MagicMock(return_value=mock_res) ESAHubbleClass() mock_res.assert_called() + + def test_get_datalabs_path(self): + parameters = {'filename': "ib4x04ivq_flt.jpg", + 'default_volume': None} + + dummyTapHandler = DummyHubbleTapHandler("get_datalabs_path", parameters) + ehst = ESAHubbleClass(tap_handler=self.get_dummy_tap_handler(), show_messages=False) + ehst.get_datalabs_path(filename="ib4x04ivq_flt.jpg", default_volume="") + dummyTapHandler.check_call("get_datalabs_path", parameters) diff --git a/astroquery/esa/hubble/tests/test_esa_hubble_remote.py b/astroquery/esa/hubble/tests/test_esa_hubble_remote.py index f74215e234..837620ea0b 100644 --- a/astroquery/esa/hubble/tests/test_esa_hubble_remote.py +++ b/astroquery/esa/hubble/tests/test_esa_hubble_remote.py @@ -129,3 +129,7 @@ def test_retrieve_fits_from_program(self): filters=['F814W/F450W'], folder=str(self.temp_folder_for_fits.name)) assert len(os.listdir(self.temp_folder_for_fits.name)) > 0 + + def test_get_datalabs_path(self): + result = esa_hubble.get_datalabs_path(filename='ib4x04ivq_flt.jpg', default_volume=None) + assert result == '/data/user/hub_hstdata_i/i/b4x/04/ib4x04ivq_flt.jpg'