zju-scatt-interface 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. zju_scatt_interface-0.9.0/CHANGELOG.md +69 -0
  2. zju_scatt_interface-0.9.0/LICENSE +21 -0
  3. zju_scatt_interface-0.9.0/MANIFEST.in +7 -0
  4. zju_scatt_interface-0.9.0/PKG-INFO +210 -0
  5. zju_scatt_interface-0.9.0/README.md +175 -0
  6. zju_scatt_interface-0.9.0/configs/bulk_scheme.all_profiles.example.json +173 -0
  7. zju_scatt_interface-0.9.0/configs/bulk_scheme.example.json +66 -0
  8. zju_scatt_interface-0.9.0/configs/bulk_scheme.example.py +61 -0
  9. zju_scatt_interface-0.9.0/configs/multidimensional_bulk_scheme.example.py +68 -0
  10. zju_scatt_interface-0.9.0/configs/optical_table_format.example.py +53 -0
  11. zju_scatt_interface-0.9.0/configs/recipes/black_carbon_bulk.json +59 -0
  12. zju_scatt_interface-0.9.0/configs/recipes/dust_bulk.json +53 -0
  13. zju_scatt_interface-0.9.0/configs/recipes/ice_multi_temperature_bulk.json +73 -0
  14. zju_scatt_interface-0.9.0/configs/recipes/sea_salt_bulk.json +41 -0
  15. zju_scatt_interface-0.9.0/docs/ARCHITECTURE.md +81 -0
  16. zju_scatt_interface-0.9.0/docs/BULK_CALCULATION.md +246 -0
  17. zju_scatt_interface-0.9.0/docs/CUSTOM_OPTICAL_TABLE_OUTPUT.md +122 -0
  18. zju_scatt_interface-0.9.0/docs/GPT_USAGE_GUIDE.md +62 -0
  19. zju_scatt_interface-0.9.0/docs/INSTALLATION.md +181 -0
  20. zju_scatt_interface-0.9.0/docs/INTERPOLATION.md +178 -0
  21. zju_scatt_interface-0.9.0/docs/L1_CEXT_AND_BULK_UNITS.md +134 -0
  22. zju_scatt_interface-0.9.0/docs/LIVE_TESTING.md +29 -0
  23. zju_scatt_interface-0.9.0/docs/MULTIDIMENSIONAL_BULK_SCHEMES.md +97 -0
  24. zju_scatt_interface-0.9.0/docs/NATIVE_MODEL_FORMATS.md +262 -0
  25. zju_scatt_interface-0.9.0/docs/OUTPUT_FORMATS.md +183 -0
  26. zju_scatt_interface-0.9.0/docs/PARTICLE_ADAPTERS.md +181 -0
  27. zju_scatt_interface-0.9.0/docs/PARTICLE_PARAMETER_REFERENCE.md +117 -0
  28. zju_scatt_interface-0.9.0/docs/PARTICLE_PROFILES.md +220 -0
  29. zju_scatt_interface-0.9.0/docs/PARTICLE_RECIPES.md +117 -0
  30. zju_scatt_interface-0.9.0/docs/PROJECT_TASK_LIST.md +493 -0
  31. zju_scatt_interface-0.9.0/docs/PYPI_PUBLICATION.md +104 -0
  32. zju_scatt_interface-0.9.0/docs/REFRACTIVE_INDEX_RESOLUTION.md +181 -0
  33. zju_scatt_interface-0.9.0/docs/REGISTRATION.md +14 -0
  34. zju_scatt_interface-0.9.0/docs/RELEASE_CHECKLIST.md +58 -0
  35. zju_scatt_interface-0.9.0/docs/SCHEME_API_AND_CLI.md +220 -0
  36. zju_scatt_interface-0.9.0/docs/SIZE_DISTRIBUTIONS.md +208 -0
  37. zju_scatt_interface-0.9.0/docs/SOURCE_DEPENDENCY_PLANNING.md +129 -0
  38. zju_scatt_interface-0.9.0/docs/STATUS_REPORT_2026-07-23.md +401 -0
  39. zju_scatt_interface-0.9.0/docs/STATUS_UPDATE_2026-07-24.md +84 -0
  40. zju_scatt_interface-0.9.0/docs/STATUS_UPDATE_2026-07-26_PHASE10.md +86 -0
  41. zju_scatt_interface-0.9.0/docs/STATUS_UPDATE_2026-07-26_PHASE8.md +72 -0
  42. zju_scatt_interface-0.9.0/docs/STATUS_UPDATE_2026-07-26_PHASE9.md +62 -0
  43. zju_scatt_interface-0.9.0/docs/STATUS_UPDATE_2026-07-28_PHASE11.md +98 -0
  44. zju_scatt_interface-0.9.0/docs/SYSTEM_ARCHITECTURE_REVIEW.md +235 -0
  45. zju_scatt_interface-0.9.0/docs/TROUBLESHOOTING.md +99 -0
  46. zju_scatt_interface-0.9.0/examples/data/observed_psd_example.csv +12 -0
  47. zju_scatt_interface-0.9.0/examples/download_native_references.py +69 -0
  48. zju_scatt_interface-0.9.0/examples/example_01_catalog_search.py +97 -0
  49. zju_scatt_interface-0.9.0/examples/example_02_target_wavelength_retrieval.py +105 -0
  50. zju_scatt_interface-0.9.0/examples/example_03_bulk_scheme_validation.py +60 -0
  51. zju_scatt_interface-0.9.0/examples/example_04_observed_psd_csv.py +118 -0
  52. zju_scatt_interface-0.9.0/examples/example_05_interpolation_modes.py +156 -0
  53. zju_scatt_interface-0.9.0/examples/example_06_weighted_ice_shapes.py +125 -0
  54. zju_scatt_interface-0.9.0/examples/example_07_multidimensional_bulk_scheme.py +86 -0
  55. zju_scatt_interface-0.9.0/examples/example_08_export_model_table.py +70 -0
  56. zju_scatt_interface-0.9.0/examples/example_09_phase4_psd_validation.py +318 -0
  57. zju_scatt_interface-0.9.0/examples/example_10_phase5_interpolation_validation.py +227 -0
  58. zju_scatt_interface-0.9.0/examples/example_11_phase6_particle_adapter_validation.py +232 -0
  59. zju_scatt_interface-0.9.0/examples/example_12_phase7_bulk_pipeline_validation.py +278 -0
  60. zju_scatt_interface-0.9.0/examples/example_13_phase8_output_validation.py +208 -0
  61. zju_scatt_interface-0.9.0/examples/example_14_phase9_typed_and_cli_validation.py +260 -0
  62. zju_scatt_interface-0.9.0/examples/example_15_phase10_usability_validation.py +168 -0
  63. zju_scatt_interface-0.9.0/examples/example_16_phase11_release_readiness_validation.py +368 -0
  64. zju_scatt_interface-0.9.0/examples/example_17_native_model_formats.py +181 -0
  65. zju_scatt_interface-0.9.0/examples/verify_native_references.py +85 -0
  66. zju_scatt_interface-0.9.0/pyproject.toml +48 -0
  67. zju_scatt_interface-0.9.0/setup.cfg +4 -0
  68. zju_scatt_interface-0.9.0/src/zju_scatt_interface/__init__.py +271 -0
  69. zju_scatt_interface-0.9.0/src/zju_scatt_interface/__main__.py +3 -0
  70. zju_scatt_interface-0.9.0/src/zju_scatt_interface/_engine.py +6156 -0
  71. zju_scatt_interface-0.9.0/src/zju_scatt_interface/_version.py +7 -0
  72. zju_scatt_interface-0.9.0/src/zju_scatt_interface/adapters.py +912 -0
  73. zju_scatt_interface-0.9.0/src/zju_scatt_interface/auth.py +66 -0
  74. zju_scatt_interface-0.9.0/src/zju_scatt_interface/bulk.py +1138 -0
  75. zju_scatt_interface-0.9.0/src/zju_scatt_interface/catalog.py +42 -0
  76. zju_scatt_interface-0.9.0/src/zju_scatt_interface/cli.py +1108 -0
  77. zju_scatt_interface-0.9.0/src/zju_scatt_interface/client.py +21 -0
  78. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Black_carbon_refractive_index_statistics.csv +1972 -0
  79. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Dust_refractive_index_statistics.csv +1972 -0
  80. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Ice_refractive_index_statistics_extend100um.csv +9972 -0
  81. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Ice_refractive_index_used.csv +2001 -0
  82. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Nitrate_refractive_index_used.csv +26 -0
  83. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Organic_carbon_refractive_index_used.csv +26 -0
  84. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Sea_salt_refractive_index_statistics.csv +1972 -0
  85. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Sea_salt_refractive_index_used.csv +26 -0
  86. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Sulfate_refractive_index_used.csv +26 -0
  87. zju_scatt_interface-0.9.0/src/zju_scatt_interface/data/refractive_index/Water_refractive_index_used.csv +106 -0
  88. zju_scatt_interface-0.9.0/src/zju_scatt_interface/doctor.py +226 -0
  89. zju_scatt_interface-0.9.0/src/zju_scatt_interface/download.py +5 -0
  90. zju_scatt_interface-0.9.0/src/zju_scatt_interface/endpoints.py +65 -0
  91. zju_scatt_interface-0.9.0/src/zju_scatt_interface/errors.py +11 -0
  92. zju_scatt_interface-0.9.0/src/zju_scatt_interface/interpolation.py +1986 -0
  93. zju_scatt_interface-0.9.0/src/zju_scatt_interface/models.py +24 -0
  94. zju_scatt_interface-0.9.0/src/zju_scatt_interface/native_output.py +869 -0
  95. zju_scatt_interface-0.9.0/src/zju_scatt_interface/optical_models.py +74 -0
  96. zju_scatt_interface-0.9.0/src/zju_scatt_interface/planning.py +811 -0
  97. zju_scatt_interface-0.9.0/src/zju_scatt_interface/plotting.py +5 -0
  98. zju_scatt_interface-0.9.0/src/zju_scatt_interface/refractive_index.py +447 -0
  99. zju_scatt_interface-0.9.0/src/zju_scatt_interface/registry.py +828 -0
  100. zju_scatt_interface-0.9.0/src/zju_scatt_interface/retrieval.py +17 -0
  101. zju_scatt_interface-0.9.0/src/zju_scatt_interface/schemes/__init__.py +125 -0
  102. zju_scatt_interface-0.9.0/src/zju_scatt_interface/schemes/config.py +970 -0
  103. zju_scatt_interface-0.9.0/src/zju_scatt_interface/schemes/grid.py +464 -0
  104. zju_scatt_interface-0.9.0/src/zju_scatt_interface/schemes/output.py +1510 -0
  105. zju_scatt_interface-0.9.0/src/zju_scatt_interface/schemes/reference.py +207 -0
  106. zju_scatt_interface-0.9.0/src/zju_scatt_interface/schemes/table_output.py +525 -0
  107. zju_scatt_interface-0.9.0/src/zju_scatt_interface/size_distribution.py +708 -0
  108. zju_scatt_interface-0.9.0/src/zju_scatt_interface/source_schema.py +164 -0
  109. zju_scatt_interface-0.9.0/src/zju_scatt_interface/storage.py +15 -0
  110. zju_scatt_interface-0.9.0/src/zju_scatt_interface.egg-info/PKG-INFO +210 -0
  111. zju_scatt_interface-0.9.0/src/zju_scatt_interface.egg-info/SOURCES.txt +148 -0
  112. zju_scatt_interface-0.9.0/src/zju_scatt_interface.egg-info/dependency_links.txt +1 -0
  113. zju_scatt_interface-0.9.0/src/zju_scatt_interface.egg-info/entry_points.txt +3 -0
  114. zju_scatt_interface-0.9.0/src/zju_scatt_interface.egg-info/requires.txt +25 -0
  115. zju_scatt_interface-0.9.0/src/zju_scatt_interface.egg-info/top_level.txt +1 -0
  116. zju_scatt_interface-0.9.0/tests/data/trusted_bulk_reference_v1.json +19 -0
  117. zju_scatt_interface-0.9.0/tests/local_data.py +25 -0
  118. zju_scatt_interface-0.9.0/tests/test_adapters.py +398 -0
  119. zju_scatt_interface-0.9.0/tests/test_bulk_pipeline.py +305 -0
  120. zju_scatt_interface-0.9.0/tests/test_cli.py +125 -0
  121. zju_scatt_interface-0.9.0/tests/test_doctor.py +79 -0
  122. zju_scatt_interface-0.9.0/tests/test_engine_compatibility.py +844 -0
  123. zju_scatt_interface-0.9.0/tests/test_interpolation.py +640 -0
  124. zju_scatt_interface-0.9.0/tests/test_l1_cext_conversion.py +242 -0
  125. zju_scatt_interface-0.9.0/tests/test_live_download_opt_in.py +78 -0
  126. zju_scatt_interface-0.9.0/tests/test_multidimensional_bulk.py +182 -0
  127. zju_scatt_interface-0.9.0/tests/test_native_output.py +253 -0
  128. zju_scatt_interface-0.9.0/tests/test_phase10_examples.py +68 -0
  129. zju_scatt_interface-0.9.0/tests/test_phase10_reference_and_recipes.py +124 -0
  130. zju_scatt_interface-0.9.0/tests/test_phase11_module_boundaries.py +47 -0
  131. zju_scatt_interface-0.9.0/tests/test_phase11_numerical_regression.py +123 -0
  132. zju_scatt_interface-0.9.0/tests/test_phase11_output_robustness.py +106 -0
  133. zju_scatt_interface-0.9.0/tests/test_phase11_profile_matrix.py +399 -0
  134. zju_scatt_interface-0.9.0/tests/test_phase4_example.py +49 -0
  135. zju_scatt_interface-0.9.0/tests/test_phase5_example.py +45 -0
  136. zju_scatt_interface-0.9.0/tests/test_phase6_example.py +42 -0
  137. zju_scatt_interface-0.9.0/tests/test_phase7_example.py +43 -0
  138. zju_scatt_interface-0.9.0/tests/test_phase8_example.py +46 -0
  139. zju_scatt_interface-0.9.0/tests/test_phase8_output.py +270 -0
  140. zju_scatt_interface-0.9.0/tests/test_phase9_cli.py +218 -0
  141. zju_scatt_interface-0.9.0/tests/test_phase9_example.py +46 -0
  142. zju_scatt_interface-0.9.0/tests/test_phase9_scheme_api.py +217 -0
  143. zju_scatt_interface-0.9.0/tests/test_planning.py +258 -0
  144. zju_scatt_interface-0.9.0/tests/test_refractive_index.py +203 -0
  145. zju_scatt_interface-0.9.0/tests/test_registry.py +204 -0
  146. zju_scatt_interface-0.9.0/tests/test_scheme_config.py +75 -0
  147. zju_scatt_interface-0.9.0/tests/test_size_distribution.py +215 -0
  148. zju_scatt_interface-0.9.0/tests/test_super_spheroid_ice_requirements.py +604 -0
  149. zju_scatt_interface-0.9.0/tests/test_table_output.py +159 -0
  150. zju_scatt_interface-0.9.0/tools/prepare_release.py +86 -0
