From d950d53815c714600d9b90f2e2be3f21a6c9e502 Mon Sep 17 00:00:00 2001 From: Eureka0 Date: Mon, 15 Dec 2025 15:59:43 +0800 Subject: [PATCH 1/8] doc: add code quality badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 853ddc3..7d27c3f 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![PyPI - Version](https://img.shields.io/pypi/v/pygnss-tec)](https://pypi.org/project/pygnss-tec/) ![Supported Python Versions](https://img.shields.io/badge/python-%3E%3D3.10-blue) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/5ec7c48b66f04ebb8a3ce1ea7c03ed64)](https://app.codacy.com/gh/Eureka-0/pygnss-tec/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) ![License](https://img.shields.io/badge/license-MIT-blue) [![Test](https://github.com/Eureka-0/pygnss-tec/actions/workflows/test.yml/badge.svg)](https://github.com/Eureka-0/pygnss-tec/actions/workflows/test.yml) From 7e6b3a0146f4cc471f7ebddde3092906c28e534c Mon Sep 17 00:00:00 2001 From: Eureka0 Date: Mon, 15 Dec 2025 16:31:42 +0800 Subject: [PATCH 2/8] refactor: decouple stec_dcb_corrected from bias estimation --- gnss_tec/tec/bias.py | 25 +++++++++++++++---------- gnss_tec/tec/tec_calculation.py | 21 ++++++++++----------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/gnss_tec/tec/bias.py b/gnss_tec/tec/bias.py index fd32982..0740a4f 100644 --- a/gnss_tec/tec/bias.py +++ b/gnss_tec/tec/bias.py @@ -136,12 +136,13 @@ def estimate_rx_bias( Returns: pl.LazyFrame: LazyFrame with receiver bias estimates added, in TECU. """ - if method == "mstd": - estimate_func = _mstd_rx_bias - elif method == "lsq": - estimate_func = _lsq_rx_bias - else: - raise ValueError(f"Unknown bias correction method: {method}") + match method: + case "mstd": + estimate_func = _mstd_rx_bias + case "lsq": + estimate_func = _lsq_rx_bias + case _: + raise ValueError(f"Unknown bias correction method: {method}") lf = df.lazy() if downsample: @@ -158,7 +159,7 @@ def estimate_rx_bias( bias_lf = bias_lf.group_by( "date", "station", "constellation", "C1_code", "C2_code" ).agg( - pl.struct("time", "stec_dcb_corrected", "mf", "ipp_lat", "ipp_lon", "rx_lat") + pl.struct("time", "stec", "tx_bias", "mf", "ipp_lat", "ipp_lon", "rx_lat") .map_batches(estimate_func, return_dtype=pl.Float64, returns_scalar=True) .alias("rx_bias") ) @@ -168,7 +169,6 @@ def estimate_rx_bias( pl.col("time").dt.date().alias("date"), pl.col("prn").cat.slice(0, 1).alias("constellation"), ) - .drop("rx_bias") .join( bias_lf, on=["date", "station", "constellation", "C1_code", "C2_code"], @@ -197,7 +197,7 @@ def _mstd_rx_bias(s: pl.Series) -> float: def mean_std(bias: float) -> float: corrected = df.with_columns( - (pl.col("stec_dcb_corrected").sub(bias) / pl.col("mf")).alias("vtec") + (pl.col("stec").sub(pl.col("tx_bias") + bias) / pl.col("mf")).alias("vtec") ).with_columns(pl.col("vtec").std().over("time").mean().alias("mean_std")) return corrected.get_column("mean_std").item(0) @@ -246,6 +246,11 @@ def _lsq_rx_bias(s: pl.Series) -> float: .fill_null(np.nan) .to_numpy() ) - b = df.get_column("stec_dcb_corrected").fill_null(np.nan).to_numpy() + b = ( + df.select(pl.col("stec") - pl.col("tx_bias")) + .get_column("stec") + .fill_null(np.nan) + .to_numpy() + ) result = lsq_linear(A, b) return result.x[0] diff --git a/gnss_tec/tec/tec_calculation.py b/gnss_tec/tec/tec_calculation.py index 05a3774..3a38131 100644 --- a/gnss_tec/tec/tec_calculation.py +++ b/gnss_tec/tec/tec_calculation.py @@ -78,8 +78,6 @@ def _coalesce_observations( rx_bias_lf, on=["station", "constellation", "C1_code", "C2_code", "date"], ) - else: - codes_lf = codes_lf.with_columns(pl.lit(None).alias("rx_bias")) # ---- 3. Keep only the highest priority codes for C1 and C2. ---- codes_lf = ( @@ -416,24 +414,25 @@ def calc_tec_from_df( lf = lf.with_columns( # Convert biases from ns to TECU pl.col("tx_bias").mul(tecu_per_ns) - ).with_columns( - # sTEC corrected for satellite DCB biases, in TECU - pl.col("stec").sub(pl.col("tx_bias")).alias("stec_dcb_corrected") ) - if config.rx_bias != "external" and config.rx_bias is not None: - lf = estimate_rx_bias( - lf, method=config.rx_bias, downsample=sampling_interval < 10 - ) - else: + if config.rx_bias is None: + lf = lf.with_columns(pl.lit(None).alias("rx_bias")) + elif config.rx_bias == "external": lf = lf.with_columns( # Convert biases from ns to TECU pl.col("rx_bias").mul(tecu_per_ns) ) + else: + lf = estimate_rx_bias( + lf, method=config.rx_bias, downsample=sampling_interval < 10 + ) lf = lf.with_columns( # sTEC corrected for DCB biases, in TECU - pl.col("stec_dcb_corrected").sub(pl.col("rx_bias").fill_null(0)) + pl.col("stec") + .sub(pl.col("tx_bias") + pl.col("rx_bias").fill_null(0)) + .alias("stec_dcb_corrected") ).with_columns( # vTEC, in TECU (pl.col("stec_dcb_corrected") / pl.col("mf")).alias("vtec"), From af84561c4b1f0c947e77768439757fc4157401e8 Mon Sep 17 00:00:00 2001 From: Eureka0 Date: Mon, 15 Dec 2025 17:26:43 +0800 Subject: [PATCH 3/8] chore: remove redundant bias files --- .../CAS0OPSRAP_20240110000_01D_01D_DCB.BIA.gz | Bin 63358 -> 0 bytes .../GFZ0OPSRAP_20240110000_01D_01D_DCB.BIA.gz | Bin 49236 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 data/bias/CAS0OPSRAP_20240110000_01D_01D_DCB.BIA.gz delete mode 100644 data/bias/GFZ0OPSRAP_20240110000_01D_01D_DCB.BIA.gz diff --git a/data/bias/CAS0OPSRAP_20240110000_01D_01D_DCB.BIA.gz b/data/bias/CAS0OPSRAP_20240110000_01D_01D_DCB.BIA.gz deleted file mode 100644 index 92e8aa988a66e4d6b3df8a1b84c6692b3dc7acc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63358 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

pZp(>3jX+xRe1}*}Xx0R=altj`bad;<7W$R$ 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 a1~Y0#-8*Ze=TC9|6V diff --git a/data/bias/GFZ0OPSRAP_20240110000_01D_01D_DCB.BIA.gz b/data/bias/GFZ0OPSRAP_20240110000_01D_01D_DCB.BIA.gz deleted file mode 100644 index 3a45011a19dbe4b5172f1230f61478fdc67177bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49236 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 From 887d538887997ceefbc47cb8e08051848b954bf0 Mon Sep 17 00:00:00 2001 From: Eureka0 Date: Mon, 15 Dec 2025 17:27:01 +0800 Subject: [PATCH 4/8] doc: add benchmark results --- README.md | 13 ++++- benchmarks/bench.py | 116 ++++++++++++++++++++++++++++++++++++++++ benchmarks/benchmark.md | 12 +++++ pyproject.toml | 1 + uv.lock | 11 ++++ 5 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 benchmarks/bench.py create mode 100644 benchmarks/benchmark.md diff --git a/README.md b/README.md index 7d27c3f..f0acd9d 100644 --- a/README.md +++ b/README.md @@ -247,4 +247,15 @@ The meaning of each parameter is as follows: - `mapping_function`: The mapping function to use for converting slant TEC to vertical TEC. It can be set to 'slm' for the Single Layer Model or 'mslm' for the Modified Single Layer Model. - `retain_intermediate`: Names of intermediate columns to retain in the output DataFrame. It can be set to `None` to discard all intermediate columns, 'all' to retain all intermediate columns, or a list of column names to keep specific ones. -## Benchmarks +## Benchmarks (on M2 Pro 12-Core CPU) + +| Task | Time (s) | +|:----------------------------------------------------------|-----------:| +| Read RINEX v2 (3.65 MB) | 0.1362 | +| Read RINEX v3 (14.02 MB) | 0.7397 | +| Read RINEX v3 (6.05 MB Hatanaka-compressed) | 1.2468 | +| Read RINEX v3 (2.34 MB Hatanaka-compressed) | 0.5653 | +| Calculate TEC from RINEX v2 (3.65 MB) | 0.1457 | +| Calculate TEC from RINEX v3 (14.02 MB) | 0.7532 | +| Calculate TEC from RINEX v3 (6.05 MB Hatanaka-compressed) | 1.3067 | +| Calculate TEC from RINEX v3 (2.34 MB Hatanaka-compressed) | 0.5908 | diff --git a/benchmarks/bench.py b/benchmarks/bench.py new file mode 100644 index 0000000..c400dd9 --- /dev/null +++ b/benchmarks/bench.py @@ -0,0 +1,116 @@ +import os +from pathlib import Path +from time import perf_counter + +import pandas as pd + +import gnss_tec as gt + +# Constants +OBS_V2 = "data/rinex_obs_v2/dgar0100.24o.gz" +NAV_V2 = "data/rinex_nav_v2/brdc0100.24n.gz" +OBS_V3 = "data/rinex_obs_v3/CIBG00IDN_R_20240100000_01D_30S_MO.rnx.gz" +OBS_V3_CRX = "data/rinex_obs_v3/CIBG00IDN_R_20240100000_01D_30S_MO.crx.gz" +OBS_V3_CRX_SMALL = "data/rinex_obs_v3/BELE00BRA_R_20240100000_01D_30S_MO.crx.gz" +NAV_V3 = "data/rinex_nav_v3/BRDC00IGS_R_20240100000_01D_MN.rnx.gz" +BIAS = "data/bias/CAS0OPSRAP_20240100000_01D_01D_DCB.BIA.gz" +OUTPUT_FILE = "benchmarks/benchmark.md" + + +def benchmark_read_rinex(obs_path: str, nav_path: str) -> tuple[str, float]: + """Benchmark reading RINEX files.""" + start_time = perf_counter() + header, df = gt.read_rinex_obs(obs_path, nav_path) + df.collect() + end_time = perf_counter() + + if header.version.startswith("2"): + version = "2" + elif header.version.startswith("3"): + version = "3" + else: + raise ValueError(f"Unknown RINEX version: {header.version}") + + file_size = Path(obs_path).stat().st_size / (1024 * 1024) # in MB + + if "crx" in obs_path.lower(): + hatanaka = " Hatanaka-compressed" + else: + hatanaka = "" + + return ( + f"Read RINEX v{version} ({file_size:.2f} MB{hatanaka})", + end_time - start_time, + ) + + +def benchmark_calc_tec( + obs_path: str, nav_path: str, bias_path: str +) -> tuple[str, float]: + """Benchmark TEC calculation from RINEX files.""" + start_time = perf_counter() + header, lf = gt.read_rinex_obs(obs_path, nav_path) + df = gt.calc_tec_from_df(lf, header, bias_path) + df.collect() + end_time = perf_counter() + + if header.version.startswith("2"): + version = "2" + elif header.version.startswith("3"): + version = "3" + else: + raise ValueError(f"Unknown RINEX version: {header.version}") + + file_size = Path(obs_path).stat().st_size / (1024 * 1024) # in MB + + if "crx" in obs_path.lower(): + hatanaka = " Hatanaka-compressed" + else: + hatanaka = "" + + return ( + f"Calculate TEC from RINEX v{version} ({file_size:.2f} MB{hatanaka})", + end_time - start_time, + ) + + +def main(): + """Main function to run benchmarks and write results.""" + benchmarks = [ + benchmark_read_rinex(OBS_V2, NAV_V2), + benchmark_read_rinex(OBS_V3, NAV_V3), + benchmark_read_rinex(OBS_V3_CRX, NAV_V3), + benchmark_read_rinex(OBS_V3_CRX_SMALL, NAV_V3), + benchmark_calc_tec(OBS_V2, NAV_V2, BIAS), + benchmark_calc_tec(OBS_V3, NAV_V3, BIAS), + benchmark_calc_tec(OBS_V3_CRX, NAV_V3, BIAS), + benchmark_calc_tec(OBS_V3_CRX_SMALL, NAV_V3, BIAS), + ] + + # Create a DataFrame from the benchmark results + results_df = pd.DataFrame( + { + "Task": [b[0] for b in benchmarks], + "Time (s)": [f"{b[1]:.4f}" for b in benchmarks], + } + ) + + # Convert DataFrame to Markdown table + markdown_table = results_df.to_markdown(index=False) + + # Get system information + cpu_count = os.cpu_count() + system_info = f"M2 Pro {cpu_count}-Core CPU" + + # Write the Markdown table to the output file + with Path(OUTPUT_FILE).open("w") as f: + f.write(f"# Benchmark Results (on {system_info})\n\n") + f.write(markdown_table) + f.write("\n") + + print(f"Benchmark results written to {OUTPUT_FILE}") + print(markdown_table) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/benchmark.md b/benchmarks/benchmark.md new file mode 100644 index 0000000..bfabe96 --- /dev/null +++ b/benchmarks/benchmark.md @@ -0,0 +1,12 @@ +# Benchmark Results (on M2 Pro 12-Core CPU) + +| Task | Time (s) | +|:----------------------------------------------------------|-----------:| +| Read RINEX v2 (3.65 MB) | 0.1362 | +| Read RINEX v3 (14.02 MB) | 0.7397 | +| Read RINEX v3 (6.05 MB Hatanaka-compressed) | 1.2468 | +| Read RINEX v3 (2.34 MB Hatanaka-compressed) | 0.5653 | +| Calculate TEC from RINEX v2 (3.65 MB) | 0.1457 | +| Calculate TEC from RINEX v3 (14.02 MB) | 0.7532 | +| Calculate TEC from RINEX v3 (6.05 MB Hatanaka-compressed) | 1.3067 | +| Calculate TEC from RINEX v3 (2.34 MB Hatanaka-compressed) | 0.5908 | diff --git a/pyproject.toml b/pyproject.toml index 406de47..7cf5f52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,4 +47,5 @@ dev = [ "pytest>=8.4.2", "ruff>=0.14.6", "scipy-stubs>=1.15.3.0", + "tabulate>=0.9.0", ] diff --git a/uv.lock b/uv.lock index 4d51ce3..42d8f08 100644 --- a/uv.lock +++ b/uv.lock @@ -1494,6 +1494,7 @@ dev = [ { name = "ruff" }, { name = "scipy-stubs", version = "1.15.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy-stubs", version = "1.16.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "tabulate" }, ] [package.metadata] @@ -1514,6 +1515,7 @@ dev = [ { name = "pytest", specifier = ">=8.4.2" }, { name = "ruff", specifier = ">=0.14.6" }, { name = "scipy-stubs", specifier = ">=1.15.3.0" }, + { name = "tabulate", specifier = ">=0.9.0" }, ] [[package]] @@ -1996,6 +1998,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, ] +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, +] + [[package]] name = "tomli" version = "2.3.0" From 8e73d0e8981ff87fe789605cdb0ff5c4da1b9dda Mon Sep 17 00:00:00 2001 From: Eureka0 Date: Mon, 15 Dec 2025 17:30:04 +0800 Subject: [PATCH 5/8] doc: fix benchmark header link --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f0acd9d..fdf3546 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,11 @@ PyGNSS-TEC is a high-performance Python package leveraging Rust acceleration, de ## Features -- **RINEX File Reading**: Efficient reading and parsing of RINEX GNSS observation files using [rinex crate](https://crates.io/crates/rinex) (see [benchmarks](#benchmarks) for details). +- **RINEX File Reading**: Efficient reading and parsing of RINEX GNSS observation files using [rinex crate](https://crates.io/crates/rinex) (see [benchmarks](#benchmarks-on-m2-pro-12-core-cpu) for details). - **Multiple File Formats**: Support for RINEX versions 2.x and 3.x., as well as Hatanaka compressed files (e.g., .Z, .crx, .crx.gz). -- **TEC Calculation**: Efficiently compute TEC from dual-frequency GNSS observations using [polars](https://pola.rs/) DataFrames and lazy evaluation (see [benchmarks](#benchmarks) for details). - +- **TEC Calculation**: Efficiently compute TEC from dual-frequency GNSS observations using [polars](https://pola.rs/) DataFrames and lazy evaluation (see [benchmarks](#benchmarks-on-m2-pro-12-core-cpu) for details). - **Multi-GNSS Support**: Process observations from multiple GNSS constellations (see [Overview](#overview) for constellation support). - **Open-Source**: Fully open-source under the MIT License, encouraging community contributions and collaboration. From 53eb05474fd57ec446f66e581e735657f43522ec Mon Sep 17 00:00:00 2001 From: Eureka0 Date: Mon, 15 Dec 2025 17:32:50 +0800 Subject: [PATCH 6/8] doc: minor corrections --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fdf3546..3c6b51e 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ tec_lf = gt.calc_tec_from_df(lf, header, "./data/bias/CAS0OPSRAP_20240100000_01D #### From parquet file -Reading RINEX files is time-consuming, accounting for at least 80% of the total processing time. Thus, if you need to perform TEC calculation multiple times on the same RINEX files (e.g., when tuning configuration), it is recommended to save the parsed LazyFrame to a parquet file after the first read, and then use `calc_tec_from_parquet` for subsequent TEC calculations: +Reading RINEX files is time-consuming, accounting for at least 90% of the total calculation time. Thus, if you need to perform TEC calculation multiple times on the same RINEX files (e.g., when tuning configuration), it is recommended to save the parsed LazyFrame to a parquet file after the first read, and then use `calc_tec_from_parquet` for subsequent TEC calculations: ```python header, lf = gt.read_rinex_obs( From efbed8eb93f048df7195ccfc9d695bee688ad275 Mon Sep 17 00:00:00 2001 From: Eureka0 Date: Mon, 15 Dec 2025 18:01:06 +0800 Subject: [PATCH 7/8] fix: set correct default codes --- gnss_tec/tec/constants.py | 60 +++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/gnss_tec/tec/constants.py b/gnss_tec/tec/constants.py index d8d2fb9..16c6744 100644 --- a/gnss_tec/tec/constants.py +++ b/gnss_tec/tec/constants.py @@ -12,7 +12,7 @@ Re = 6378.137e3 """Earth radius in meters.""" -SUPPORTED_RINEX_VERSIONS = ["3"] +SUPPORTED_RINEX_VERSIONS = ["2", "3"] """Supported RINEX major versions.""" SUPPORTED_CONSTELLATIONS = {"C": "BDS", "G": "GPS"} @@ -137,6 +137,35 @@ def c2_priority(self, version: Literal["2", "3"]) -> Mapping[str, int]: priority[f"{const}_{code}"] = i return priority + @staticmethod + def validate_codes(codes, default) -> dict[str, dict[str, list[str]]]: + if not codes: + return default + + codes = dict(codes) + unknown = codes.keys() - SUPPORTED_RINEX_VERSIONS + if unknown: + raise ValueError( + f"Invalid RINEX versions in codes: {unknown}. " + f"Allowed versions are {SUPPORTED_RINEX_VERSIONS}." + ) + + validated_codes = {} + for ver in SUPPORTED_RINEX_VERSIONS: + if ver not in codes: + validated_codes[ver] = default[ver] + continue + + allowed = set(SUPPORTED_CONSTELLATIONS.keys()) + invalid = codes[ver].keys() - allowed + if invalid: + raise ValueError( + f"Invalid constellations in codes: {invalid}. " + f"Allowed constellations are {allowed}." + ) + validated_codes[ver] = default[ver] | dict(codes[ver]) + return validated_codes + def __post_init__(self): # Validate constellations allowed = set(SUPPORTED_CONSTELLATIONS.keys()) @@ -150,29 +179,12 @@ def __post_init__(self): ) # Set default codes if not provided - if not self.c1_codes: - object.__setattr__(self, "c1_codes", DEFAULT_C1_CODES) - else: - user_codes = dict(self.c1_codes) - unknown = user_codes.keys() - allowed - if unknown: - raise ValueError( - f"Invalid constellations in c1_codes: {unknown}. " - f"Allowed constellations are {allowed}." - ) - object.__setattr__(self, "c1_codes", DEFAULT_C1_CODES | user_codes) - - if not self.c2_codes: - object.__setattr__(self, "c2_codes", DEFAULT_C2_CODES) - else: - user_codes = dict(self.c2_codes) - unknown = user_codes.keys() - allowed - if unknown: - raise ValueError( - f"Invalid constellations in c2_codes: {unknown}. " - f"Allowed constellations are {allowed}." - ) - object.__setattr__(self, "c2_codes", DEFAULT_C2_CODES | user_codes) + object.__setattr__( + self, "c1_codes", self.validate_codes(self.c1_codes, DEFAULT_C1_CODES) + ) + object.__setattr__( + self, "c2_codes", self.validate_codes(self.c2_codes, DEFAULT_C2_CODES) + ) @dataclass(frozen=True) From b35837300fa8ffb9ab8bc72bb2b99f92f3d0c62e Mon Sep 17 00:00:00 2001 From: Eureka0 Date: Mon, 15 Dec 2025 18:02:23 +0800 Subject: [PATCH 8/8] docs: update c1_codes for version 2 support --- README.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3c6b51e..f469c40 100644 --- a/README.md +++ b/README.md @@ -222,12 +222,22 @@ print(gt.TECConfig()) # min_elevation=30.0, # min_snr=30.0, # c1_codes={ -# 'C': ['C2I', 'C2D', 'C2X', 'C1I', 'C1D', 'C1X', 'C2W', 'C1C'], -# 'G': ['C1W', 'C1C', 'C1X'] +# '2': { +# 'G': ['C1'] +# }, +# '3': { +# 'C': ['C2I', 'C2D', 'C2X', 'C1I', 'C1D', 'C1X', 'C2W', 'C1C'], +# 'G': ['C1W', 'C1C', 'C1X'] +# }, # }, # c2_codes={ -# 'C': ['C6I', 'C6D', 'C6X', 'C7I', 'C7D', 'C7X', 'C5I', 'C5D', 'C5X'], -# 'G': ['C2W', 'C2C', 'C2X', 'C5W', 'C5C', 'C5X'] +# '2': { +# 'G': ['C2', 'C5'] +# }, +# '3': { +# 'C': ['C6I', 'C6D', 'C6X', 'C7I', 'C7D', 'C7X', 'C5I', 'C5D', 'C5X'], +# 'G': ['C2W', 'C2C', 'C2X', 'C5W', 'C5C', 'C5X'] +# }, # }, # rx_bias='external', # mapping_function='slm', @@ -240,8 +250,8 @@ The meaning of each parameter is as follows: - `ipp_height`: The assumed height of the ionospheric pierce point (IPP) in kilometers. - `min_elevation`: The minimum satellite elevation angle (in degrees) for observations to be considered in the TEC calculation. - `min_snr`: The minimum signal-to-noise ratio (in dB-Hz) for observations to be considered in the TEC calculation. -- `c1_codes`: A dictionary specifying the preferred observation codes for the first frequency (C1) for each constellation. The codes are prioritized in the order they are listed, with the first available code being used. This parameter supports setting for partial constellations (e.g., `c1_codes={'C': [...]} ` to only set for Beidou, and use default for others). -- `c2_codes`: A dictionary specifying the preferred observation codes for the second frequency (C2) for each constellation, similar to `c1_codes`. +- `c1_codes`: A dictionary specifying the preferred observation codes for the first frequency (C1) for each RINEX version and constellation. The codes are prioritized in the order they are listed, with the first available code being used. This parameter supports partial setting (e.g., `c1_codes={'3': {'C': [...]} }` to only set for Beidou in RINEX version 3, and use default for others). +- `c2_codes`: A dictionary specifying the preferred observation codes for the second frequency (C2) for each RINEX version and constellation, similar to `c1_codes`. - `rx_bias`: Specifies how to handle receiver bias. It can be set to 'external' to use an external DCB file for correction, 'mstd' to use the minimum standard deviation method for estimation, 'lsq' to use least squares estimation, or `None` to skip receiver bias correction. Note that the receiver bias estimation is only applicable after the satellite bias has been corrected using an external DCB file (e.g., from IGS). If no external DCB file is provided, this parameter will be ignored. The 'mstd' and 'lsq' methods are for stations that are not included in the external DCB file. - `mapping_function`: The mapping function to use for converting slant TEC to vertical TEC. It can be set to 'slm' for the Single Layer Model or 'mslm' for the Modified Single Layer Model. - `retain_intermediate`: Names of intermediate columns to retain in the output DataFrame. It can be set to `None` to discard all intermediate columns, 'all' to retain all intermediate columns, or a list of column names to keep specific ones.