specmod 0.2.0__py3-none-any.whl

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 (62) hide show
  1. specmod/__init__.py +17 -0
  2. specmod/_vendor/__init__.py +21 -0
  3. specmod/_vendor/qiinv.py +243 -0
  4. specmod/acquire.py +358 -0
  5. specmod/api.py +480 -0
  6. specmod/cli.py +139 -0
  7. specmod/config/__init__.py +44 -0
  8. specmod/config/layers.py +168 -0
  9. specmod/config/provenance.py +77 -0
  10. specmod/config/sections.py +385 -0
  11. specmod/config/serialize.py +58 -0
  12. specmod/core/__init__.py +41 -0
  13. specmod/core/bandwidth.py +187 -0
  14. specmod/core/collection.py +549 -0
  15. specmod/core/noise.py +478 -0
  16. specmod/core/scalogram.py +234 -0
  17. specmod/core/spectrum.py +326 -0
  18. specmod/core/units.py +116 -0
  19. specmod/datasets.py +316 -0
  20. specmod/distance.py +190 -0
  21. specmod/exceptions.py +58 -0
  22. specmod/fitting/__init__.py +58 -0
  23. specmod/fitting/base.py +50 -0
  24. specmod/fitting/event.py +284 -0
  25. specmod/fitting/guess.py +170 -0
  26. specmod/fitting/spectrum.py +330 -0
  27. specmod/io.py +241 -0
  28. specmod/magnitude.py +312 -0
  29. specmod/picks/__init__.py +182 -0
  30. specmod/picks/base.py +250 -0
  31. specmod/picks/delimited.py +224 -0
  32. specmod/picks/events.py +157 -0
  33. specmod/picks/resolution.py +149 -0
  34. specmod/picks/snuffler.py +92 -0
  35. specmod/pipeline.py +280 -0
  36. specmod/plotting.py +203 -0
  37. specmod/preprocess.py +554 -0
  38. specmod/smoothing/__init__.py +50 -0
  39. specmod/smoothing/base.py +56 -0
  40. specmod/smoothing/konno_ohmachi.py +83 -0
  41. specmod/smoothing/log_bins.py +171 -0
  42. specmod/sources/__init__.py +65 -0
  43. specmod/sources/attenuation.py +110 -0
  44. specmod/sources/composite.py +135 -0
  45. specmod/sources/motion.py +40 -0
  46. specmod/sources/source.py +147 -0
  47. specmod/spreading.py +209 -0
  48. specmod/staged.py +523 -0
  49. specmod/tables.py +110 -0
  50. specmod/transforms/__init__.py +50 -0
  51. specmod/transforms/base.py +242 -0
  52. specmod/transforms/cwt.py +219 -0
  53. specmod/transforms/fft.py +157 -0
  54. specmod/transforms/multitaper.py +357 -0
  55. specmod/transforms/prieto.py +272 -0
  56. specmod/transforms/quadratic.py +221 -0
  57. specmod/utils.py +305 -0
  58. specmod-0.2.0.dist-info/METADATA +294 -0
  59. specmod-0.2.0.dist-info/RECORD +62 -0
  60. specmod-0.2.0.dist-info/WHEEL +4 -0
  61. specmod-0.2.0.dist-info/entry_points.txt +2 -0
  62. specmod-0.2.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,294 @@