@@ -0,0 +1,69 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.9.0 - 2026-10-13 (prepared, not published)
6
+
7
+ - Set the initial public release candidate to `0.9.0`; plan further testing and
8
+ `0.9.x` fixes before considering `1.0.0`. Earlier `1.0.0a1` entries below
9
+ describe internal development checkpoints, not this public release.
10
+
11
+ - Included the September 2026 revised dust and black-carbon statistics and six
12
+ material reference CSVs in the release candidate.
13
+ - Recognized `Wavelength (in micrometers)` reference-table headers and tested all
14
+ twelve explicit ice temperature-column pairs.
15
+ - Added a regression check for the revised black-carbon means, clean staging and
16
+ artifact verification for releases, and a PyPI publication guide.
17
+ - Read build-time version metadata directly from `_version.py` and included tests,
18
+ Python scheme configurations, and the changelog in source distributions.
19
+
20
+ - Revised single-particle interpolation to combine logarithmic dimensional cross
21
+ sections and projected area, derive SSA/efficiencies afterward, interpolate
22
+ source-normalized phase ratios, and expose solid-angle-weighted phase L2 metrics.
23
+ - Added template-driven optical table export from in-memory results or canonical
24
+ NetCDF4/HDF5 products, with JSON/Python format specifications, unit transforms,
25
+ fixed-width rows, per-particle files, and phase-matrix long tables.
26
+ - Added retained multidimensional bulk-optics grids through `BulkDimension`,
27
+ `SingleBulkScheme`, and `MultiBulkScheme`, including particle-specific NetCDF4
28
+ and HDF5 dimensions, coordinate variables, phase matrices, and validation.
29
+ - Separated single-population calculation, custom aggregation, and output;
30
+ removed implicit `mixing_fraction` and `include_mixture` scheme behavior.
31
+ - Added Phase 11 eight-profile exact/interpolated fixture coverage, trusted
32
+ numerical references, output-corruption tests, opt-in live tests, expanded CI,
33
+ artifact checks, and clean-install validation.
34
+ - Corrected interpolation aliases so source symbols `n` and `alpha` map to
35
+ `roundness` and `aspect_ratio`.
36
+ - Separated package identity, exceptions, endpoints, and optical models from the
37
+ private compatibility engine.
38
+ - Completed Phase 10 user workflows with full BC, dust, sea-salt, and
39
+ multi-temperature ice recipes.
40
+ - Added observed-PSD CSV and interpolation/nearest/no-extrapolation examples.
41
+ - Added `bulk-opt schema` and Python machine-reference APIs for deterministic
42
+ GPT-assisted scheme creation.
43
+ - Added complete parameter, recipe, GPT-safety, and troubleshooting documentation,
44
+ plus Phase 10 tests and graphical validation.
45
+
46
+ ## 1.0.0a1 - Phase 2 registry work
47
+
48
+ - Added canonical scientific profiles for all eight local L1 particle families.
49
+ - Added `zju-scatt describe [PARTICLE_TYPE]` and JSON metadata output.
50
+ - Added optional L1 NetCDF source-schema and major-revision validation.
51
+ - Added automatic extended-length Windows paths for long scientific filenames.
52
+ - Documented empirical profile coverage, RH storage conventions, and size meanings.
53
+ - Converted L1 `cext = k^2 Cext` to physical cross sections in `m2`.
54
+ - Converted `xsize_veq` and `xsize_maxd` to physical radii in `um`.
55
+ - Converted user number concentrations from `cm-3` to `m-3` internally so bulk
56
+ coefficients are returned in `m-1`.
57
+ - Prevented silent flattening of multidimensional RH, volume-fraction, and shape
58
+ dimensions.
59
+
60
+ ## 1.0.0a1 - Phase 1 checkpoint (2026-07-23)
61
+
62
+ - Preserved the tested earlier command behavior behind the modular package.
63
+ - Added explicit direct and browser-assisted registration methods.
64
+ - Added actionable first-run and expired-session recovery guidance.
65
+ - Added the read-only `zju-scatt doctor` command with human and JSON reports.
66
+ - Added Windows, Linux, and macOS installation documentation.
67
+ - Added clean-install CI coverage for supported platforms and Python versions.
68
+ - Recorded the Python-first bulk-scheme design and minimal single-scattering-variable
69
+ policy for subsequent phases.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Senyi Kong and ZJU-SCATT Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,7 @@
1
+ recursive-include configs *.json *.py
2
+ recursive-include docs *.md
3
+ recursive-include examples *.py *.csv
4
+ recursive-include tests/data *.json
5
+ recursive-include tests *.py
6
+ include CHANGELOG.md
7
+ include tools/prepare_release.py
@@ -0,0 +1,210 @@
1
+ Metadata-Version: 2.4
2
+ Name: zju-scatt-interface
3
+ Version: 0.9.0
4
+ Summary: Search, retrieve, integrate, and visualize ZJU-SCATT optical data
5
+ Author: Senyi Kong
6
+ Maintainer: ZJU-SCATT Team
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://zju_radiation.deep-time.org/
9
+ Project-URL: Data browser, https://zju_radiation.deep-time.org/download
10
+ Keywords: ZJU-SCATT,atmospheric-radiation,remote-sensing,climate,optical-properties
11
+ Requires-Python: >=3.9
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ Provides-Extra: native
15
+ Requires-Dist: numpy>=1.23; extra == "native"
16
+ Requires-Dist: h5py>=3.9; extra == "native"
17
+ Requires-Dist: netCDF4>=1.6; extra == "native"
18
+ Provides-Extra: netcdf
19
+ Requires-Dist: h5py>=3.9; extra == "netcdf"
20
+ Requires-Dist: netCDF4>=1.6; extra == "netcdf"
21
+ Provides-Extra: plot
22
+ Requires-Dist: matplotlib>=3.7; extra == "plot"
23
+ Provides-Extra: all
24
+ Requires-Dist: numpy>=1.23; extra == "all"
25
+ Requires-Dist: h5py>=3.9; extra == "all"
26
+ Requires-Dist: matplotlib>=3.7; extra == "all"
27
+ Requires-Dist: netCDF4>=1.6; extra == "all"
28
+ Provides-Extra: dev
29
+ Requires-Dist: build>=1.2; extra == "dev"
30
+ Requires-Dist: h5py>=3.9; extra == "dev"
31
+ Requires-Dist: netCDF4>=1.6; extra == "dev"
32
+ Requires-Dist: ruff>=0.6; extra == "dev"
33
+ Requires-Dist: twine>=5.0; extra == "dev"
34
+ Dynamic: license-file
35
+
36
+ # ZJU-SCATT Interface
37
+
38
+ `zju_scatt_interface` is the modular Python and command-line interface for finding,
39
+ downloading, extracting, integrating, and plotting ZJU-SCATT optical data. It is
40
+ designed for users in atmospheric radiation, remote sensing, weather, and climate
41
+ modeling without requiring knowledge of the database's remote directory layout.
42
+
43
+ The current release candidate is `0.9.0`, intended for testing before `1.0.0`.
44
+
45
+ ## Install from PyPI (after publication)
46
+
47
+ ```console
48
+ python -m pip install "zju-scatt-interface[all]==0.9.0"
49
+ zju-scatt doctor --offline
50
+ ```
51
+
52
+ Use `zju-scatt-interface==0.9.0` for the standard-library-only core. The `[all]`
53
+ extra adds scientific file support and plotting. The import name is
54
+ `zju_scatt_interface`. Database downloads require separate registration.
55
+
56
+ This package provides the same `zju-scatt` command as the earlier `zju-scatt`
57
+ distribution; install them in separate virtual environments to avoid command
58
+ collisions. See `docs/PYPI_PUBLICATION.md` for release preparation and updates.
59
+
60
+ ## Install for development
61
+
62
+ ```console
63
+ python -m pip install -e ".[all]"
64
+ zju-scatt doctor --offline
65
+ zju-scatt --help
66
+ ```
67
+
68
+ The short command remains `zju-scatt`; the descriptive package and long command are
69
+ `zju_scatt_interface` and `zju-scatt-interface`.
70
+
71
+ See `docs/INSTALLATION.md` for Windows, Linux, and macOS setup plus first-run
72
+ diagnostics.
73
+
74
+ Run a complete online diagnostic after registration:
75
+
76
+ ```console
77
+ zju-scatt doctor
78
+ ```
79
+
80
+ ## Registration
81
+
82
+ Direct CLI registration is the default and covers normal use:
83
+
84
+ ```console
85
+ zju-scatt register
86
+ ```
87
+
88
+ For users who must complete the website form, the alternative is explicit:
89
+
90
+ ```console
91
+ zju-scatt register --method browser
92
+ ```
93
+
94
+ The terminal opens or prints the official page, explains how to obtain the session
95
+ token, validates it, and stores it without echoing it. `--browser-assisted` remains a
96
+ deprecated compatibility alias. Tokens must never be pasted into chat, committed, or
97
+ included in logs.
98
+
99
+ ## Existing workflows retained
100
+
101
+ All v1 commands are retained during modular migration: `browse`, `list`, `search`,
102
+ `estimate`, `retrieve`, `download`, `bulk`, `register`, `session`, `metadata`, and
103
+ `check`. Retrieval and explicit downloads create their output directories as needed.
104
+
105
+ ```console
106
+ zju-scatt retrieve --particle-type super_spheroid_ice \
107
+ --target-wavelength 0.67um --target-wavelength-mode interp \
108
+ --output-dir zju_scatt_data --yes
109
+ ```
110
+
111
+ The retrieval selector identifies source files in refractive-index `(n,k)` space and
112
+ records provenance. The completed calculation pipeline separately records when a
113
+ single-particle interpolated product was generated, integrates the user PSD, runs
114
+ physical QA, and can write equivalent NetCDF4 or HDF5 bulk products.
115
+
116
+ ## Python modules
117
+
118
+ | Module | Responsibility |
119
+ |---|---|
120
+ | `auth` | Direct registration, browser-token import, session validation |
121
+ | `catalog` | Browse/search, scientific filename metadata, manifests |
122
+ | `download` | Resumable downloads and automatic local storage |
123
+ | `retrieval` | High-level parameter requests and source selection |
124
+ | `planning` | Scheme dependency plans, verified cache, manifests, offline reports |
125
+ | `size_distribution` | Array/function/file PSDs, validation, conservative remapping |
126
+ | `bulk` | NetCDF loading and PSD-integrated optical properties |
127
+ | `schemes` | Typed multi-particle configs and NetCDF4/HDF5 output orchestration |
128
+ | `plotting` | Optional scientific plotting |
129
+
130
+ See `docs/ARCHITECTURE.md`, `docs/REGISTRATION.md`,
131
+ `docs/PARTICLE_PROFILES.md`, `docs/L1_CEXT_AND_BULK_UNITS.md`,
132
+ `docs/REFRACTIVE_INDEX_RESOLUTION.md`,
133
+ `docs/SOURCE_DEPENDENCY_PLANNING.md`,
134
+ `docs/SIZE_DISTRIBUTIONS.md`,
135
+ `docs/BULK_CALCULATION.md`, `docs/OUTPUT_FORMATS.md`,
136
+ `docs/SCHEME_API_AND_CLI.md`, `docs/MULTIDIMENSIONAL_BULK_SCHEMES.md`,
137
+ `docs/CUSTOM_OPTICAL_TABLE_OUTPUT.md`,
138
+ `docs/PARTICLE_PARAMETER_REFERENCE.md`, `docs/PARTICLE_RECIPES.md`,
139
+ `docs/GPT_USAGE_GUIDE.md`, `docs/TROUBLESHOOTING.md`,
140
+ `docs/LIVE_TESTING.md`, `docs/RELEASE_CHECKLIST.md`,
141
+ `docs/PROJECT_TASK_LIST.md`,
142
+ `docs/STATUS_REPORT_2026-07-23.md`, `docs/STATUS_UPDATE_2026-07-24.md`,
143
+ `docs/STATUS_UPDATE_2026-07-26_PHASE8.md`,
144
+ `docs/STATUS_UPDATE_2026-07-26_PHASE9.md`,
145
+ `docs/STATUS_UPDATE_2026-07-26_PHASE10.md`,
146
+ `docs/STATUS_UPDATE_2026-07-28_PHASE11.md`, the
147
+ configuration in `configs/`, and the runnable
148
+ scripts in `examples/`. Validate a scheme before running any network or scientific
149
+ calculation:
150
+
151
+ ```console
152
+ zju-scatt scheme configs/bulk_scheme.example.json
153
+ zju-scatt scheme-sources configs/bulk_scheme.example.json \
154
+ --workspace zju_scatt_data
155
+ zju-scatt psd-check configs/bulk_scheme.example.json
156
+ zju-scatt bulk-opt validate configs/bulk_scheme.example.json
157
+ zju-scatt bulk-opt plan configs/bulk_scheme.example.json --dry-run
158
+ ```
159
+
160
+ Generate the authoritative machine-readable reference or start from a complete
161
+ particle recipe:
162
+
163
+ ```console
164
+ zju-scatt bulk-opt schema --json
165
+ zju-scatt bulk-opt schema --particle-type super_spheroid_ice --json
166
+ zju-scatt bulk-opt validate configs/recipes/ice_multi_temperature_bulk.json
167
+ python examples/example_04_observed_psd_csv.py
168
+ python examples/example_05_interpolation_modes.py
169
+ python examples/example_16_phase11_release_readiness_validation.py
170
+ ```
171
+
172
+ ## Verification
173
+
174
+ Native ARTS 2.x XML, CRTM CloudCoeff release-3 NetCDF/binary, and RTTOV13 HDF5
175
+ exports are available through structured JSON templates. See
176
+ [Native model formats](docs/NATIVE_MODEL_FORMATS.md) for the format assessment,
177
+ required variables and normalization, supported versions, and reference checks.
178
+
179
+ ```console
180
+ python -m pip install -e ".[native]"
181
+ python examples/example_17_native_model_formats.py --output native_model_output
182
+ ```
183
+
184
+ First install the package from the project root:
185
+
186
+ ```console
187
+ python -m pip install -e .
188
+ python -m unittest discover -s tests -v
189
+ python -m zju_scatt_interface --help
190
+ ```
191
+
192
+ Run only the CLI tests:
193
+
194
+ ```console
195
+ python tests/test_cli.py
196
+ ```
197
+
198
+ For a quick source-tree run without installation:
199
+
200
+ ```console
201
+ PYTHONPATH=src python tests/test_cli.py
202
+ PYTHONPATH=src python -m unittest discover -s tests -v
203
+ ```
204
+
205
+ In Windows PowerShell, replace the inline assignment with:
206
+
207
+ ```powershell
208
+ $env:PYTHONPATH = (Resolve-Path src).Path
209
+ python tests\test_cli.py
210
+ ```
@@ -0,0 +1,175 @@
1
+ # ZJU-SCATT Interface
2
+
3
+ `zju_scatt_interface` is the modular Python and command-line interface for finding,
4
+ downloading, extracting, integrating, and plotting ZJU-SCATT optical data. It is
5
+ designed for users in atmospheric radiation, remote sensing, weather, and climate
6
+ modeling without requiring knowledge of the database's remote directory layout.
7
+
8
+ The current release candidate is `0.9.0`, intended for testing before `1.0.0`.
9
+
10
+ ## Install from PyPI (after publication)
11
+
12
+ ```console
13
+ python -m pip install "zju-scatt-interface[all]==0.9.0"
14
+ zju-scatt doctor --offline
15
+ ```
16
+
17
+ Use `zju-scatt-interface==0.9.0` for the standard-library-only core. The `[all]`
18
+ extra adds scientific file support and plotting. The import name is
19
+ `zju_scatt_interface`. Database downloads require separate registration.
20
+
21
+ This package provides the same `zju-scatt` command as the earlier `zju-scatt`
22
+ distribution; install them in separate virtual environments to avoid command
23
+ collisions. See `docs/PYPI_PUBLICATION.md` for release preparation and updates.
24
+
25
+ ## Install for development
26
+
27
+ ```console
28
+ python -m pip install -e ".[all]"
29
+ zju-scatt doctor --offline
30
+ zju-scatt --help
31
+ ```
32
+
33
+ The short command remains `zju-scatt`; the descriptive package and long command are
34
+ `zju_scatt_interface` and `zju-scatt-interface`.
35
+
36
+ See `docs/INSTALLATION.md` for Windows, Linux, and macOS setup plus first-run
37
+ diagnostics.
38
+
39
+ Run a complete online diagnostic after registration:
40
+
41
+ ```console
42
+ zju-scatt doctor
43
+ ```
44
+
45
+ ## Registration
46
+
47
+ Direct CLI registration is the default and covers normal use:
48
+
49
+ ```console
50
+ zju-scatt register
51
+ ```
52
+
53
+ For users who must complete the website form, the alternative is explicit:
54
+
55
+ ```console
56
+ zju-scatt register --method browser
57
+ ```
58
+
59
+ The terminal opens or prints the official page, explains how to obtain the session
60
+ token, validates it, and stores it without echoing it. `--browser-assisted` remains a
61
+ deprecated compatibility alias. Tokens must never be pasted into chat, committed, or
62
+ included in logs.
63
+
64
+ ## Existing workflows retained
65
+
66
+ All v1 commands are retained during modular migration: `browse`, `list`, `search`,
67
+ `estimate`, `retrieve`, `download`, `bulk`, `register`, `session`, `metadata`, and
68
+ `check`. Retrieval and explicit downloads create their output directories as needed.
69
+
70
+ ```console
71
+ zju-scatt retrieve --particle-type super_spheroid_ice \
72
+ --target-wavelength 0.67um --target-wavelength-mode interp \
73
+ --output-dir zju_scatt_data --yes
74
+ ```
75
+
76
+ The retrieval selector identifies source files in refractive-index `(n,k)` space and
77
+ records provenance. The completed calculation pipeline separately records when a
78
+ single-particle interpolated product was generated, integrates the user PSD, runs
79
+ physical QA, and can write equivalent NetCDF4 or HDF5 bulk products.
80
+
81
+ ## Python modules
82
+
83
+ | Module | Responsibility |
84
+ |---|---|
85
+ | `auth` | Direct registration, browser-token import, session validation |
86
+ | `catalog` | Browse/search, scientific filename metadata, manifests |
87
+ | `download` | Resumable downloads and automatic local storage |
88
+ | `retrieval` | High-level parameter requests and source selection |
89
+ | `planning` | Scheme dependency plans, verified cache, manifests, offline reports |
90
+ | `size_distribution` | Array/function/file PSDs, validation, conservative remapping |
91
+ | `bulk` | NetCDF loading and PSD-integrated optical properties |
92
+ | `schemes` | Typed multi-particle configs and NetCDF4/HDF5 output orchestration |
93
+ | `plotting` | Optional scientific plotting |
94
+
95
+ See `docs/ARCHITECTURE.md`, `docs/REGISTRATION.md`,
96
+ `docs/PARTICLE_PROFILES.md`, `docs/L1_CEXT_AND_BULK_UNITS.md`,
97
+ `docs/REFRACTIVE_INDEX_RESOLUTION.md`,
98
+ `docs/SOURCE_DEPENDENCY_PLANNING.md`,
99
+ `docs/SIZE_DISTRIBUTIONS.md`,
100
+ `docs/BULK_CALCULATION.md`, `docs/OUTPUT_FORMATS.md`,
101
+ `docs/SCHEME_API_AND_CLI.md`, `docs/MULTIDIMENSIONAL_BULK_SCHEMES.md`,
102
+ `docs/CUSTOM_OPTICAL_TABLE_OUTPUT.md`,
103
+ `docs/PARTICLE_PARAMETER_REFERENCE.md`, `docs/PARTICLE_RECIPES.md`,
104
+ `docs/GPT_USAGE_GUIDE.md`, `docs/TROUBLESHOOTING.md`,
105
+ `docs/LIVE_TESTING.md`, `docs/RELEASE_CHECKLIST.md`,
106
+ `docs/PROJECT_TASK_LIST.md`,
107
+ `docs/STATUS_REPORT_2026-07-23.md`, `docs/STATUS_UPDATE_2026-07-24.md`,
108
+ `docs/STATUS_UPDATE_2026-07-26_PHASE8.md`,
109
+ `docs/STATUS_UPDATE_2026-07-26_PHASE9.md`,
110
+ `docs/STATUS_UPDATE_2026-07-26_PHASE10.md`,
111
+ `docs/STATUS_UPDATE_2026-07-28_PHASE11.md`, the
112
+ configuration in `configs/`, and the runnable
113
+ scripts in `examples/`. Validate a scheme before running any network or scientific
114
+ calculation:
115
+
116
+ ```console
117
+ zju-scatt scheme configs/bulk_scheme.example.json
118
+ zju-scatt scheme-sources configs/bulk_scheme.example.json \
119
+ --workspace zju_scatt_data
120
+ zju-scatt psd-check configs/bulk_scheme.example.json
121
+ zju-scatt bulk-opt validate configs/bulk_scheme.example.json
122
+ zju-scatt bulk-opt plan configs/bulk_scheme.example.json --dry-run
123
+ ```
124
+
125
+ Generate the authoritative machine-readable reference or start from a complete
126
+ particle recipe:
127
+
128
+ ```console
129
+ zju-scatt bulk-opt schema --json
130
+ zju-scatt bulk-opt schema --particle-type super_spheroid_ice --json
131
+ zju-scatt bulk-opt validate configs/recipes/ice_multi_temperature_bulk.json
132
+ python examples/example_04_observed_psd_csv.py
133
+ python examples/example_05_interpolation_modes.py
134
+ python examples/example_16_phase11_release_readiness_validation.py
135
+ ```
136
+
137
+ ## Verification
138
+
139
+ Native ARTS 2.x XML, CRTM CloudCoeff release-3 NetCDF/binary, and RTTOV13 HDF5
140
+ exports are available through structured JSON templates. See
141
+ [Native model formats](docs/NATIVE_MODEL_FORMATS.md) for the format assessment,
142
+ required variables and normalization, supported versions, and reference checks.
143
+
144
+ ```console
145
+ python -m pip install -e ".[native]"
146
+ python examples/example_17_native_model_formats.py --output native_model_output
147
+ ```
148
+
149
+ First install the package from the project root:
150
+
151
+ ```console
152
+ python -m pip install -e .
153
+ python -m unittest discover -s tests -v
154
+ python -m zju_scatt_interface --help
155
+ ```
156
+
157
+ Run only the CLI tests:
158
+
159
+ ```console
160
+ python tests/test_cli.py
161
+ ```
162
+
163
+ For a quick source-tree run without installation:
164
+
165
+ ```console
166
+ PYTHONPATH=src python tests/test_cli.py
167
+ PYTHONPATH=src python -m unittest discover -s tests -v
168
+ ```
169
+
170
+ In Windows PowerShell, replace the inline assignment with:
171
+
172
+ ```powershell
173
+ $env:PYTHONPATH = (Resolve-Path src).Path
174
+ python tests\test_cli.py
175
+ ```
@@ -0,0 +1,173 @@
1
+ {
2
+ "schema_version": "1.0",
3
+ "name": "all_profile_parameter_reference",
4
+ "wavelength_unit": "um",
5
+ "wavelengths": [0.55],
6
+ "interpolation": "linear",
7
+ "particles": [
8
+ {
9
+ "name": "dust",
10
+ "particle_type": "super_spheroid",
11
+ "size_distribution": {
12
+ "size": [0.1, 0.3, 1.0, 3.0],
13
+ "dndr": [10.0, 40.0, 30.0, 5.0],
14
+ "size_unit": "um",
15
+ "size_definition": "volume_equivalent_sphere_radius"
16
+ },
17
+ "refractive_index": {
18
+ "mode": "fixed",
19
+ "real": 1.5,
20
+ "imaginary": 0.01
21
+ },
22
+ "shape_parameters": {
23
+ "roundness": {
24
+ "values": [2.0, 2.5],
25
+ "weights": [0.4, 0.6]
26
+ },
27
+ "aspect_ratio": 1.5
28
+ }
29
+ },
30
+ {
31
+ "name": "black_carbon",
32
+ "particle_type": "encapsulated_fractal_aggregates_black_carbon",
33
+ "size_distribution": {
34
+ "size": [0.03, 0.1, 0.3, 1.0],
35
+ "dndr": [20.0, 100.0, 40.0, 2.0],
36
+ "size_unit": "um",
37
+ "size_definition": "volume_equivalent_sphere_radius"
38
+ },
39
+ "refractive_index": {
40
+ "mode": "fixed",
41
+ "black_carbon": {
42
+ "real": 1.85,
43
+ "imaginary": 0.55
44
+ },
45
+ "hygroscopic": {
46
+ "real": 1.4,
47
+ "imaginary": 0.05
48
+ }
49
+ },
50
+ "shape_parameters": {
51
+ "df": {
52
+ "values": [1.8, 2.4],
53
+ "weights": [0.5, 0.5]
54
+ },
55
+ "vf": 0.2
56
+ }
57
+ },
58
+ {
59
+ "name": "sea_salt",
60
+ "particle_type": "coated_super_spheroid_seasalt",
61
+ "size_distribution": {
62
+ "size": [0.05, 0.2, 1.0, 5.0],
63
+ "dndr": [50.0, 100.0, 20.0, 1.0],
64
+ "size_definition": "maximum_dimension_radius"
65
+ },
66
+ "refractive_index": {
67
+ "mode": "database"
68
+ },
69
+ "shape_parameters": {
70
+ "relative_humidity": {
71
+ "values": [0.5, 0.8],
72
+ "weights": [0.3, 0.7]
73
+ },
74
+ "humidity_branch": "deliquescence"
75
+ }
76
+ },
77
+ {
78
+ "name": "ice",
79
+ "particle_type": "super_spheroid_ice",
80
+ "size_distribution": {
81
+ "size": [5.0, 10.0, 30.0, 100.0],
82
+ "dndr": [1.0, 10.0, 5.0, 0.5],
83
+ "size_definition": "volume_equivalent_sphere_radius"
84
+ },
85
+ "refractive_index": {
86
+ "mode": "database_temperature",
87
+ "temperature_k": 250.0
88
+ },
89
+ "shape_ensemble": [
90
+ {
91
+ "roundness": 2.0,
92
+ "aspect_ratio": 1.0,
93
+ "weight": 0.4
94
+ },
95
+ {
96
+ "roundness": 2.5,
97
+ "aspect_ratio": 1.5,
98
+ "weight": 0.6
99
+ }
100
+ ]
101
+ },
102
+ {
103
+ "name": "sulfate",
104
+ "particle_type": "sphere_sulfate",
105
+ "size_distribution": {
106
+ "size": [0.03, 0.1, 0.3, 1.0],
107
+ "dndr": [100.0, 500.0, 100.0, 5.0]
108
+ },
109
+ "refractive_index": {
110
+ "mode": "database"
111
+ },
112
+ "shape_parameters": {
113
+ "relative_humidity": 0.8
114
+ }
115
+ },
116
+ {
117
+ "name": "nitrate",
118
+ "particle_type": "sphere_nitrate",
119
+ "size_distribution": {
120
+ "size": [0.03, 0.1, 0.3, 1.0],
121
+ "dndr": [100.0, 500.0, 100.0, 5.0]
122
+ },
123
+ "refractive_index": {
124
+ "mode": "database"
125
+ },
126
+ "shape_parameters": {
127
+ "relative_humidity": 0.8
128
+ }
129
+ },
130
+ {
131
+ "name": "organic_carbon",
132
+ "particle_type": "sphere_organic_carbon",
133
+ "size_distribution": {
134
+ "size": [0.03, 0.1, 0.3, 1.0],
135
+ "dndr": [100.0, 500.0, 100.0, 5.0]
136
+ },
137
+ "refractive_index": {
138
+ "mode": "database"
139
+ },
140
+ "shape_parameters": {
141
+ "relative_humidity": 0.8
142
+ }
143
+ },
144
+ {
145
+ "name": "water_cloud",
146
+ "particle_type": "sphere_water_cloud",
147
+ "size_distribution": {
148
+ "size": [1.0, 3.0, 10.0, 30.0],
149
+ "dndr": [1.0, 10.0, 50.0, 5.0]
150
+ },
151
+ "refractive_index": {
152
+ "mode": "database"
153
+ }
154
+ }
155
+ ],
156
+ "calculation": {
157
+ "include_phase_matrix": true,
158
+ "scattering_angles_degrees": [0, 30, 60, 90, 120, 150, 180],
159
+ "truncation_policy": "truncate",
160
+ "check_convergence": true,
161
+ "convergence_tolerance": 0.05,
162
+ "strict_convergence": false,
163
+ "strict_qa": true
164
+ },
165
+ "output": {
166
+ "path": "outputs/all_profile_reference.h5",
167
+ "format": "hdf5",
168
+ "compression": true,
169
+ "compression_level": 4,
170
+ "chunk_wavelength": 32,
171
+ "atomic": true
172
+ }
173
+ }