From 230cc090d55cb18231150070878f95f032d95522 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Wed, 10 Jan 2024 10:21:52 -0600 Subject: [PATCH 01/11] get_observatory --- src/pint/observatory/__init__.py | 21 +++++++++++++-------- tests/test_observatory.py | 13 +++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/pint/observatory/__init__.py b/src/pint/observatory/__init__.py index 17d32856d..e9820902f 100644 --- a/src/pint/observatory/__init__.py +++ b/src/pint/observatory/__init__.py @@ -460,7 +460,7 @@ def posvel(self, t, ephem, group=None): def get_observatory( - name, include_gps=True, include_bipm=True, bipm_version=bipm_default + name, include_gps=None, include_bipm=None, bipm_version=bipm_default ): """Convenience function to get observatory object with options. @@ -474,10 +474,10 @@ def get_observatory( ---------- name : str The name of the observatory - include_gps : bool, optional - Set False to disable UTC(GPS)->UTC clock correction. - include_bipm : bool, optional - Set False to disable TAI TT(BIPM) clock correction. + include_gps : bool or None, optional + Override UTC(GPS)->UTC clock correction. + include_bipm : bool or None, optional + Override TAI TT(BIPM) clock correction. bipm_version : str, optional Set the version of TT BIPM clock correction files. @@ -486,9 +486,14 @@ def get_observatory( """ site = Observatory.get(name) - site.include_gps = include_gps - site.include_bipm = include_bipm - site.bipm_version = bipm_version + + if include_gps is not None: + site.include_gps = include_gps + + if include_bipm is not None: + site.include_bipm = include_bipm + site.bipm_version = bipm_version + return site diff --git a/tests/test_observatory.py b/tests/test_observatory.py index e126b02d8..5115d9f7d 100644 --- a/tests/test_observatory.py +++ b/tests/test_observatory.py @@ -336,3 +336,16 @@ def test_compare_t2_observatories_dat(): def test_compare_tempo_obsys_dat(): s = compare_tempo_obsys_dat(testdatadir / "observatory") assert isinstance(s, defaultdict) + + +def test_ssb_obs(): + ssb = Observatory.get("@") + assert not ssb.include_bipm and not ssb.include_gps + + ssb = get_observatory("@") + assert not ssb.include_bipm and not ssb.include_gps + + # get_observatory changes the state of the registered + # Observatory objects. So this needs to be repeated. + ssb = Observatory.get("@") + assert not ssb.include_bipm and not ssb.include_gps From 6139afa89586312d216cacc630878e99d69ba90b Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Wed, 10 Jan 2024 10:26:39 -0600 Subject: [PATCH 02/11] CHANGELOG --- CHANGELOG-unreleased.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG-unreleased.md b/CHANGELOG-unreleased.md index 6b26bde74..96976ddbb 100644 --- a/CHANGELOG-unreleased.md +++ b/CHANGELOG-unreleased.md @@ -39,4 +39,5 @@ the released changes. - Better exceptions for unsupported/unimplemented binary models (BTX, MSS, etc.) - Use `Hessian` instead of `Hessdiag` in `DownhillFitter._fit_noise`; compute noise parameter uncertainties only once in `DownhillFitter.fit_toas`. - Consistent naming in `TimingModel.get_params_mapping()` +- `get_observatory()` no longer overwrites `include_gps` and `include_bipm` of `Observatory` objects unless explicitly stated. ### Removed From 6d4d70176431c7a43d911abb7d0e635aebb9f6a4 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Wed, 10 Jan 2024 14:28:09 -0600 Subject: [PATCH 03/11] fix test --- src/pint/observatory/__init__.py | 57 ++++++++++++++++----------- src/pint/observatory/satellite_obs.py | 4 +- src/pint/observatory/topo_obs.py | 3 +- tests/test_fermiphase.py | 1 - tests/test_observatory.py | 4 +- 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/pint/observatory/__init__.py b/src/pint/observatory/__init__.py index e9820902f..a4745786b 100644 --- a/src/pint/observatory/__init__.py +++ b/src/pint/observatory/__init__.py @@ -143,23 +143,23 @@ class Observatory: # standard name. _alias_map = {} - def __new__(cls, name, *args, **kwargs): - # Generates a new Observatory object instance, and adds it - # it the registry, using name as the key. Name must be unique, - # a new instance with a given name will over-write the existing - # one only if overwrite=True - obs = super().__new__(cls) - if name.lower() in cls._registry: - if "overwrite" not in kwargs or not kwargs["overwrite"]: - raise ValueError( - f"Observatory {name.lower()} already present and overwrite=False" - ) - log.warning(f"Observatory '{name.lower()}' already present; overwriting...") - - cls._register(obs, name) - return obs - cls._register(obs, name) - return obs + # def __new__(cls, name, *args, **kwargs): + # # Generates a new Observatory object instance, and adds it + # # it the registry, using name as the key. Name must be unique, + # # a new instance with a given name will over-write the existing + # # one only if overwrite=True + # obs = super().__new__(cls) + # if name.lower() in cls._registry: + # if "overwrite" not in kwargs or not kwargs["overwrite"]: + # raise ValueError( + # f"Observatory {name.lower()} already present and overwrite=False" + # ) + # log.warning(f"Observatory '{name.lower()}' already present; overwriting...") + + # cls._register(obs, name) + # return obs + # cls._register(obs, name) + # return obs def __init__( self, @@ -171,6 +171,10 @@ def __init__( bipm_version=bipm_default, overwrite=False, ): + self._name = name.lower() + self._aliases = ( + list(set(map(str.lower, aliases))) if aliases is not None else [] + ) if aliases is not None: Observatory._add_aliases(self, aliases) self.fullname = fullname if fullname is not None else name @@ -178,6 +182,15 @@ def __init__( self.include_bipm = include_bipm self.bipm_version = bipm_version + if name.lower() in Observatory._registry: + if not overwrite: + raise ValueError( + f"Observatory {name.lower()} already present and overwrite=False" + ) + log.warning(f"Observatory '{name.lower()}' already present; overwriting...") + + Observatory._register(self, name) + @classmethod def _register(cls, obs, name): """Add an observatory to the registry using the specified name @@ -186,7 +199,7 @@ def _register(cls, obs, name): The Observatory instance's name attribute will be updated for consistency.""" cls._registry[name.lower()] = obs - obs._name = name.lower() + # obs._name = name.lower() @classmethod def _add_aliases(cls, obs, aliases): @@ -199,10 +212,10 @@ def _add_aliases(cls, obs, aliases): to ensure consistency.""" for a in aliases: cls._alias_map[a.lower()] = obs.name - for o in cls._registry.values(): - o._aliases = [ - alias for alias, name in cls._alias_map.items() if name == o.name - ] + # for o in cls._registry.values(): + # o._aliases = [ + # alias for alias, name in cls._alias_map.items() if name == o.name + # ] @staticmethod def gps_correction(t, limits="warn"): diff --git a/src/pint/observatory/satellite_obs.py b/src/pint/observatory/satellite_obs.py index 2021c0b48..de14ca369 100644 --- a/src/pint/observatory/satellite_obs.py +++ b/src/pint/observatory/satellite_obs.py @@ -310,8 +310,8 @@ def __init__( bipm_version=bipm_default, overwrite=False, ): + print(name, type(name)) super().__init__( - self, name, include_gps=include_gps, include_bipm=include_bipm, @@ -444,4 +444,6 @@ def get_satellite_observatory(name, ft2name, **kwargs): # values as new observatories are added. if "maxextrap" not in kwargs: kwargs["maxextrap"] = 2 + + print(name, type(name)) return SatelliteObs(name, ft2name, **kwargs) diff --git a/src/pint/observatory/topo_obs.py b/src/pint/observatory/topo_obs.py index c1e800dea..1d7fe8868 100644 --- a/src/pint/observatory/topo_obs.py +++ b/src/pint/observatory/topo_obs.py @@ -502,7 +502,8 @@ def load_observatories(filename=observatories_json, overwrite=False): def load_observatories_from_usual_locations(clear=False): """Load observatories from the default JSON file as well as ``$PINT_OBS_OVERRIDE``, optionally clearing the registry - Running with ``clear=True`` will return PINT to the state it is on import. Running with ``clear=False`` may result in conflicting definitions if observatories have already been imported. + Running with ``clear=True`` will return PINT to the state it is on import. + Running with ``clear=False`` may result in conflicting definitions if observatories have already been imported. Parameters ---------- diff --git a/tests/test_fermiphase.py b/tests/test_fermiphase.py index 1be357cb5..b5f9437c4 100644 --- a/tests/test_fermiphase.py +++ b/tests/test_fermiphase.py @@ -12,7 +12,6 @@ import pint.models import pint.scripts.fermiphase as fermiphase -import pint.toa as toa from pint.fermi_toas import get_Fermi_TOAs, _default_uncertainty from pint.observatory.satellite_obs import get_satellite_observatory from pinttestdata import datadir diff --git a/tests/test_observatory.py b/tests/test_observatory.py index 5115d9f7d..050b1be0a 100644 --- a/tests/test_observatory.py +++ b/tests/test_observatory.py @@ -276,9 +276,11 @@ def test_json_observatory_output(sandbox): gbt_reload = get_observatory("gbt") for p in gbt_orig.__dict__: - if p not in ["_clock"]: + if p not in ["_clock", "_aliases"]: assert getattr(gbt_orig, p) == getattr(gbt_reload, p) + assert set(gbt_orig._aliases) == set(gbt_reload._aliases) + def test_json_observatory_input_latlon(sandbox): gbt_orig = get_observatory("gbt") From 5216a313eda61d3b6c2508d29c09dee7e50d56e3 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Wed, 10 Jan 2024 14:29:47 -0600 Subject: [PATCH 04/11] copy --- src/pint/observatory/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pint/observatory/__init__.py b/src/pint/observatory/__init__.py index a4745786b..5e0ca0cac 100644 --- a/src/pint/observatory/__init__.py +++ b/src/pint/observatory/__init__.py @@ -21,6 +21,7 @@ necessary. """ +from copy import deepcopy import os import textwrap from collections import defaultdict @@ -498,7 +499,7 @@ def get_observatory( file switches/options are added at a public API level. """ - site = Observatory.get(name) + site = deepcopy(Observatory.get(name)) if include_gps is not None: site.include_gps = include_gps From 2f0b1d9d044e94e9c6440a3ce281ca9ae873ad65 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Thu, 11 Jan 2024 09:11:06 -0600 Subject: [PATCH 05/11] -- --- src/pint/observatory/topo_obs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pint/observatory/topo_obs.py b/src/pint/observatory/topo_obs.py index 1d7fe8868..2438b58b8 100644 --- a/src/pint/observatory/topo_obs.py +++ b/src/pint/observatory/topo_obs.py @@ -460,6 +460,7 @@ def export_all_clock_files(directory): for name in Observatory.names(): o = get_observatory(name) if hasattr(o, "_clock") and o._clock is not None: + print(name) for clock in o._clock: if clock.filename is not None: clock.export(directory / Path(clock.filename).name) From c36ce580ce54fac588a567c49fb05b4e2279c232 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Thu, 11 Jan 2024 09:21:38 -0600 Subject: [PATCH 06/11] -- --- src/pint/observatory/__init__.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/pint/observatory/__init__.py b/src/pint/observatory/__init__.py index 5e0ca0cac..618e09394 100644 --- a/src/pint/observatory/__init__.py +++ b/src/pint/observatory/__init__.py @@ -499,16 +499,19 @@ def get_observatory( file switches/options are added at a public API level. """ - site = deepcopy(Observatory.get(name)) + if include_bipm is not None or include_gps is not None: + site = deepcopy(Observatory.get(name)) - if include_gps is not None: - site.include_gps = include_gps + if include_gps is not None: + site.include_gps = include_gps - if include_bipm is not None: - site.include_bipm = include_bipm - site.bipm_version = bipm_version + if include_bipm is not None: + site.include_bipm = include_bipm + site.bipm_version = bipm_version - return site + return site + + return Observatory.get(name) def earth_location_distance(loc1, loc2): From 7f78e296b355a2d5eedb490ecdec697a580fc215 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Thu, 11 Jan 2024 09:24:07 -0600 Subject: [PATCH 07/11] x# --- tests/test_eventstats.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 tests/test_eventstats.py diff --git a/tests/test_eventstats.py b/tests/test_eventstats.py old mode 100755 new mode 100644 From bbf2fcf20e73801982482b175d477f343296a6c9 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Thu, 11 Jan 2024 13:46:44 -0600 Subject: [PATCH 08/11] cleanup --- src/pint/observatory/__init__.py | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/pint/observatory/__init__.py b/src/pint/observatory/__init__.py index 618e09394..895d46411 100644 --- a/src/pint/observatory/__init__.py +++ b/src/pint/observatory/__init__.py @@ -144,24 +144,6 @@ class Observatory: # standard name. _alias_map = {} - # def __new__(cls, name, *args, **kwargs): - # # Generates a new Observatory object instance, and adds it - # # it the registry, using name as the key. Name must be unique, - # # a new instance with a given name will over-write the existing - # # one only if overwrite=True - # obs = super().__new__(cls) - # if name.lower() in cls._registry: - # if "overwrite" not in kwargs or not kwargs["overwrite"]: - # raise ValueError( - # f"Observatory {name.lower()} already present and overwrite=False" - # ) - # log.warning(f"Observatory '{name.lower()}' already present; overwriting...") - - # cls._register(obs, name) - # return obs - # cls._register(obs, name) - # return obs - def __init__( self, name, @@ -200,7 +182,6 @@ def _register(cls, obs, name): The Observatory instance's name attribute will be updated for consistency.""" cls._registry[name.lower()] = obs - # obs._name = name.lower() @classmethod def _add_aliases(cls, obs, aliases): @@ -213,10 +194,6 @@ def _add_aliases(cls, obs, aliases): to ensure consistency.""" for a in aliases: cls._alias_map[a.lower()] = obs.name - # for o in cls._registry.values(): - # o._aliases = [ - # alias for alias, name in cls._alias_map.items() if name == o.name - # ] @staticmethod def gps_correction(t, limits="warn"): @@ -555,8 +532,8 @@ def compare_t2_observatories_dat(t2dir=None): for line in interesting_lines(f, comments="#"): try: x, y, z, full_name, short_name = line.split() - except ValueError: - raise ValueError(f"unrecognized line '{line}'") + except ValueError as e: + raise ValueError(f"unrecognized line '{line}'") from e x, y, z = float(x), float(y), float(z) full_name, short_name = full_name.lower(), short_name.lower() topo_obs_entry = textwrap.dedent( @@ -853,10 +830,7 @@ def find_clock_file( """ # Avoid import loop from pint.observatory.clock_file import ClockFile, GlobalClockFile - from pint.observatory.global_clock_corrections import ( - Index, - get_clock_correction_file, - ) + from pint.observatory.global_clock_corrections import Index if name == "": raise ValueError("No filename supplied to find_clock_file") From 074b4429d482948c8b0b2ba2a73200630c09ba59 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Thu, 11 Jan 2024 13:49:18 -0600 Subject: [PATCH 09/11] gitignore --- .gitignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ae210bce3..c95fdb4b1 100644 --- a/.gitignore +++ b/.gitignore @@ -132,4 +132,10 @@ docs/examples-rendered/*.py *.tex *.aux *.log -*.pdf \ No newline at end of file +*.pdf + +# test output +tests/datafile/par_*.par +tests/datafile/fake_toas.tim +tests/datafile/*.converted.par +tests/datafile/_test_pintempo.out From b20ee13c171b69fc39fd68bd741c612632378743 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Wed, 17 Jan 2024 11:08:43 -0600 Subject: [PATCH 10/11] cleanup --- src/pint/observatory/satellite_obs.py | 2 -- src/pint/observatory/topo_obs.py | 1 - 2 files changed, 3 deletions(-) diff --git a/src/pint/observatory/satellite_obs.py b/src/pint/observatory/satellite_obs.py index de14ca369..38d0c031b 100644 --- a/src/pint/observatory/satellite_obs.py +++ b/src/pint/observatory/satellite_obs.py @@ -310,7 +310,6 @@ def __init__( bipm_version=bipm_default, overwrite=False, ): - print(name, type(name)) super().__init__( name, include_gps=include_gps, @@ -445,5 +444,4 @@ def get_satellite_observatory(name, ft2name, **kwargs): if "maxextrap" not in kwargs: kwargs["maxextrap"] = 2 - print(name, type(name)) return SatelliteObs(name, ft2name, **kwargs) diff --git a/src/pint/observatory/topo_obs.py b/src/pint/observatory/topo_obs.py index 2438b58b8..1d7fe8868 100644 --- a/src/pint/observatory/topo_obs.py +++ b/src/pint/observatory/topo_obs.py @@ -460,7 +460,6 @@ def export_all_clock_files(directory): for name in Observatory.names(): o = get_observatory(name) if hasattr(o, "_clock") and o._clock is not None: - print(name) for clock in o._clock: if clock.filename is not None: clock.export(directory / Path(clock.filename).name) From 0765faf2a003a905fb3d56bb32fbaee0eb75ae55 Mon Sep 17 00:00:00 2001 From: Abhimanyu Susobhanan Date: Thu, 18 Jan 2024 17:15:37 -0600 Subject: [PATCH 11/11] CHANGELOG --- CHANGELOG-unreleased.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG-unreleased.md b/CHANGELOG-unreleased.md index 8e7b2a546..139313db4 100644 --- a/CHANGELOG-unreleased.md +++ b/CHANGELOG-unreleased.md @@ -40,5 +40,5 @@ the released changes. - Consistent naming in `TimingModel.get_params_mapping()` - Better exceptions for unsupported/unimplemented binary models (BTX, MSS, etc.) - Emit warnings when `WaveX`/`DMWaveX` is used together with other representations of red/DM noise -- `get_observatory()` no longer overwrites `include_gps` and `include_bipm` of `Observatory` objects unless explicitly stated. +- `get_observatory()` no longer overwrites `include_gps` and `include_bipm` of `Observatory` objects unless explicitly stated (BIPM and GPS clock corrections no longer incorrectly applied to BAT TOAs). ### Removed