diff --git a/pyproject.toml b/pyproject.toml index 14af3c4..d254077 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ASTRA-spectra" -version = "1.2.5" +version = "1.2.6" description = "Interface to open stellar spectra and construct stellar and telluric models" readme = "README.md" requires-python = ">=3.11,<=3.12.8" @@ -12,6 +12,7 @@ dependencies = [ "matplotlib>=3.10.1", "numpy>=1.23.2,<2.0.0", "pandas>=2.2.3", + "pyqt6>=6.11.0", "scipy>=1.15.2", "sqlalchemy>=2.0.40", "sqlalchemy-utils>=0.41.2", diff --git a/src/ASTRA/Instruments/ESO_PIPELINE.py b/src/ASTRA/Instruments/ESO_PIPELINE.py index c91cdfe..c8c5bf1 100644 --- a/src/ASTRA/Instruments/ESO_PIPELINE.py +++ b/src/ASTRA/Instruments/ESO_PIPELINE.py @@ -113,6 +113,7 @@ def __init__( "INS NAME": "INSTRUME", "INS MODE": f"HIERARCH {KW_identifier} INS MODE", "PROG ID": f"HIERARCH {KW_identifier} OBS PROG ID", + "OBS NAME": "HIERARCH ESO OBS NAME", } if override_KW_map is not None: for key, value in override_KW_map.items(): diff --git a/src/ASTRA/Instruments/ESPRESSO.py b/src/ASTRA/Instruments/ESPRESSO.py index 1c493b4..f526eb2 100644 --- a/src/ASTRA/Instruments/ESPRESSO.py +++ b/src/ASTRA/Instruments/ESPRESSO.py @@ -93,18 +93,28 @@ def __init__( # https://www.eso.org/sci/facilities/paranal/astroclimate/site.html self.instrument_properties["site_pressure"] = 750 + self.is_poet_data = None + self.UT_number = None + + def _load_ESO_DRS_KWs(self, header): + super()._load_ESO_DRS_KWs(header) + self.is_poet_data = header.get("ESO INS POET MODE",False) + if self.is_poet_data: + logger.info("Detected PoET frame") + self.UT_number = 5 + self.observation_info["POET_APERTURE"] = header.get("ESO POET APER", "UNKNOWN") def load_telemetry_info(self, header): # Find the UT number and load the airmass - for i in range(1, 5): + for i in range(1, 6): try: self.observation_info["airmass"] = header[f"HIERARCH ESO TEL{i} AIRM START"] self.UT_number = i break except KeyError as e: - if i == 4: + if i == 5: msg = "\tCannot find ESO TELx AIRM START key" raise KeyError(msg) from e - + # Environmental KWs for telfit (also needs airmassm previously loaded) ambi_KWs = { "relative_humidity": "AMBI RHUM", @@ -112,6 +122,9 @@ def load_telemetry_info(self, header): "seeing": "AMBI FWHM START", } + if self.is_poet_data: + ambi_KWs["seeing"] = "AMBI FWHM" + for name, endKW in ambi_KWs.items(): self.observation_info[name] = float(header[f"HIERARCH ESO TEL{self.UT_number} {endKW}"]) if "temperature" in name: # store temperature in KELVIN for TELFIT diff --git a/src/ASTRA/__init__.py b/src/ASTRA/__init__.py index 7b46cab..7edb00d 100644 --- a/src/ASTRA/__init__.py +++ b/src/ASTRA/__init__.py @@ -1,6 +1,6 @@ """ASTRA - interface for spectra.""" -version = "1.2.5" +version = "1.2.6" __version__ = version.replace(".", "-") __version_info__ = (int(i) for i in __version__.split("-")) diff --git a/src/ASTRA/base_models/Frame.py b/src/ASTRA/base_models/Frame.py index af0a86d..c579e14 100644 --- a/src/ASTRA/base_models/Frame.py +++ b/src/ASTRA/base_models/Frame.py @@ -316,6 +316,8 @@ def __init__( "INS NAME": "None", "PROG ID": "None", "DATE_NIGHT": "None", + "OBS NAME": "", + "POET_APERTURE": None, } # Used to allow to reject a wavelength region from one order and keep any overlap that might exist on others diff --git a/src/ASTRA/utils/spectral_conditions.py b/src/ASTRA/utils/spectral_conditions.py index 00243cc..919e703 100644 --- a/src/ASTRA/utils/spectral_conditions.py +++ b/src/ASTRA/utils/spectral_conditions.py @@ -30,6 +30,13 @@ valid_error_condition = KEYWORD_condition(KW="previousRV_ERR", bounds = [0, 50*meter_second]) +- It is possible to match the Keyword values to a specific one: +.. code-block:: python + + + valid_error_condition = KEYWORD_condition(KW="OBS NAME", + value = "OB NAME as defined in the header" + ) Rejection based on filenames ================================ @@ -149,7 +156,6 @@ def evaluate(self, frame: Frame) -> Tuple[bool, List[Flag]]: if output_flag != VALID: flags.append(output_flag) valid_OBS = False - return valid_OBS, flags def select_spectra(self, frame: Frame) -> Flag: @@ -177,6 +183,28 @@ def write_to_disk(self, file: UI_PATH) -> None: for condition in self._cond_information: file.write("\t" + "".join(condition) + "\n") +class KEYWORD_value(ConditionModel): + """Limit the kW to be a specific value.""" + def __init__(self, KW: str, value: Any) -> None: + self.KW = KW + self.value = value + super().__init__() + + + def select_spectra(self, frame) -> Flag: + """Reject if from a given sub-instrument.""" + + KW_val = frame.get_KW_value(self.KW) + if KW_val != self.value: + flag = USER_BLOCKED(f"{self.KW} value ({KW_val}) does not match the required one ({self.value})") + else: + flag = VALID + return flag + + @property + def cond_info(self) -> str: # noqa: D102 + return f"Keyword {self.KW} has value {self.value}" + class KEYWORD_condition(ConditionModel): """Limit the KW to be inside the defined interval (edges included).""" diff --git a/uv.lock b/uv.lock index 7b067b3..1857dad 100644 --- a/uv.lock +++ b/uv.lock @@ -77,7 +77,7 @@ wheels = [ [[package]] name = "astra-spectra" -version = "1.2.5" +version = "1.2.6" source = { editable = "." } dependencies = [ { name = "astropy" }, @@ -87,6 +87,7 @@ dependencies = [ { name = "matplotlib" }, { name = "numpy" }, { name = "pandas" }, + { name = "pyqt6" }, { name = "scipy" }, { name = "sqlalchemy" }, { name = "sqlalchemy-utils" }, @@ -120,6 +121,7 @@ requires-dist = [ { name = "matplotlib", specifier = ">=3.10.1" }, { name = "numpy", specifier = ">=1.23.2,<2.0.0" }, { name = "pandas", specifier = ">=2.2.3" }, + { name = "pyqt6", specifier = ">=6.11.0" }, { name = "scipy", specifier = ">=1.15.2" }, { name = "sqlalchemy", specifier = ">=2.0.40" }, { name = "sqlalchemy-utils", specifier = ">=0.41.2" }, @@ -2165,6 +2167,54 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, ] +[[package]] +name = "pyqt6" +version = "6.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyqt6-qt6" }, + { name = "pyqt6-sip" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/47/b25c13eca5bebc6505394d0223e46d7ebf0c57dcac2ed908d7d19b18ab6b/pyqt6-6.11.0.tar.gz", hash = "sha256:45dd60aa69976de1918b5ced6b4e7b6a25abd2a919ecef5fd5826ecc76718889", size = 1087430, upload-time = "2026-03-30T09:16:13.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/44/fcd3dd3f64c83c96bf9bce76ec16cca64bd9b91702c3d08fd8e3dafc73d9/pyqt6-6.11.0-cp310-abi3-macosx_10_14_universal2.whl", hash = "sha256:f7100bc7f72b12581ec479a733f4ad11b8002668e6786e8a445ab6f4d1c743d4", size = 12429735, upload-time = "2026-03-30T09:16:03.713Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a0/bd1399740dfa80c0a94d20b02d89962a31458233dcf70eaa09bfbccf3d0f/pyqt6-6.11.0-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8555277989fa7d114cb3c3443fd261d566909f7268ceedd41d93a5f02d37ec05", size = 8334632, upload-time = "2026-03-30T09:16:06.066Z" }, + { url = "https://files.pythonhosted.org/packages/d3/db/425b184ac2430ba1978bb507ffd285ec007a872644e2ae5df13332dbcb05/pyqt6-6.11.0-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:0734959955adde095af9a074213a7f73386d1bbbddfc27346b4c0621641a692e", size = 8321484, upload-time = "2026-03-30T09:16:08.135Z" }, + { url = "https://files.pythonhosted.org/packages/6f/85/dd9f03d78d87460e109e0121cd6201c5802bdd655656bf2780e964870fea/pyqt6-6.11.0-cp310-abi3-win_amd64.whl", hash = "sha256:bd11b459c54dca068e988a42cf838303334f0d441b9d16d92ae6719fcb5ac6ba", size = 6844358, upload-time = "2026-03-30T09:16:09.766Z" }, + { url = "https://files.pythonhosted.org/packages/cd/75/970b041bde4372cc6739c5ef9db1de83a6b36e788e4992e598baa35b2255/pyqt6-6.11.0-cp310-abi3-win_arm64.whl", hash = "sha256:b6324e3501b19b4292c7a55b1f22e82d3e80e519e383ce4fe79b4a754c6f0288", size = 5933984, upload-time = "2026-03-30T09:16:11.817Z" }, +] + +[[package]] +name = "pyqt6-qt6" +version = "6.11.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/5e/9e65b87ba746bb3a2ee81d6f3b2a8a7a4dfc33335c0a6afa15e8621e5fe9/pyqt6_qt6-6.11.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:447b04baf9bfd800410dc6a3b6faf24a2b754bd6e1c5d0dc609e6935362828f3", size = 70238920, upload-time = "2026-03-24T15:01:22.753Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b2/a15f88a0d9f550b9581592f79fb64b827ab3d3343cbb2af05912e6c77d26/pyqt6_qt6-6.11.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b510d0cb8f4d3f4306b6ff33a63234139c9c87c160909d3853e4deb1094782c2", size = 64036460, upload-time = "2026-03-24T15:01:42.951Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f9/99696e6b2325ae54868111f581c59a8a6283b8f21bc931837f49093bc582/pyqt6_qt6-6.11.0-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:c2c3a14714536256a9fd761a8ac8e030dfed7b991200a220ca79d399fcc3d265", size = 85757517, upload-time = "2026-03-24T15:02:11.86Z" }, + { url = "https://files.pythonhosted.org/packages/9d/3c/a420d08723d4ab1998afead3e6f643333e93a9eadfde3486bdec25acfff0/pyqt6_qt6-6.11.0-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:acc5b78d7f718a5642f14b37928e074b048751cc86edb4c539e4425bfbd26827", size = 84854032, upload-time = "2026-03-24T15:03:26.991Z" }, + { url = "https://files.pythonhosted.org/packages/36/cd/da0147d331b44587a7214c7f59719ac4f8e9433b268016962b02067007d1/pyqt6_qt6-6.11.0-py3-none-win_amd64.whl", hash = "sha256:b0e42629cef2575f2178aaeb32b0e539291df869f91f4df48983da3ccaad05af", size = 78309473, upload-time = "2026-03-24T15:03:53.396Z" }, + { url = "https://files.pythonhosted.org/packages/72/9a/8d09ca47a61c2504b49e16c97ccde99b120ceec323d97f7ca776f8331213/pyqt6_qt6-6.11.0-py3-none-win_arm64.whl", hash = "sha256:bcfa594171408319935c25afc7f82a3ae3ba90678ea194631bbca1c6f68daa6d", size = 59848654, upload-time = "2026-03-24T15:04:18.117Z" }, +] + +[[package]] +name = "pyqt6-sip" +version = "13.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/24/a753e1af94b9ae5b2da63d4598457308da3cdbf0838c959381db086ccc86/pyqt6_sip-13.11.1.tar.gz", hash = "sha256:869c5b48afe38e55b1ee0dd72182b0886e968cc509b98023ff50010b013ce1be", size = 92574, upload-time = "2026-03-09T13:01:35.418Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/fa/049879f61888462099dcbab495ad16df770cca2432330cca0767ab8e87cb/pyqt6_sip-13.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0ec2128c174db352bec1c8d23a437e970e8d5a78ac50315d8dfc671fcf7a7da", size = 111056, upload-time = "2026-03-09T13:01:07.998Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/6ee861c53f3f7e6c5dd34a441d17aad1dfb3d50ce1f1a024cc9194ac3db3/pyqt6_sip-13.11.1-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6aa6c15ad3a9bb86e69119baff77b4ac17c47e55ee567abff616a4652051a6cc", size = 289930, upload-time = "2026-03-09T13:01:11.122Z" }, + { url = "https://files.pythonhosted.org/packages/ca/39/c975733d7204a594e6ae51d3a810aad539d09718aa3ceeb0dd28cb3276bd/pyqt6_sip-13.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee652b272373c4f9287625ef32ad4ec1f0755c24928dc958a870b7a928b288c", size = 315827, upload-time = "2026-03-09T13:01:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d6/c40e8ae38a6e2bce9e837b64688f55746bfdad1aa557eb733fb5e90edd7c/pyqt6_sip-13.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:98db8ed37cf08130e1ee74b8ff47a6bfb8c3cdfe826310597a630a50e47feedc", size = 54029, upload-time = "2026-03-09T13:01:12.261Z" }, + { url = "https://files.pythonhosted.org/packages/fb/63/ec8c21ef9edffb55af42c637325d72eca4ea90a73ab714aaa1429c757e85/pyqt6_sip-13.11.1-cp311-cp311-win_arm64.whl", hash = "sha256:3af7a49dce4c35c5464309232c81cc1da5ec6074f46d2957831ee4031b8eefa6", size = 48458, upload-time = "2026-03-09T13:01:13.689Z" }, + { url = "https://files.pythonhosted.org/packages/46/27/47598e701d284497216bf97bf8b6a69f5e61412e716c232ff2b7e6cb2100/pyqt6_sip-13.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ba9d362dd1e54b43bc2594f8841e1e39d24789716d28f08e5c9282af9fca342c", size = 112564, upload-time = "2026-03-09T13:01:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/95/cb/116f9b328636765f3bce97d9e10ec041c54bbe92beb0617edb86c2b615c1/pyqt6_sip-13.11.1-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0df15849946cea969d3ff2b24b76149262b6044aea2c5403e4f70c24c973a4c8", size = 299564, upload-time = "2026-03-09T13:01:17.292Z" }, + { url = "https://files.pythonhosted.org/packages/1b/be/fe2321285e8f683e705d199dbb458131f1850dc5966155a19c40100c85bb/pyqt6_sip-13.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c52b2b27fc77d9447a8dc1c6de1aaccc22d41e48697aafb2f2f20b8984bb02a5", size = 321210, upload-time = "2026-03-09T13:01:15.904Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9b/7d4b10f9cba1b6f581dfb4860b9d11898da55a5ed3b8a6e7a1bf9f7084d0/pyqt6_sip-13.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d1c67179c1924b28e3d7f04585639e7a7c0946f62390efc6ccf2a6206e595d3", size = 53351, upload-time = "2026-03-09T13:01:19.327Z" }, + { url = "https://files.pythonhosted.org/packages/06/72/6c4e6f21cafa4bed40d2b0c1563525b0d8bfcb5734493696f4cfd043b45f/pyqt6_sip-13.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:d83543125fe9fdb153e7e446c3b4d056d80ab5953644660633ab3f80e7784194", size = 48746, upload-time = "2026-03-09T13:01:20.248Z" }, +] + [[package]] name = "pytest" version = "8.3.5"