detectability 0.2.1__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 (27) hide show
  1. detectability-0.2.1/LICENSE +28 -0
  2. detectability-0.2.1/PKG-INFO +166 -0
  3. detectability-0.2.1/README.md +133 -0
  4. detectability-0.2.1/pyproject.toml +48 -0
  5. detectability-0.2.1/setup.cfg +4 -0
  6. detectability-0.2.1/src/detectability/__init__.py +7 -0
  7. detectability-0.2.1/src/detectability/constants.py +6 -0
  8. detectability-0.2.1/src/detectability/data/harmonica_reference.json +589 -0
  9. detectability-0.2.1/src/detectability/data/igrf14coeffs.txt +199 -0
  10. detectability-0.2.1/src/detectability/detect.py +149 -0
  11. detectability-0.2.1/src/detectability/gravity.py +266 -0
  12. detectability-0.2.1/src/detectability/igrf.py +163 -0
  13. detectability-0.2.1/src/detectability/magnetics.py +199 -0
  14. detectability-0.2.1/src/detectability/rocks.py +68 -0
  15. detectability-0.2.1/src/detectability/survey.py +323 -0
  16. detectability-0.2.1/src/detectability/validation.py +404 -0
  17. detectability-0.2.1/src/detectability.egg-info/PKG-INFO +166 -0
  18. detectability-0.2.1/src/detectability.egg-info/SOURCES.txt +25 -0
  19. detectability-0.2.1/src/detectability.egg-info/dependency_links.txt +1 -0
  20. detectability-0.2.1/src/detectability.egg-info/requires.txt +7 -0
  21. detectability-0.2.1/src/detectability.egg-info/top_level.txt +1 -0
  22. detectability-0.2.1/tests/test_detect.py +73 -0
  23. detectability-0.2.1/tests/test_gravity.py +166 -0
  24. detectability-0.2.1/tests/test_igrf.py +38 -0
  25. detectability-0.2.1/tests/test_magnetics.py +176 -0
  26. detectability-0.2.1/tests/test_survey.py +77 -0
  27. detectability-0.2.1/tests/test_validation.py +28 -0
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Mükremin Nergiz
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,166 @@
1
+ Metadata-Version: 2.4
2
+ Name: detectability
3
+ Version: 0.2.1
4
+ Summary: Pre-survey detectability, modelled and reproducible: forward-modelled gravity and magnetic responses, station spacing and a detectability verdict for near-surface targets.
5
+ Author: Mükremin Nergiz
6
+ License-Expression: BSD-3-Clause
7
+ Project-URL: Homepage, https://detectability.mukreminnergiz.com
8
+ Project-URL: Documentation, https://detectability.mukreminnergiz.com/method
9
+ Project-URL: Validation, https://detectability.mukreminnergiz.com/validation
10
+ Project-URL: Repository, https://github.com/mukremin-nergiz/detectability
11
+ Project-URL: Issues, https://github.com/mukremin-nergiz/detectability/issues
12
+ Project-URL: Citation, https://doi.org/10.5281/zenodo.23931815
13
+ Keywords: geophysics,gravity,magnetics,survey design,near-surface,forward modelling,IGRF
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Intended Audience :: Education
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Topic :: Scientific/Engineering :: Physics
24
+ Requires-Python: >=3.10
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: numpy>=1.24
28
+ Provides-Extra: test
29
+ Requires-Dist: pytest>=7; extra == "test"
30
+ Provides-Extra: validation
31
+ Requires-Dist: harmonica==0.7.0; extra == "validation"
32
+ Dynamic: license-file
33
+
34
+ # Detectability
35
+
36
+ [![tests](https://github.com/mukremin-nergiz/detectability/actions/workflows/tests.yml/badge.svg)](https://github.com/mukremin-nergiz/detectability/actions/workflows/tests.yml)
37
+ [![licence: BSD-3-Clause](https://img.shields.io/badge/licence-BSD--3--Clause-blue.svg)](https://github.com/mukremin-nergiz/detectability/blob/main/LICENSE)
38
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.23931815.svg)](https://doi.org/10.5281/zenodo.23931815)
39
+
40
+ **Pre-survey detectability, modelled and reproducible.** Describe a buried target and a survey. Detectability models the gravity and
41
+ magnetic response of the target, compares it with instrument and field noise, and gives a verdict for each method
42
+ (clearly detectable, marginal, not detectable), with the recommended station spacing and profile length, every
43
+ assumption, and a Python script that reproduces the result.
44
+
45
+ - Web tool: <https://detectability.mukreminnergiz.com>
46
+ - Method and validation: <https://detectability.mukreminnergiz.com/method>
47
+
48
+ ## Install
49
+
50
+ ```bash
51
+ pip install detectability
52
+ ```
53
+
54
+ Python 3.10 or newer; the only dependency is NumPy. The development version: `pip install "git+https://github.com/mukremin-nergiz/detectability"`.
55
+
56
+ ## Example
57
+
58
+ A 20 m air-filled cave whose top is 15 m deep in limestone, surveyed near Sivas, Türkiye:
59
+
60
+ ```python
61
+ from detectability import evaluate
62
+
63
+ report = evaluate(
64
+ {"shape": "sphere", "depth_top": 15, "size": 20, "material": "air", "host": "limestone"},
65
+ {"latitude": 39.75, "longitude": 37.02, "date": "2026-07-01"},
66
+ )
67
+ print(report.summary())
68
+ ```
69
+
70
+ ```text
71
+ Detectability 0.2.1: sphere in limestone
72
+ - gravity: peak 114 µGal, noise 11.2 µGal, S/N 10.2: clearly detectable
73
+ stations every 5 m or less, profile at least 153 m long
74
+ - magnetic: peak 0.462 nT, noise 2 nT, S/N 0.231: not detectable
75
+ Recommended method: gravity
76
+ ```
77
+
78
+ `report.script()` returns a standalone script that recomputes the report; `report.to_dict()` gives the full result,
79
+ including the modelled profiles and the assumptions.
80
+
81
+ Target shapes: `sphere`, `horizontal_cylinder`, `vertical_cylinder`, `prism`, `dyke` (any dip) and `contact`. The main
82
+ geomagnetic field comes from IGRF-14 for the survey location and date. Typical densities and susceptibilities are built
83
+ in, and measured contrasts can be given instead.
84
+
85
+ ## Modules
86
+
87
+ | Module | Contents |
88
+ |---|---|
89
+ | `survey` | `evaluate()`: target and survey in, report and reproduction script out |
90
+ | `gravity` | sphere, horizontal cylinder, right rectangular prism (Nagy; Plouff) and its gradient tensor, vertical cylinder (exact, by a rim integral) and its gradient tensor, vertical step, dyke, 2D polygon (Talwani; Won & Bevis) |
91
+ | `magnetics` | total-field anomaly: sphere, horizontal cylinder, prism, vertical cylinder, 2D polygon, dyke (any dip), vertical contact; induced and remanent magnetisation |
92
+ | `igrf` | IGRF-14 main field from location and date, from the official IAGA coefficients |
93
+ | `rocks` | typical densities and magnetic susceptibilities with their ranges (Telford et al. 1990) |
94
+ | `detect` | instrument and field noise, signal-to-noise ratio, verdict, station spacing, profile length |
95
+
96
+ ## Validation
97
+
98
+ Every model is checked against a result computed in a different way. Each row below is also a test: it fails if the
99
+ error exceeds the tolerance. The error is the largest difference along the profile as a percentage of the largest
100
+ reference value. Figures for each row: <https://detectability.mukreminnergiz.com/validation>.
101
+
102
+ The "Independent code" rows compare with [Harmonica](https://www.fatiando.org/harmonica) 0.7.0 (Fatiando a Terra
103
+ Project, [doi:10.5281/zenodo.13308312](https://doi.org/10.5281/zenodo.13308312)), a separate open-source package. Its
104
+ values are stored in `src/detectability/data/harmonica_reference.json`, so the library does not depend on it; to
105
+ recompute and check them:
106
+
107
+ ```bash
108
+ pip install -e ".[validation]"
109
+ python tools/harmonica_reference.py --check
110
+ ```
111
+
112
+ | Check | Geometry and method | Reference | Max. relative error | Tolerance |
113
+ |---|---|---|---:|---:|
114
+ | Analytical limit | Prism, gravity, far from the sensor | Point mass of the same mass | 1.9e-05 % | 0.01 % |
115
+ | Analytical limit | Prism, gravity, wide and thin | Infinite Bouguer slab, 2πGΔρt | 0.0099 % | 0.1 % |
116
+ | Analytical limit | Vertical step, gravity, far over the slab | Infinite Bouguer slab, 2πGΔρt | 4.8e-04 % | 0.01 % |
117
+ | Analytical limit | Vertical cylinder, gravity, on its axis | Exact on-axis cylinder formula | 1.7e-13 % | 1.0e-10 % |
118
+ | Independent formula | Horizontal cylinder, gravity | 2D polygon, 720 sides (Talwani; Won & Bevis) | 6.3e-12 % | 0.01 % |
119
+ | Independent formula | Vertical dyke, gravity | 2D polygon (Won & Bevis) | 1.9e-13 % | 1.0e-06 % |
120
+ | Numerical integration | Prism, gravity | 16³ Gauss–Legendre point masses | 2.9e-06 % | 0.001 % |
121
+ | Numerical integration | Horizontal cylinder, magnetic | 3D dipoles integrated along strike | 2.2e-07 % | 0.01 % |
122
+ | Numerical integration | Prism, magnetic | 16³ Gauss–Legendre point dipoles | 1.3e-12 % | 0.001 % |
123
+ | Numerical integration | Vertical cylinder, gravity | Gauss–Legendre over the cross-section, line masses in depth | 5.5e-13 % | 1.0e-08 % |
124
+ | Numerical integration | Vertical cylinder, magnetic | Gauss–Legendre point dipoles over the volume | 5.8e-13 % | 1.0e-06 % |
125
+ | Poisson's relation | Sphere, gravity ↔ magnetic | Vertical derivative of the gravity sphere | 1.4e-08 % | 0.001 % |
126
+ | Poisson's relation | Vertical dyke, gravity ↔ magnetic | Vertical derivative of the gravity dyke | 2.2e-08 % | 1.0e-04 % |
127
+ | Poisson's relation | Dipping dyke (60°), gravity ↔ magnetic | Vertical derivative of the gravity dyke | 2.6e-08 % | 1.0e-04 % |
128
+ | Poisson's relation | Vertical cylinder, gravity ↔ magnetic | Vertical derivative of the gravity cylinder | 3.6e-08 % | 1.0e-04 % |
129
+ | Poisson's relation | Vertical contact, gravity ↔ magnetic | Vertical derivative of the gravity step | 3.9e-06 % | 1.0e-04 % |
130
+ | Independent code | Prism, gravity | Harmonica 0.7.0 prism_gravity | 3.0e-12 % | 1.0e-08 % |
131
+ | Independent code | Prism, magnetic | Harmonica 0.7.0 prism_magnetic | 4.8e-13 % | 1.0e-08 % |
132
+ | Independent code | Sphere, gravity | Harmonica 0.7.0 point_gravity | 3.9e-14 % | 1.0e-10 % |
133
+ | Independent code | Sphere, magnetic | Harmonica 0.7.0 dipole_magnetic | 8.8e-14 % | 1.0e-10 % |
134
+ | Independent code | Vertical dyke, gravity | Harmonica 0.7.0 prism_gravity, 200 km along strike | 3.6e-07 % | 1.0e-05 % |
135
+ | Independent code | Vertical dyke, magnetic | Harmonica 0.7.0 prism_magnetic, 200 km along strike | 5.1e-07 % | 1.0e-05 % |
136
+ | Reference service | IGRF-14 main field, 5 sites | British Geological Survey IGRF-14 | 0.38 nT, 0.0005° | 1 nT, 0.002° |
137
+
138
+ Regenerate this table with `python -m detectability.validation`. Run all tests (including these) with:
139
+
140
+ ```bash
141
+ pip install -e ".[test]"
142
+ pytest
143
+ ```
144
+
145
+ ## Limitations
146
+
147
+ Flat topography, a homogeneous host and no regional trend; 2D targets are infinitely long along strike; the profile
148
+ crosses the centre of the target; self-demagnetisation is neglected. Results are expectations under these assumptions,
149
+ not guarantees. Instrument presets come from manufacturers' data sheets (`detect.INSTRUMENTS` lists each figure and its
150
+ source); field noise, which usually dominates, is a stated assumption that you can change.
151
+
152
+ ## Citation
153
+
154
+ See [CITATION.cff](https://github.com/mukremin-nergiz/detectability/blob/main/CITATION.cff), or:
155
+
156
+ > Nergiz, M. (2026). *Detectability: Pre-survey detectability, modelled and reproducible* (Version 0.2.1) [Computer software].
157
+ > Zenodo. https://doi.org/10.5281/zenodo.23931815
158
+
159
+ The DOI above always resolves to the latest version; each release also has its own DOI on Zenodo.
160
+
161
+ ## Author
162
+
163
+ Mükremin Nergiz, Geophysical Engineer & Software Developer (Independent Researcher, Sivas, Türkiye).
164
+ ORCID [0009-0001-6789-2774](https://orcid.org/0009-0001-6789-2774) · <https://mukreminnergiz.com>
165
+
166
+ Licence: BSD-3-Clause.
@@ -0,0 +1,133 @@
1
+ # Detectability
2
+
3
+ [![tests](https://github.com/mukremin-nergiz/detectability/actions/workflows/tests.yml/badge.svg)](https://github.com/mukremin-nergiz/detectability/actions/workflows/tests.yml)
4
+ [![licence: BSD-3-Clause](https://img.shields.io/badge/licence-BSD--3--Clause-blue.svg)](https://github.com/mukremin-nergiz/detectability/blob/main/LICENSE)
5
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.23931815.svg)](https://doi.org/10.5281/zenodo.23931815)
6
+
7
+ **Pre-survey detectability, modelled and reproducible.** Describe a buried target and a survey. Detectability models the gravity and
8
+ magnetic response of the target, compares it with instrument and field noise, and gives a verdict for each method
9
+ (clearly detectable, marginal, not detectable), with the recommended station spacing and profile length, every
10
+ assumption, and a Python script that reproduces the result.
11
+
12
+ - Web tool: <https://detectability.mukreminnergiz.com>
13
+ - Method and validation: <https://detectability.mukreminnergiz.com/method>
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ pip install detectability
19
+ ```
20
+
21
+ Python 3.10 or newer; the only dependency is NumPy. The development version: `pip install "git+https://github.com/mukremin-nergiz/detectability"`.
22
+
23
+ ## Example
24
+
25
+ A 20 m air-filled cave whose top is 15 m deep in limestone, surveyed near Sivas, Türkiye:
26
+
27
+ ```python
28
+ from detectability import evaluate
29
+
30
+ report = evaluate(
31
+ {"shape": "sphere", "depth_top": 15, "size": 20, "material": "air", "host": "limestone"},
32
+ {"latitude": 39.75, "longitude": 37.02, "date": "2026-07-01"},
33
+ )
34
+ print(report.summary())
35
+ ```
36
+
37
+ ```text
38
+ Detectability 0.2.1: sphere in limestone
39
+ - gravity: peak 114 µGal, noise 11.2 µGal, S/N 10.2: clearly detectable
40
+ stations every 5 m or less, profile at least 153 m long
41
+ - magnetic: peak 0.462 nT, noise 2 nT, S/N 0.231: not detectable
42
+ Recommended method: gravity
43
+ ```
44
+
45
+ `report.script()` returns a standalone script that recomputes the report; `report.to_dict()` gives the full result,
46
+ including the modelled profiles and the assumptions.
47
+
48
+ Target shapes: `sphere`, `horizontal_cylinder`, `vertical_cylinder`, `prism`, `dyke` (any dip) and `contact`. The main
49
+ geomagnetic field comes from IGRF-14 for the survey location and date. Typical densities and susceptibilities are built
50
+ in, and measured contrasts can be given instead.
51
+
52
+ ## Modules
53
+
54
+ | Module | Contents |
55
+ |---|---|
56
+ | `survey` | `evaluate()`: target and survey in, report and reproduction script out |
57
+ | `gravity` | sphere, horizontal cylinder, right rectangular prism (Nagy; Plouff) and its gradient tensor, vertical cylinder (exact, by a rim integral) and its gradient tensor, vertical step, dyke, 2D polygon (Talwani; Won & Bevis) |
58
+ | `magnetics` | total-field anomaly: sphere, horizontal cylinder, prism, vertical cylinder, 2D polygon, dyke (any dip), vertical contact; induced and remanent magnetisation |
59
+ | `igrf` | IGRF-14 main field from location and date, from the official IAGA coefficients |
60
+ | `rocks` | typical densities and magnetic susceptibilities with their ranges (Telford et al. 1990) |
61
+ | `detect` | instrument and field noise, signal-to-noise ratio, verdict, station spacing, profile length |
62
+
63
+ ## Validation
64
+
65
+ Every model is checked against a result computed in a different way. Each row below is also a test: it fails if the
66
+ error exceeds the tolerance. The error is the largest difference along the profile as a percentage of the largest
67
+ reference value. Figures for each row: <https://detectability.mukreminnergiz.com/validation>.
68
+
69
+ The "Independent code" rows compare with [Harmonica](https://www.fatiando.org/harmonica) 0.7.0 (Fatiando a Terra
70
+ Project, [doi:10.5281/zenodo.13308312](https://doi.org/10.5281/zenodo.13308312)), a separate open-source package. Its
71
+ values are stored in `src/detectability/data/harmonica_reference.json`, so the library does not depend on it; to
72
+ recompute and check them:
73
+
74
+ ```bash
75
+ pip install -e ".[validation]"
76
+ python tools/harmonica_reference.py --check
77
+ ```
78
+
79
+ | Check | Geometry and method | Reference | Max. relative error | Tolerance |
80
+ |---|---|---|---:|---:|
81
+ | Analytical limit | Prism, gravity, far from the sensor | Point mass of the same mass | 1.9e-05 % | 0.01 % |
82
+ | Analytical limit | Prism, gravity, wide and thin | Infinite Bouguer slab, 2πGΔρt | 0.0099 % | 0.1 % |
83
+ | Analytical limit | Vertical step, gravity, far over the slab | Infinite Bouguer slab, 2πGΔρt | 4.8e-04 % | 0.01 % |
84
+ | Analytical limit | Vertical cylinder, gravity, on its axis | Exact on-axis cylinder formula | 1.7e-13 % | 1.0e-10 % |
85
+ | Independent formula | Horizontal cylinder, gravity | 2D polygon, 720 sides (Talwani; Won & Bevis) | 6.3e-12 % | 0.01 % |
86
+ | Independent formula | Vertical dyke, gravity | 2D polygon (Won & Bevis) | 1.9e-13 % | 1.0e-06 % |
87
+ | Numerical integration | Prism, gravity | 16³ Gauss–Legendre point masses | 2.9e-06 % | 0.001 % |
88
+ | Numerical integration | Horizontal cylinder, magnetic | 3D dipoles integrated along strike | 2.2e-07 % | 0.01 % |
89
+ | Numerical integration | Prism, magnetic | 16³ Gauss–Legendre point dipoles | 1.3e-12 % | 0.001 % |
90
+ | Numerical integration | Vertical cylinder, gravity | Gauss–Legendre over the cross-section, line masses in depth | 5.5e-13 % | 1.0e-08 % |
91
+ | Numerical integration | Vertical cylinder, magnetic | Gauss–Legendre point dipoles over the volume | 5.8e-13 % | 1.0e-06 % |
92
+ | Poisson's relation | Sphere, gravity ↔ magnetic | Vertical derivative of the gravity sphere | 1.4e-08 % | 0.001 % |
93
+ | Poisson's relation | Vertical dyke, gravity ↔ magnetic | Vertical derivative of the gravity dyke | 2.2e-08 % | 1.0e-04 % |
94
+ | Poisson's relation | Dipping dyke (60°), gravity ↔ magnetic | Vertical derivative of the gravity dyke | 2.6e-08 % | 1.0e-04 % |
95
+ | Poisson's relation | Vertical cylinder, gravity ↔ magnetic | Vertical derivative of the gravity cylinder | 3.6e-08 % | 1.0e-04 % |
96
+ | Poisson's relation | Vertical contact, gravity ↔ magnetic | Vertical derivative of the gravity step | 3.9e-06 % | 1.0e-04 % |
97
+ | Independent code | Prism, gravity | Harmonica 0.7.0 prism_gravity | 3.0e-12 % | 1.0e-08 % |
98
+ | Independent code | Prism, magnetic | Harmonica 0.7.0 prism_magnetic | 4.8e-13 % | 1.0e-08 % |
99
+ | Independent code | Sphere, gravity | Harmonica 0.7.0 point_gravity | 3.9e-14 % | 1.0e-10 % |
100
+ | Independent code | Sphere, magnetic | Harmonica 0.7.0 dipole_magnetic | 8.8e-14 % | 1.0e-10 % |
101
+ | Independent code | Vertical dyke, gravity | Harmonica 0.7.0 prism_gravity, 200 km along strike | 3.6e-07 % | 1.0e-05 % |
102
+ | Independent code | Vertical dyke, magnetic | Harmonica 0.7.0 prism_magnetic, 200 km along strike | 5.1e-07 % | 1.0e-05 % |
103
+ | Reference service | IGRF-14 main field, 5 sites | British Geological Survey IGRF-14 | 0.38 nT, 0.0005° | 1 nT, 0.002° |
104
+
105
+ Regenerate this table with `python -m detectability.validation`. Run all tests (including these) with:
106
+
107
+ ```bash
108
+ pip install -e ".[test]"
109
+ pytest
110
+ ```
111
+
112
+ ## Limitations
113
+
114
+ Flat topography, a homogeneous host and no regional trend; 2D targets are infinitely long along strike; the profile
115
+ crosses the centre of the target; self-demagnetisation is neglected. Results are expectations under these assumptions,
116
+ not guarantees. Instrument presets come from manufacturers' data sheets (`detect.INSTRUMENTS` lists each figure and its
117
+ source); field noise, which usually dominates, is a stated assumption that you can change.
118
+
119
+ ## Citation
120
+
121
+ See [CITATION.cff](https://github.com/mukremin-nergiz/detectability/blob/main/CITATION.cff), or:
122
+
123
+ > Nergiz, M. (2026). *Detectability: Pre-survey detectability, modelled and reproducible* (Version 0.2.1) [Computer software].
124
+ > Zenodo. https://doi.org/10.5281/zenodo.23931815
125
+
126
+ The DOI above always resolves to the latest version; each release also has its own DOI on Zenodo.
127
+
128
+ ## Author
129
+
130
+ Mükremin Nergiz, Geophysical Engineer & Software Developer (Independent Researcher, Sivas, Türkiye).
131
+ ORCID [0009-0001-6789-2774](https://orcid.org/0009-0001-6789-2774) · <https://mukreminnergiz.com>
132
+
133
+ Licence: BSD-3-Clause.
@@ -0,0 +1,48 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "detectability"
7
+ version = "0.2.1"
8
+ description = "Pre-survey detectability, modelled and reproducible: forward-modelled gravity and magnetic responses, station spacing and a detectability verdict for near-surface targets."
9
+ readme = "README.md"
10
+ keywords = ["geophysics", "gravity", "magnetics", "survey design", "near-surface", "forward modelling", "IGRF"]
11
+ classifiers = [
12
+ "Development Status :: 3 - Alpha",
13
+ "Intended Audience :: Science/Research",
14
+ "Intended Audience :: Education",
15
+ "Operating System :: OS Independent",
16
+ "Programming Language :: Python :: 3",
17
+ "Programming Language :: Python :: 3.10",
18
+ "Programming Language :: Python :: 3.11",
19
+ "Programming Language :: Python :: 3.12",
20
+ "Programming Language :: Python :: 3.13",
21
+ "Topic :: Scientific/Engineering :: Physics",
22
+ ]
23
+ requires-python = ">=3.10"
24
+ license = "BSD-3-Clause"
25
+ authors = [{ name = "Mükremin Nergiz" }]
26
+ dependencies = ["numpy>=1.24"]
27
+
28
+ [project.urls]
29
+ Homepage = "https://detectability.mukreminnergiz.com"
30
+ Documentation = "https://detectability.mukreminnergiz.com/method"
31
+ Validation = "https://detectability.mukreminnergiz.com/validation"
32
+ Repository = "https://github.com/mukremin-nergiz/detectability"
33
+ Issues = "https://github.com/mukremin-nergiz/detectability/issues"
34
+ Citation = "https://doi.org/10.5281/zenodo.23931815"
35
+
36
+ [project.optional-dependencies]
37
+ test = ["pytest>=7"]
38
+ # Recomputes the "Independent code" reference values (tools/harmonica_reference.py); not needed to use the library.
39
+ validation = ["harmonica==0.7.0"]
40
+
41
+ [tool.setuptools.packages.find]
42
+ where = ["src"]
43
+
44
+ [tool.setuptools.package-data]
45
+ detectability = ["data/*.txt", "data/*.json"]
46
+
47
+ [tool.pytest.ini_options]
48
+ testpaths = ["tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,7 @@
1
+ """Detectability: pre-survey detectability, modelled and reproducible."""
2
+
3
+ __version__ = "0.2.1"
4
+
5
+ from .survey import METHODS, SHAPES, Report, Survey, Target, evaluate # noqa: E402
6
+
7
+ __all__ = ["evaluate", "Target", "Survey", "Report", "SHAPES", "METHODS", "__version__"]
@@ -0,0 +1,6 @@
1
+ """Physical constants and unit conversions (SI unless stated)."""
2
+
3
+ G = 6.67430e-11 # gravitational constant, m^3 kg^-1 s^-2 (CODATA 2018)
4
+ SI_TO_MGAL = 1e5 # 1 m/s^2 = 1e5 mGal
5
+ SI_TO_UGAL = 1e8 # 1 m/s^2 = 1e8 µGal
6
+ G_CM3_TO_KG_M3 = 1000.0 # density: 1 g/cm^3 = 1000 kg/m^3