aerosolprops 0.1.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 (39) hide show
  1. aerosolprops-0.1.0/LICENSE +21 -0
  2. aerosolprops-0.1.0/PKG-INFO +125 -0
  3. aerosolprops-0.1.0/README.md +90 -0
  4. aerosolprops-0.1.0/pyproject.toml +57 -0
  5. aerosolprops-0.1.0/setup.cfg +4 -0
  6. aerosolprops-0.1.0/src/aerosolprops/__init__.py +56 -0
  7. aerosolprops-0.1.0/src/aerosolprops/boiling_point.py +637 -0
  8. aerosolprops-0.1.0/src/aerosolprops/fragmentation.py +170 -0
  9. aerosolprops-0.1.0/src/aerosolprops/methods/__init__.py +10 -0
  10. aerosolprops-0.1.0/src/aerosolprops/methods/evaporation.py +469 -0
  11. aerosolprops-0.1.0/src/aerosolprops/methods/myrdal_yalkowsky.py +463 -0
  12. aerosolprops-0.1.0/src/aerosolprops/methods/nannoolal_bp.py +732 -0
  13. aerosolprops-0.1.0/src/aerosolprops/methods/nannoolal_vp.py +810 -0
  14. aerosolprops-0.1.0/src/aerosolprops/methods/simpol1.py +373 -0
  15. aerosolprops-0.1.0/src/aerosolprops/structure.py +198 -0
  16. aerosolprops-0.1.0/src/aerosolprops/topology.py +146 -0
  17. aerosolprops-0.1.0/src/aerosolprops/vapour_pressure.py +2208 -0
  18. aerosolprops-0.1.0/src/aerosolprops.egg-info/PKG-INFO +125 -0
  19. aerosolprops-0.1.0/src/aerosolprops.egg-info/SOURCES.txt +37 -0
  20. aerosolprops-0.1.0/src/aerosolprops.egg-info/dependency_links.txt +1 -0
  21. aerosolprops-0.1.0/src/aerosolprops.egg-info/requires.txt +9 -0
  22. aerosolprops-0.1.0/src/aerosolprops.egg-info/top_level.txt +1 -0
  23. aerosolprops-0.1.0/tests/test_boiling_point.py +319 -0
  24. aerosolprops-0.1.0/tests/test_evaporation.py +426 -0
  25. aerosolprops-0.1.0/tests/test_fragmentation.py +103 -0
  26. aerosolprops-0.1.0/tests/test_myrdal_yalkowsky.py +243 -0
  27. aerosolprops-0.1.0/tests/test_myrdal_yalkowsky_descriptors.py +339 -0
  28. aerosolprops-0.1.0/tests/test_myrdal_yalkowsky_wrapper.py +252 -0
  29. aerosolprops-0.1.0/tests/test_nannoolal_vp.py +467 -0
  30. aerosolprops-0.1.0/tests/test_nannoolal_vp_coefficients.py +333 -0
  31. aerosolprops-0.1.0/tests/test_oracle_evaporation.py +177 -0
  32. aerosolprops-0.1.0/tests/test_oracle_myrdal_yalkowsky.py +220 -0
  33. aerosolprops-0.1.0/tests/test_oracle_nannoolal.py +474 -0
  34. aerosolprops-0.1.0/tests/test_oracle_nannoolal_vp.py +550 -0
  35. aerosolprops-0.1.0/tests/test_oracle_umansysprop.py +261 -0
  36. aerosolprops-0.1.0/tests/test_package.py +27 -0
  37. aerosolprops-0.1.0/tests/test_simpol1.py +374 -0
  38. aerosolprops-0.1.0/tests/test_structure.py +46 -0
  39. aerosolprops-0.1.0/tests/test_topology.py +45 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 The aerosolprops developers
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,125 @@
1
+ Metadata-Version: 2.4
2
+ Name: aerosolprops
3
+ Version: 0.1.0
4
+ Summary: Structure-derived pure-component properties for atmospheric organic aerosol: vapour pressures and boiling points by group contribution
5
+ Author: Fan Zhang
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/openEarthModelling/aerosolprops
8
+ Project-URL: Repository, https://github.com/openEarthModelling/aerosolprops
9
+ Project-URL: Changelog, https://github.com/openEarthModelling/aerosolprops/blob/main/CHANGELOG.md
10
+ Keywords: atmospheric chemistry,aerosol,SOA,vapour pressure,boiling point,group contribution,RDKit,thermo
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
23
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
24
+ Requires-Python: >=3.9
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: thermo>=0.6.1
28
+ Requires-Dist: rdkit>=2023.9
29
+ Provides-Extra: test
30
+ Requires-Dist: pytest>=7.0; extra == "test"
31
+ Provides-Extra: docs
32
+ Requires-Dist: mkdocs>=1.5; extra == "docs"
33
+ Requires-Dist: mkdocs-material>=9.0; extra == "docs"
34
+ Dynamic: license-file
35
+
36
+ # aerosolprops
37
+
38
+ [![CI](https://github.com/openEarthModelling/aerosolprops/actions/workflows/ci.yml/badge.svg)](https://github.com/openEarthModelling/aerosolprops/actions/workflows/ci.yml)
39
+
40
+ Structure-derived pure-component properties for atmospheric organic aerosol.
41
+
42
+ `aerosolprops` is a modern successor to the pure-component property methods of
43
+ [UManSysProp](https://github.com/loftytopping/UManSysProp_public)
44
+ (Topping et al., GMD 9, 899–911, 2016), rebuilt on
45
+ [RDKit](https://www.rdkit.org/) as the structure engine and following the
46
+ conventions of the [`thermo`](https://github.com/CalebBell/thermo) package
47
+ family: strict SI units, estimators as pure functions of group counts where
48
+ possible, and failures that return `None` rather than raise.
49
+
50
+ **Status: pre-alpha.** The repository currently contains the packaging
51
+ skeleton, CI, documentation scaffold, the structure/topology foundation
52
+ layers, and the first estimator (SIMPOL.1). The remaining methods below
53
+ land one at a time, each with coefficients entered from the published
54
+ papers and tests against literature values.
55
+
56
+ ## Methods (v0.1)
57
+
58
+ | Method | Property | Status | Reference |
59
+ |---|---|---|---|
60
+ | SIMPOL.1 | Vapour pressure | implemented | Pankow & Asher, [ACP 8, 2773 (2008)](https://doi.org/10.5194/acp-8-2773-2008) |
61
+ | EVAPORATION | Vapour pressure | implemented | Compernolle et al., [ACP 11, 9431 (2011)](https://doi.org/10.5194/acp-11-9431-2011) |
62
+ | Nannoolal Part 1 (+ SOA extension groups) | Normal boiling point | implemented | Nannoolal et al., [FPE 226, 45 (2004)](https://doi.org/10.1016/j.fluid.2004.09.001); Compernolle et al., [ACP 10, 6271 (2010)](https://doi.org/10.5194/acp-10-6271-2010) |
63
+ | Nannoolal Part 3 | Vapour pressure | implemented | Nannoolal et al., [FPE 269, 117 (2008)](https://doi.org/10.1016/j.fluid.2008.04.020) |
64
+ | Myrdal–Yalkowsky (+ H-bonding extension) | Vapour pressure | implemented | Myrdal & Yalkowsky, [IECR 36, 2494 (1997)](https://doi.org/10.1021/ie950242l); Compernolle et al., [ACP 10, 6271 (2010)](https://doi.org/10.5194/acp-10-6271-2010) |
65
+
66
+ Boiling points used as inputs (by Myrdal–Yalkowsky and Nannoolal Part 3) can
67
+ come from the self-implemented Nannoolal Part 1 route, from `thermo`'s
68
+ built-in Joback method, or from experimental data — `aerosolprops` does **not**
69
+ reimplement Joback.
70
+
71
+ ## Installation
72
+
73
+ ```bash
74
+ pip install aerosolprops
75
+ ```
76
+
77
+ RDKit and `thermo` are required dependencies.
78
+
79
+ ## Design notes
80
+
81
+ - **Units are strictly SI** (Pa, K, mol); property failures return `None`.
82
+ - **RDKit is the structure engine and a required dependency.** It is
83
+ imported lazily, and estimators ultimately consume group-count
84
+ dictionaries — the same interface `thermo` uses for its own
85
+ RDKit-optional group-contribution methods — so pieces remain extractable
86
+ upstream.
87
+ - **No molecular descriptors.** Every method needs only 2D graph quantities:
88
+ SMARTS substructure counts, ring perception, composition, and a few
89
+ connectivity queries. No fingerprints, no 3D, no descriptor packages.
90
+ - **No home-grown graph algorithms.** The graph primitives (connected
91
+ components, ring distances, neighbour queries) are RDKit built-ins;
92
+ `aerosolprops.topology` only wraps them. What is method-specific is the
93
+ translation of paper semantics (e.g. SIMPOL.1 "acid-side carbons",
94
+ EVAPORATION "in-chain oxygen") onto those primitives.
95
+ - **`thermo` compatibility.** aerosolprops hard-depends on `thermo` and follows
96
+ its group-contribution conventions (`{group_id: coefficient record}`
97
+ catalogues, counts-based static estimators, Joback-style one-time
98
+ fragmenting wrappers). Where a method's counting semantics do not fit
99
+ `thermo`'s mutually-exclusive SMARTS partition (SIMPOL.1's groups overlap
100
+ and replace one another additively), aerosolprops ships its own fragmenter
101
+ but keeps the same interface, so pieces can still be contributed upstream
102
+ with minimal rework.
103
+
104
+ ## Licensing and data provenance
105
+
106
+ `aerosolprops` is MIT-licensed. Coefficients are entered from the published
107
+ papers cited above (facts, not copyrightable expression), and SMARTS
108
+ patterns are authored from the group definitions in those papers.
109
+ UManSysProp is used **only** as a behavioural test oracle during development;
110
+ no code or data files are copied from it.
111
+
112
+ ## Development
113
+
114
+ ```bash
115
+ uv venv && uv pip install -e ".[test,docs]"
116
+ pytest # unit tests + doctests
117
+ mkdocs serve # documentation
118
+ ```
119
+
120
+ CI runs the full test matrix (with doctests) on Linux/macOS/Windows for
121
+ Python 3.9–3.14, plus a strict docs build.
122
+
123
+ ## License
124
+
125
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,90 @@
1
+ # aerosolprops
2
+
3
+ [![CI](https://github.com/openEarthModelling/aerosolprops/actions/workflows/ci.yml/badge.svg)](https://github.com/openEarthModelling/aerosolprops/actions/workflows/ci.yml)
4
+
5
+ Structure-derived pure-component properties for atmospheric organic aerosol.
6
+
7
+ `aerosolprops` is a modern successor to the pure-component property methods of
8
+ [UManSysProp](https://github.com/loftytopping/UManSysProp_public)
9
+ (Topping et al., GMD 9, 899–911, 2016), rebuilt on
10
+ [RDKit](https://www.rdkit.org/) as the structure engine and following the
11
+ conventions of the [`thermo`](https://github.com/CalebBell/thermo) package
12
+ family: strict SI units, estimators as pure functions of group counts where
13
+ possible, and failures that return `None` rather than raise.
14
+
15
+ **Status: pre-alpha.** The repository currently contains the packaging
16
+ skeleton, CI, documentation scaffold, the structure/topology foundation
17
+ layers, and the first estimator (SIMPOL.1). The remaining methods below
18
+ land one at a time, each with coefficients entered from the published
19
+ papers and tests against literature values.
20
+
21
+ ## Methods (v0.1)
22
+
23
+ | Method | Property | Status | Reference |
24
+ |---|---|---|---|
25
+ | SIMPOL.1 | Vapour pressure | implemented | Pankow & Asher, [ACP 8, 2773 (2008)](https://doi.org/10.5194/acp-8-2773-2008) |
26
+ | EVAPORATION | Vapour pressure | implemented | Compernolle et al., [ACP 11, 9431 (2011)](https://doi.org/10.5194/acp-11-9431-2011) |
27
+ | Nannoolal Part 1 (+ SOA extension groups) | Normal boiling point | implemented | Nannoolal et al., [FPE 226, 45 (2004)](https://doi.org/10.1016/j.fluid.2004.09.001); Compernolle et al., [ACP 10, 6271 (2010)](https://doi.org/10.5194/acp-10-6271-2010) |
28
+ | Nannoolal Part 3 | Vapour pressure | implemented | Nannoolal et al., [FPE 269, 117 (2008)](https://doi.org/10.1016/j.fluid.2008.04.020) |
29
+ | Myrdal–Yalkowsky (+ H-bonding extension) | Vapour pressure | implemented | Myrdal & Yalkowsky, [IECR 36, 2494 (1997)](https://doi.org/10.1021/ie950242l); Compernolle et al., [ACP 10, 6271 (2010)](https://doi.org/10.5194/acp-10-6271-2010) |
30
+
31
+ Boiling points used as inputs (by Myrdal–Yalkowsky and Nannoolal Part 3) can
32
+ come from the self-implemented Nannoolal Part 1 route, from `thermo`'s
33
+ built-in Joback method, or from experimental data — `aerosolprops` does **not**
34
+ reimplement Joback.
35
+
36
+ ## Installation
37
+
38
+ ```bash
39
+ pip install aerosolprops
40
+ ```
41
+
42
+ RDKit and `thermo` are required dependencies.
43
+
44
+ ## Design notes
45
+
46
+ - **Units are strictly SI** (Pa, K, mol); property failures return `None`.
47
+ - **RDKit is the structure engine and a required dependency.** It is
48
+ imported lazily, and estimators ultimately consume group-count
49
+ dictionaries — the same interface `thermo` uses for its own
50
+ RDKit-optional group-contribution methods — so pieces remain extractable
51
+ upstream.
52
+ - **No molecular descriptors.** Every method needs only 2D graph quantities:
53
+ SMARTS substructure counts, ring perception, composition, and a few
54
+ connectivity queries. No fingerprints, no 3D, no descriptor packages.
55
+ - **No home-grown graph algorithms.** The graph primitives (connected
56
+ components, ring distances, neighbour queries) are RDKit built-ins;
57
+ `aerosolprops.topology` only wraps them. What is method-specific is the
58
+ translation of paper semantics (e.g. SIMPOL.1 "acid-side carbons",
59
+ EVAPORATION "in-chain oxygen") onto those primitives.
60
+ - **`thermo` compatibility.** aerosolprops hard-depends on `thermo` and follows
61
+ its group-contribution conventions (`{group_id: coefficient record}`
62
+ catalogues, counts-based static estimators, Joback-style one-time
63
+ fragmenting wrappers). Where a method's counting semantics do not fit
64
+ `thermo`'s mutually-exclusive SMARTS partition (SIMPOL.1's groups overlap
65
+ and replace one another additively), aerosolprops ships its own fragmenter
66
+ but keeps the same interface, so pieces can still be contributed upstream
67
+ with minimal rework.
68
+
69
+ ## Licensing and data provenance
70
+
71
+ `aerosolprops` is MIT-licensed. Coefficients are entered from the published
72
+ papers cited above (facts, not copyrightable expression), and SMARTS
73
+ patterns are authored from the group definitions in those papers.
74
+ UManSysProp is used **only** as a behavioural test oracle during development;
75
+ no code or data files are copied from it.
76
+
77
+ ## Development
78
+
79
+ ```bash
80
+ uv venv && uv pip install -e ".[test,docs]"
81
+ pytest # unit tests + doctests
82
+ mkdocs serve # documentation
83
+ ```
84
+
85
+ CI runs the full test matrix (with doctests) on Linux/macOS/Windows for
86
+ Python 3.9–3.14, plus a strict docs build.
87
+
88
+ ## License
89
+
90
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,57 @@
1
+ [build-system]
2
+ requires = ["setuptools>=64"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "aerosolprops"
7
+ version = "0.1.0"
8
+ description = "Structure-derived pure-component properties for atmospheric organic aerosol: vapour pressures and boiling points by group contribution"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = { text = "MIT" }
12
+ authors = [{ name = "Fan Zhang" }]
13
+ keywords = [
14
+ "atmospheric chemistry",
15
+ "aerosol",
16
+ "SOA",
17
+ "vapour pressure",
18
+ "boiling point",
19
+ "group contribution",
20
+ "RDKit",
21
+ "thermo",
22
+ ]
23
+ classifiers = [
24
+ "Development Status :: 3 - Alpha",
25
+ "Intended Audience :: Science/Research",
26
+ "License :: OSI Approved :: MIT License",
27
+ "Operating System :: OS Independent",
28
+ "Programming Language :: Python :: 3",
29
+ "Programming Language :: Python :: 3.9",
30
+ "Programming Language :: Python :: 3.10",
31
+ "Programming Language :: Python :: 3.11",
32
+ "Programming Language :: Python :: 3.12",
33
+ "Programming Language :: Python :: 3.13",
34
+ "Programming Language :: Python :: 3.14",
35
+ "Topic :: Scientific/Engineering :: Atmospheric Science",
36
+ "Topic :: Scientific/Engineering :: Chemistry",
37
+ ]
38
+ dependencies = [
39
+ "thermo>=0.6.1",
40
+ "rdkit>=2023.9",
41
+ ]
42
+
43
+ [project.optional-dependencies]
44
+ test = ["pytest>=7.0"]
45
+ docs = ["mkdocs>=1.5", "mkdocs-material>=9.0"]
46
+
47
+ [project.urls]
48
+ Homepage = "https://github.com/openEarthModelling/aerosolprops"
49
+ Repository = "https://github.com/openEarthModelling/aerosolprops"
50
+ Changelog = "https://github.com/openEarthModelling/aerosolprops/blob/main/CHANGELOG.md"
51
+
52
+ [tool.setuptools.packages.find]
53
+ where = ["src"]
54
+
55
+ [tool.pytest.ini_options]
56
+ addopts = "--doctest-modules -q"
57
+ testpaths = ["src", "tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,56 @@
1
+ # SPDX-License-Identifier: MIT
2
+ """Structure-derived pure-component properties for atmospheric organic
3
+ aerosol.
4
+
5
+ Successor to the pure-component property methods of UManSysProp
6
+ (Topping et al., Geosci. Model Dev. 9, 899-911, 2016), rebuilt on RDKit as
7
+ the structure engine and following the conventions of the ``thermo``
8
+ package family: strict SI units (Pa, K, mol), estimators as pure functions
9
+ of group counts where possible, and failures returned as ``None``.
10
+
11
+ Method coverage for v0.1:
12
+
13
+ - SIMPOL.1 vapour pressure (Pankow & Asher, ACP 8, 2773, 2008) —
14
+ implemented (see :class:`aerosolprops.vapour_pressure.SIMPOL1`)
15
+ - EVAPORATION vapour pressure (Compernolle et al., ACP 11, 9431, 2011) —
16
+ implemented (see :class:`aerosolprops.vapour_pressure.EVAPORATION`)
17
+ - Nannoolal Part 1 normal boiling point (Nannoolal et al., FPE 226, 45,
18
+ 2004), including the SOA extension groups of Compernolle et al. (ACP 10,
19
+ 6271, 2010) — implemented (see
20
+ :class:`aerosolprops.boiling_point.NannoolalBP`)
21
+ - Nannoolal Part 3 vapour pressure (Nannoolal et al., FPE 269, 117, 2008) —
22
+ implemented (see :class:`aerosolprops.vapour_pressure.NannoolalVP`)
23
+ - Myrdal-Yalkowsky vapour pressure (Myrdal & Yalkowsky, IECR 36, 2494,
24
+ 1997) with the hydrogen-bonding extension of Compernolle et al. (2010) —
25
+ implemented (see :class:`aerosolprops.vapour_pressure.MyrdalYalkowsky`)
26
+
27
+ Boiling-point inputs may instead come from ``thermo``'s built-in Joback
28
+ method or from experimental data; aerosolprops does not reimplement Joback.
29
+
30
+ RDKit is a required dependency but is imported lazily: importing this
31
+ package pulls in neither RDKit nor ``thermo``'s group-contribution
32
+ machinery. Estimators consume plain group-count dictionaries — the same
33
+ interface ``thermo`` uses for its own RDKit-optional group-contribution
34
+ methods — so pieces remain extractable upstream.
35
+ """
36
+
37
+ __version__ = "0.1.0.dev0"
38
+
39
+ from . import (
40
+ boiling_point,
41
+ fragmentation,
42
+ methods,
43
+ structure,
44
+ topology,
45
+ vapour_pressure,
46
+ )
47
+
48
+ __all__ = [
49
+ "__version__",
50
+ "boiling_point",
51
+ "fragmentation",
52
+ "methods",
53
+ "structure",
54
+ "topology",
55
+ "vapour_pressure",
56
+ ]