1
+ Metadata-Version: 2.5
2
+ Name: specmod
3
+ Version: 0.2.0
4
+ Summary: A Python toolbox for processing and modelling seismic spectra
5
+ Project-URL: Homepage, https://github.com/sgjholt/SpecMod
6
+ Project-URL: Repository, https://github.com/sgjholt/SpecMod
7
+ Project-URL: Issues, https://github.com/sgjholt/SpecMod/issues
8
+ Author: James Holt
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: moment magnitude,seismology,source parameters,spectra
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Scientific/Engineering :: Physics
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: click>=8.1
21
+ Requires-Dist: lmfit>=1.3
22
+ Requires-Dist: matplotlib>=3.9
23
+ Requires-Dist: numpy>=2.0
24
+ Requires-Dist: obspy>=1.5
25
+ Requires-Dist: pandas>=2.2.2
26
+ Requires-Dist: pooch>=1.8
27
+ Requires-Dist: scipy>=1.15
28
+ Provides-Extra: dev
29
+ Requires-Dist: h5py>=3.11; extra == 'dev'
30
+ Requires-Dist: hypothesis>=6.100; extra == 'dev'
31
+ Requires-Dist: mypy>=1.11; extra == 'dev'
32
+ Requires-Dist: pre-commit>=3.7; extra == 'dev'
33
+ Requires-Dist: pyarrow>=16.0; extra == 'dev'
34
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
35
+ Requires-Dist: pytest>=8.0; extra == 'dev'
36
+ Requires-Dist: ruff>=0.6; extra == 'dev'
37
+ Provides-Extra: docs
38
+ Requires-Dist: myst-nb>=1.1; extra == 'docs'
39
+ Requires-Dist: myst-parser>=3.0; extra == 'docs'
40
+ Requires-Dist: pydata-sphinx-theme>=0.15; extra == 'docs'
41
+ Requires-Dist: sphinx>=7.3; extra == 'docs'
42
+ Provides-Extra: io
43
+ Requires-Dist: h5py>=3.11; extra == 'io'
44
+ Requires-Dist: pyarrow>=16.0; extra == 'io'
45
+ Provides-Extra: mcmc
46
+ Requires-Dist: emcee>=3.1; extra == 'mcmc'
47
+ Provides-Extra: multitaper
48
+ Requires-Dist: multitaper>=1.2; extra == 'multitaper'
49
+ Provides-Extra: tutorial
50
+ Requires-Dist: ipykernel>=7.0; extra == 'tutorial'
51
+ Requires-Dist: nbclient>=0.10; extra == 'tutorial'
52
+ Requires-Dist: nbformat>=5.10; extra == 'tutorial'
53
+ Provides-Extra: wavelet
54
+ Requires-Dist: pywavelets>=1.5; extra == 'wavelet'
55
+ Description-Content-Type: text/markdown
56
+
57
+ # SpecMod
58
+
59
+ A Python toolbox for processing and modelling seismic spectra, following the
60
+ method of Edwards *et al.* (2010).
61
+
62
+ SpecMod estimates source parameters — long-period spectral level Ω, corner
63
+ frequency `f_c`, and the attenuation operator `t*` — by fitting a Brune-type
64
+ source model to direct-phase spectra.
65
+
66
+ > **Status: alpha, and under active reconstruction.**
67
+ > The package is pre-1.0 and mid-refactor. The modern layers
68
+ > (`specmod.config`, `specmod.core`, `specmod.transforms`, `specmod.picks`,
69
+ > `specmod.fitting`) are built and tested; the older pipeline modules still
70
+ > carry pre-refactor behaviour and are being replaced stage by stage. Expect
71
+ > breaking changes at every `0.x` release until the API settles at 1.0 — they
72
+ > land in minor bumps by design, with no deprecation cycle. Pin an exact
73
+ > version for anything you intend to publish.
74
+ > [`docs/roadmap.md`](docs/roadmap.md) says which stages are done and what 1.0
75
+ > will mean; [`docs/REFACTOR_PLAN.md`](docs/REFACTOR_PLAN.md) is the working
76
+ > document behind it.
77
+
78
+ ## Installation
79
+
80
+ Requires Python 3.11 or newer.
81
+
82
+ ```sh
83
+ pip install -e ".[dev]"
84
+ ```
85
+
86
+ Optional extras:
87
+
88
+ | Extra | Adds |
89
+ |---|---|
90
+ | `multitaper` | Prieto's `multitaper` package — jackknife confidence intervals, F-test for spectral lines |
91
+ | `wavelet` | PyWavelets, for wavelet families beyond the built-in Morlet |
92
+ | `mcmc` | `emcee`, for Markov-chain Monte Carlo parameter search |
93
+
94
+ No Fortran compiler is needed. Multitaper estimation is implemented natively on
95
+ SciPy's DPSS tapers, so the historical `mtspec` dependency — Fortran source with
96
+ no wheels and no release since 2016 — is no longer required.
97
+
98
+ ## Estimating a spectrum
99
+
100
+ Every estimator returns a `Spectrum` that knows its own units:
101
+
102
+ ```python
103
+ import numpy as np
104
+ from specmod.transforms import FFTEstimator, MultitaperEstimator
105
+
106
+ dt = 0.01
107
+ trace = np.random.default_rng(0).normal(0, 1e-6, 2000)
108
+
109
+ spectrum = MultitaperEstimator(time_bandwidth=3.0, n_tapers=5).estimate(
110
+ trace, dt, motion="velocity"
111
+ )
112
+
113
+ spectrum.unit # 'm/s*s' — a Fourier amplitude spectrum
114
+ spectrum.duration # 20.0 s, the physical record length
115
+ spectrum.energy() # recovers sum(x**2) * dt
116
+ ```
117
+
118
+ Conversions return new objects and are unit-aware:
119
+
120
+ ```python
121
+ spectrum.to_motion("displacement") # divides by 2*pi*f
122
+ spectrum.to_kind("psd") # A**2 / (2T)
123
+ spectrum.band(0.5, 25.0)
124
+ ```
125
+
126
+ The wavelet estimator additionally exposes the full time-frequency surface,
127
+ which is what to look at when a fit comes out wrong:
128
+
129
+ ```python
130
+ from specmod.transforms import CWTEstimator
131
+
132
+ scalogram = CWTEstimator().scalogram(trace, dt)
133
+ scalogram.time_average() # an ordinary Spectrum, fits like any other
134
+ scalogram.coi_coverage() # how much of the window each frequency resolves
135
+ scalogram.qc() # concentration, coda balance, resolved bandwidth
136
+ ```
137
+
138
+ Which estimator to use, and what each one does to your data — including
139
+ measured position-dependence and the variance-normalisation convention `mtspec`
140
+ used — is set out in
141
+ [`docs/choosing-a-transform.md`](docs/choosing-a-transform.md), with a
142
+ worked walkthrough in
143
+ [`docs/notebooks/choosing-a-transform.ipynb`](docs/notebooks/choosing-a-transform.ipynb).
144
+
145
+ ### Why the units are typed
146
+
147
+ A spectrum carries its ground-motion domain and amplitude convention as
148
+ attributes rather than in module-level globals. The alternative is keeping those
149
+ globals in sync by hand with however many times `.inte()` or `.diff()` has been
150
+ called, where getting it wrong returns a wrong seismic moment with no error
151
+ anywhere. Here it is a type error.
152
+
153
+ Amplitude normalisation is keyed off the physical record duration, never off the
154
+ length of the frequency axis, so zero-padding refines the frequency grid and
155
+ changes nothing else.
156
+
157
+ ## Reading picks
158
+
159
+ Arrivals are attached to traces by `set_picks`, which detects the format from
160
+ the file rather than from its name:
161
+
162
+ ```python
163
+ import specmod.preprocess as pre
164
+
165
+ pre.set_picks(stream, "event.xml")
166
+ ```
167
+
168
+ Everything `obspy.read_events` parses is read through one delegate — QuakeML,
169
+ SEISAN Nordic, HypoDD, NonLinLoc, IMS/GSE bulletins — plus Snuffler marker
170
+ files, plus delimited tables whose columns you name. A format registered with
171
+ ObsPy's own plugin system is read here with no SpecMod-side registration at
172
+ all.
173
+
174
+ Most formats supply less than a full sensor identity — a bare station code is
175
+ common — so a pick matches a trace on the fields it *states*. A pick that fits
176
+ several sensors is an error rather than a broadcast: a station's surface and
177
+ borehole instruments differ only by location code and do not see the same
178
+ arrival.
179
+
180
+ Adding a format, the column mapping for a picker's CSV, and the policies for
181
+ duplicate picks and multi-event files are in
182
+ [`docs/pick-formats.md`](docs/pick-formats.md).
183
+
184
+ ## Configuration
185
+
186
+ Settings are grouped by pipeline stage and resolved through five layers —
187
+ package defaults, a committed `specmod.toml`, a gitignored
188
+ `specmod.local.toml`, `SPECMOD_*` environment variables, then explicit
189
+ arguments:
190
+
191
+ ```sh
192
+ specmod config show # resolved values, and which layer set each one
193
+ specmod config freeze # emit TOML to commit alongside a result
194
+ ```
195
+
196
+ Package defaults reproduce the behaviour that shipped before the refactor, so
197
+ upgrading does not silently move anyone's numbers. A study pins its own values
198
+ in a committed file — see [`studies/magna_2020_paper.toml`](studies/magna_2020_paper.toml),
199
+ which transcribes the workflow of the Magna paper below.
200
+
201
+ Every output records the configuration that produced it, a hash of it, and the
202
+ SpecMod version, so a locally-overridden run is still reproducible from its
203
+ outputs.
204
+
205
+ ## Documentation
206
+
207
+ The full documentation — the pipeline with its equations, the estimator
208
+ comparison, pick formats, and an API reference — builds with Sphinx:
209
+
210
+ ```bash
211
+ uv pip install -e '.[docs]'
212
+ sphinx-build -b html docs docs/_build/html
213
+ ```
214
+
215
+ `docs/REFACTOR_PLAN.md` is excluded from the built site on purpose: it is a
216
+ working document that records decisions and the measurements behind them, not
217
+ documentation for using the package.
218
+
219
+ ## Development
220
+
221
+ ```sh
222
+ uv venv && uv pip install -e ".[dev]"
223
+ pre-commit install # both hook types; not optional
224
+ pytest # test suite
225
+ pytest --without-optional-extras # as a default install and CI see it
226
+ ruff check src/ tests/ tools/ # lint
227
+ ruff format src/ tests/ tools/
228
+ mypy # strict on the rewritten modules
229
+ ```
230
+
231
+ [`docs/development.md`](docs/development.md) is the full guide — the repository
232
+ mapped, every tool and CI check, the branch and commit conventions, and where
233
+ development stops and releasing begins. [`AGENTS.md`](AGENTS.md) is the short
234
+ version that binds AI coding sessions.
235
+
236
+ Run `--without-optional-extras` before pushing. A development environment
237
+ with `specmod[multitaper]` installed will pass tests that a default install
238
+ fails, and CI installs only `[dev]`.
239
+
240
+ The `mypy` override list in `pyproject.toml` is the migration backlog: modules
241
+ leave it as they are rewritten, and the target is an empty list.
242
+
243
+ Command-line entry points are built on [`click`](https://click.palletsprojects.com),
244
+ including internal tooling — one convention across the whole surface.
245
+
246
+ ### Measured numbers in the docs
247
+
248
+ The documentation quotes a lot of measurements, and stale numbers are worse
249
+ than no numbers. Every table that came out of a measurement is generated:
250
+
251
+ ```sh
252
+ python tools/measure_docs.py show # print the tables
253
+ python tools/measure_docs.py write # refresh the docs in place
254
+ python tools/measure_docs.py check # fail if any table is stale
255
+ ```
256
+
257
+ `tests/test_docs_are_current.py` runs `check`, so a change that moves a
258
+ published number fails the suite rather than quietly leaving the prose wrong.
259
+ Measurements that read `tutorial/data/events/` are slower and opt-in via `--field`;
260
+ refresh those by hand after changing an estimator.
261
+
262
+ ### Releasing
263
+
264
+ Commit messages follow [Conventional Commits](https://www.conventionalcommits.org),
265
+ which is what makes the changelog and the version automatic: `release-please`
266
+ opens a standing release pull request, and merging it creates the tag, the
267
+ GitHub Release, the PyPI upload and the Zenodo DOI. Nothing is released until
268
+ that merge. See [`docs/releasing.md`](docs/releasing.md), which also lists the
269
+ repository settings that have to be turned on once.
270
+
271
+ ## References
272
+
273
+ Edwards, B., Allmann, B., Fäh, D., Clinton, J. (2010). Automatic computation of
274
+ moment magnitudes for small earthquakes and the scaling of local to moment
275
+ magnitude. *Geophysical Journal International* 183(1), 407–420.
276
+ <https://doi.org/10.1111/j.1365-246X.2010.04743.x>
277
+
278
+ Holt, J., Whidden, K.M., Koper, K.D., Pankow, K.L., Mayeda, K., Pechmann, J.C.,
279
+ Edwards, B., Gök, R., Walter, W.R. Towards robust and routine determination of
280
+ Mw for small earthquakes: application to the 2020 Mw 5.7 Magna, Utah, seismic
281
+ sequence. *Seismological Research Letters*.
282
+
283
+ Thomson, D.J. (1982). Spectrum estimation and harmonic analysis.
284
+ *Proceedings of the IEEE* 70(9), 1055–1096.
285
+
286
+ ## Contributing
287
+
288
+ Issues and pull requests are welcome. Commits follow
289
+ [Conventional Commits](https://www.conventionalcommits.org), which drives the
290
+ changelog and version bumps.
291
+
292
+ ## License
293
+
294
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,62 @@
1
+ specmod/__init__.py,sha256=jUpGxd9YwXnWe_lV5bbcmFiIxmzJuR6a3kIV8bw6tTs,511
2
+ specmod/acquire.py,sha256=xUkm22b9nXTK1eYpy3grSWzTgHzPf2a1y-dEZFNbk7M,13313
3
+ specmod/api.py,sha256=JP3f_EMjfTEqUSCEDJ0YBZ6ss5lnLWinYM94Syvk53Q,17836
4
+ specmod/cli.py,sha256=m-Rr5ZSbvCmxOL-mqnnR7TEjPtzIdaiwKRQv0YG9YSU,4061
5
+ specmod/datasets.py,sha256=IrOK6x58AuvmucPMmhkduP-kSOdXqfYFiJWkXLg5p0E,11126
6
+ specmod/distance.py,sha256=YZEeATI9Gv3Nbbfa5OAy26sOcxYczEC8ANat0REEq-A,6859
7
+ specmod/exceptions.py,sha256=ygDyk_KOLxifUh_AfChrkM-vShydbEXk8-qxw1Kxnrg,2044
8
+ specmod/io.py,sha256=6tCgN6K23XdnX20BptkFq96asfnEKPoJ5OUoGJJyvVk,10210
9
+ specmod/magnitude.py,sha256=sP9h9etg3Xi9E9lzkgIe0-ZJKscSCbNK-AdrKY-doTM,11168
10
+ specmod/pipeline.py,sha256=BXZdUs126nKEQ19MywNZG8XHowRwKCb1NLt9H_-9QpA,11784
11
+ specmod/plotting.py,sha256=bCWdUrw2wboQORo9aDSHGd53zzFkgpfNuNUrGxqcyYg,7223
12
+ specmod/preprocess.py,sha256=vZDSlmz0rLAbwLJwxYYSEIFDIGYXidRVNJTaekBegGA,18813
13
+ specmod/spreading.py,sha256=SAKOb6nbPt0uiKn_4XQ4KWGdkLTXbgi45pAjluvcMyA,7458
14
+ specmod/staged.py,sha256=5DCOlmMTt38Gi3xSiZTqG0aN5Yle382G3s2CDvStd6M,21512
15
+ specmod/tables.py,sha256=ttduUrv3Nw9XC2B6OuvWa-fOKXVCilMVxbSfDVnPVR4,3999
16
+ specmod/utils.py,sha256=R6ybnJr59LXH5KnCQB5c-AJ3CJK3FSQOrRoWu8_qhQE,11829
17
+ specmod/_vendor/__init__.py,sha256=UV0Dc5ppqpen7PGL8M4Xgq8cC9TofgX8aDf5oWwR7F8,991
18
+ specmod/_vendor/qiinv.py,sha256=l3yntXtiY88jZ2u68ZgXQFtbe9mC-l_pI6MqOiFWhs4,10061
19
+ specmod/config/__init__.py,sha256=mdOZx-8bKOtNSZ76wlh4NUzf7J6Emgm-tMI69pAvEBg,1035
20
+ specmod/config/layers.py,sha256=IlYlMXTtTIOhEPgnBJlyUTn7srADokycaNdH6Ok7fCk,5640
21
+ specmod/config/provenance.py,sha256=4i7QowIVuydld87N3XAfHLAZ7ANe78533Fchrkn8F6s,2439
22
+ specmod/config/sections.py,sha256=rerpE4ygXB2RR1_IjgNsS31VumjcNPg1XOIhw-mYjmc,15866
23
+ specmod/config/serialize.py,sha256=jbmG2WM2LLkvCT_Y0zhfrn1nFXHDx7dL-mZtqRq57us,2067
24
+ specmod/core/__init__.py,sha256=a_ym0xWj_1DQYfHSM4NlerGhU9HTpZPpe8ZmaVcyzRE,882
25
+ specmod/core/bandwidth.py,sha256=OkpALARc3QNpFSw9Tlcqw0kye7FDizgX2C0-gKgvKj8,6293
26
+ specmod/core/collection.py,sha256=JxhpUyiHrySYYpGKkeRUZGC2l1eoA3NDGWy1FLvsg0Y,22004
27
+ specmod/core/noise.py,sha256=pzkgFNu_glG2xtLHPJhkvZNrhWeXPCxxXBg0NmtbNjE,18301
28
+ specmod/core/scalogram.py,sha256=DG4kuiVAVtJoUjnGrEy2jbHf1wNoScKTfNgu7xkgsYc,9499
29
+ specmod/core/spectrum.py,sha256=Xa-fXJW7IrJLoYHwN_-ydSiizNSgwpWf30xuTe5Vj14,13844
30
+ specmod/core/units.py,sha256=XXX0dV8k5loX2vs3Vi1b3xDXQKi9eeb0lLX3OHQtxBw,4857
31
+ specmod/fitting/__init__.py,sha256=QQ1ivYxN5S14r4e2ynYZls9AYNH1GQMLF4PVHfC_i0w,1946
32
+ specmod/fitting/base.py,sha256=4C_FeCPwyaA5x1a0WkqLHOf9MeUpPnBHhP9nVdTaFPw,1941
33
+ specmod/fitting/event.py,sha256=zQwK_5zWFo4NXLqeL_l1c6EdzbPiSO3wcSolfRN-_FY,11663
34
+ specmod/fitting/guess.py,sha256=gXEH435gpw8lPfD0r1aKeGgLOWQ3teoC4NAg4t2xnJc,6906
35
+ specmod/fitting/spectrum.py,sha256=0gSvzxIDdWstK-tPKeR-njiKlP62pw0Sfmcow__jiro,13507
36
+ specmod/picks/__init__.py,sha256=v9llkfvBm5MU4COf1H03oDxMLd1pKMhnR7qek-X3EYQ,6033
37
+ specmod/picks/base.py,sha256=xJq7thhuqJ3xgAyM4qQHXK5etrXoVcWsgsQrN8xVK1o,8452
38
+ specmod/picks/delimited.py,sha256=qEECceD91Z6fUPkSa8auUALoNmfXowtW775FdUsNwq0,7690
39
+ specmod/picks/events.py,sha256=9Mrw5p4AiVV_CTRaZFeAcKB80g_0IknovhHBSAqqeqQ,5542
40
+ specmod/picks/resolution.py,sha256=sYYDOs_qnR3SqKKPzQhvK6hOx8djW1KwtKoFJ0P44Hg,5098
41
+ specmod/picks/snuffler.py,sha256=bbTv-RI0OomGDA_XceCrnSrLaiLxfrfS_e8rjVefsQQ,2795
42
+ specmod/smoothing/__init__.py,sha256=NmUQIKd6z6ECa5hdTMLDS7V-09Yg6O9H6PtVy_oqfhg,1307
43
+ specmod/smoothing/base.py,sha256=GKPi1Fc_DDt8ZtzFLf7u3Uy4qau-OsZiy9Q3Y0FyFrU,1966
44
+ specmod/smoothing/konno_ohmachi.py,sha256=vmzLasw5U947VzYek_6lYjy1fk_I0i2cPoZy5zSddBU,2891
45
+ specmod/smoothing/log_bins.py,sha256=PqQ-43yr1jXreKgKc4si6o3xeTepR4FweZshAqEQDsc,6876
46
+ specmod/sources/__init__.py,sha256=E-g9swZtszfo-K6EY1PpnrKg7B-hcDqnIInhZW_C1Z4,2170
47
+ specmod/sources/attenuation.py,sha256=kpQLP0Br9n6o0pMoxPyjWdymPc7NQR9bF8NzGHzhKHY,2952
48
+ specmod/sources/composite.py,sha256=3dmpwBdBXj8HlKiCNkED03pkCb0YYpw_24HmxXW37hQ,5004
49
+ specmod/sources/motion.py,sha256=l2piORA6AodI2nBMxA8m7Qq_G1SH1BOVpAMGmmwZo0k,1380
50
+ specmod/sources/source.py,sha256=fzw-hLSpIsO2ioqPEM5wkaFrjNlDCd4Nk886fLn33OM,4606
51
+ specmod/transforms/__init__.py,sha256=VQ7qIzhoAJnMXiEO-fkNqBb4MG7VV6vYMY-T3ZJJ3gM,1419
52
+ specmod/transforms/base.py,sha256=RN8ympxUDyFvZYvZoEInju4uI-FdybsaOVhF6-gR0uY,8551
53
+ specmod/transforms/cwt.py,sha256=vaw0XI-ftDQRNEo7mUm4AgpWF22_64v3Ds21QXOV9XA,8905
54
+ specmod/transforms/fft.py,sha256=39ORckHm8Gbp23WQ3dF4fN8V1YGdr-GFuPQk31KD6QI,5219
55
+ specmod/transforms/multitaper.py,sha256=5-5Yed_eGSdyIG3xPLDDh2NxPSs3_VlC4_JT6aIMN8I,15980
56
+ specmod/transforms/prieto.py,sha256=r79Vz5UlZATorlVijhpBLoi7OwOriaifO50AbABwsjM,10757
57
+ specmod/transforms/quadratic.py,sha256=AY40WQRyphewoz3NdKtYj1BtpcFY3O6McMp-TS-RUgU,9500
58
+ specmod-0.2.0.dist-info/METADATA,sha256=J5DmsuFO51LsRUzNA5UNf6dp-OCE3hTpz7AlfjGaERE,11473
59
+ specmod-0.2.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
60
+ specmod-0.2.0.dist-info/entry_points.txt,sha256=BMsuH-YPrljyx9ocZsJQNaG4GPRJxNrbETSIwKGSvyQ,45
61
+ specmod-0.2.0.dist-info/licenses/LICENSE,sha256=Ny0RvbbbP7aV2yCme28RCYJmCljjA5JPINvl2QYyBQg,1067
62
+ specmod-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ specmod = specmod.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 James Holt
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.