cpt-vs-tool 0.1.0b1__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.
- cpt_vs_tool-0.1.0b1/.gitignore +207 -0
- cpt_vs_tool-0.1.0b1/LICENSE +13 -0
- cpt_vs_tool-0.1.0b1/PKG-INFO +146 -0
- cpt_vs_tool-0.1.0b1/README.md +113 -0
- cpt_vs_tool-0.1.0b1/pyproject.toml +66 -0
- cpt_vs_tool-0.1.0b1/src/cpt_vs_tool/__init__.py +64 -0
- cpt_vs_tool-0.1.0b1/src/cpt_vs_tool/vs.py +569 -0
- cpt_vs_tool-0.1.0b1/tests/data/avn_1.csv +582 -0
- cpt_vs_tool-0.1.0b1/tests/data/avn_1_tt.csv +20 -0
- cpt_vs_tool-0.1.0b1/tests/test_cpt_vs_tool.py +71 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
#Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
#uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
#poetry.lock
|
|
109
|
+
#poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
#pdm.lock
|
|
116
|
+
#pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
#pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# SageMath parsed files
|
|
135
|
+
*.sage.py
|
|
136
|
+
|
|
137
|
+
# Environments
|
|
138
|
+
.env
|
|
139
|
+
.envrc
|
|
140
|
+
.venv
|
|
141
|
+
env/
|
|
142
|
+
venv/
|
|
143
|
+
ENV/
|
|
144
|
+
env.bak/
|
|
145
|
+
venv.bak/
|
|
146
|
+
|
|
147
|
+
# Spyder project settings
|
|
148
|
+
.spyderproject
|
|
149
|
+
.spyproject
|
|
150
|
+
|
|
151
|
+
# Rope project settings
|
|
152
|
+
.ropeproject
|
|
153
|
+
|
|
154
|
+
# mkdocs documentation
|
|
155
|
+
/site
|
|
156
|
+
|
|
157
|
+
# mypy
|
|
158
|
+
.mypy_cache/
|
|
159
|
+
.dmypy.json
|
|
160
|
+
dmypy.json
|
|
161
|
+
|
|
162
|
+
# Pyre type checker
|
|
163
|
+
.pyre/
|
|
164
|
+
|
|
165
|
+
# pytype static type analyzer
|
|
166
|
+
.pytype/
|
|
167
|
+
|
|
168
|
+
# Cython debug symbols
|
|
169
|
+
cython_debug/
|
|
170
|
+
|
|
171
|
+
# PyCharm
|
|
172
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
173
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
174
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
175
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
176
|
+
#.idea/
|
|
177
|
+
|
|
178
|
+
# Abstra
|
|
179
|
+
# Abstra is an AI-powered process automation framework.
|
|
180
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
181
|
+
# Learn more at https://abstra.io/docs
|
|
182
|
+
.abstra/
|
|
183
|
+
|
|
184
|
+
# Visual Studio Code
|
|
185
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
186
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
188
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
189
|
+
# .vscode/
|
|
190
|
+
|
|
191
|
+
# Ruff stuff:
|
|
192
|
+
.ruff_cache/
|
|
193
|
+
|
|
194
|
+
# PyPI configuration file
|
|
195
|
+
.pypirc
|
|
196
|
+
|
|
197
|
+
# Cursor
|
|
198
|
+
# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
|
|
199
|
+
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
|
|
200
|
+
# refer to https://docs.cursor.com/context/ignore-files
|
|
201
|
+
.cursorignore
|
|
202
|
+
.cursorindexingignore
|
|
203
|
+
|
|
204
|
+
# Marimo
|
|
205
|
+
marimo/_static/
|
|
206
|
+
marimo/_lsp/
|
|
207
|
+
__marimo__/
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, ZS Zhang, SJ Brandenberg, JP Stewart
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
|
6
|
+
|
|
7
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
|
8
|
+
|
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
|
10
|
+
|
|
11
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
|
12
|
+
|
|
13
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: cpt-vs-tool
|
|
3
|
+
Version: 0.1.0b1
|
|
4
|
+
Summary: Shear wave velocity (Vs) interpretation from seismic CPT data: Zhang et al. CPT-Vs model, Robertson (2012) and layer-based regression.
|
|
5
|
+
Project-URL: Homepage, https://github.com/stefan5kp/cpt_vs_tool
|
|
6
|
+
Project-URL: Repository, https://github.com/stefan5kp/cpt_vs_tool
|
|
7
|
+
Project-URL: Issues, https://github.com/stefan5kp/cpt_vs_tool/issues
|
|
8
|
+
Author: Zhaoting S. Zhang, Scott J. Brandenberg, Jonathan P. Stewart
|
|
9
|
+
License-Expression: BSD-3-Clause
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: CPT,SCPT,Vs,geotechnical,shear wave velocity,site characterization,travel time
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Topic :: Scientific/Engineering
|
|
17
|
+
Requires-Python: >=3.9
|
|
18
|
+
Requires-Dist: matplotlib
|
|
19
|
+
Requires-Dist: ngl-tools
|
|
20
|
+
Requires-Dist: numpy
|
|
21
|
+
Requires-Dist: pwlf
|
|
22
|
+
Requires-Dist: scikit-learn
|
|
23
|
+
Requires-Dist: scipy
|
|
24
|
+
Provides-Extra: notebooks
|
|
25
|
+
Requires-Dist: ipympl; extra == 'notebooks'
|
|
26
|
+
Requires-Dist: ipywidgets; extra == 'notebooks'
|
|
27
|
+
Requires-Dist: jupyter; extra == 'notebooks'
|
|
28
|
+
Requires-Dist: pandas; extra == 'notebooks'
|
|
29
|
+
Provides-Extra: test
|
|
30
|
+
Requires-Dist: pandas; extra == 'test'
|
|
31
|
+
Requires-Dist: pytest; extra == 'test'
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
|
|
34
|
+
# cpt_vs_tool
|
|
35
|
+
|
|
36
|
+
This tool is designed to automate the Vs interpretation process from SCPT. `interpretation_tool` provides the all-in-one tool for interpreting Vs profiles from Zhang et al. (2026), Robertson (2012) and the layer-based regression approach. And `lbr` interpret Vs profiles from the conventional layer-based regression approach using only the travel time data.
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
pip install cpt-vs-tool
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
To run the example notebooks from a clone of this repository, install the package in editable mode with the notebook extras from the repository root:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
pip install -e ".[notebooks]"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Quick Start
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
import numpy as np
|
|
54
|
+
import pandas as pd
|
|
55
|
+
from cpt_vs_tool import compute_profiles, plot_profiles, compute_VsZ, a_coeff
|
|
56
|
+
|
|
57
|
+
cpt = pd.read_csv("avn_1.csv")
|
|
58
|
+
tt = pd.read_csv("avn_1_tt.csv")
|
|
59
|
+
|
|
60
|
+
p = compute_profiles(
|
|
61
|
+
cpt["depth (m)"].to_numpy(), # CPT depth
|
|
62
|
+
cpt["qt (MPa)"].to_numpy(), # qt
|
|
63
|
+
cpt["fs (MPa)"].to_numpy(), # fs
|
|
64
|
+
dGWT=31.0, # groundwater
|
|
65
|
+
TT_depth=tt["depth (m)"].to_numpy(), # travel time depth
|
|
66
|
+
Meas_TT=tt["traveltime (ms)"].to_numpy(), # travel time measurement
|
|
67
|
+
geology="Qal1", # surficial geology
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
plot_profiles(p)
|
|
71
|
+
print(compute_VsZ(p))
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Pass `TT_depth=None, Meas_TT=None` when there is no travel time data; only Zhang et al. (geo) and Robertson (2012) are then computed. Use `LBR` for layer-based regression of travel time data alone.
|
|
75
|
+
|
|
76
|
+
## **User Guide**
|
|
77
|
+
|
|
78
|
+
1. Purely interpret the traveltime data into stepped Vs profiles from SCPT, please use the layer-based regression `lbr` tool.
|
|
79
|
+
2. Interpretation tool interpret Vs profile using Zhang et al. (2026) (geo) - only CPT data, Zhang et al. (2026) (site-specific) - CPT and travel time data, Robertson (2012) and lbr.
|
|
80
|
+
3. Regression and data files for the mand utility tools are included in the `dev/` folder.
|
|
81
|
+
|
|
82
|
+
## Repository Structure
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
cpt_vs_tool/
|
|
86
|
+
├── pyproject.toml # package metadata and dependencies (PyPI: cpt-vs-tool)
|
|
87
|
+
├── requirements.txt # editable install of the package + notebook extras
|
|
88
|
+
├── LICENSE # BSD-3-Clause
|
|
89
|
+
├── src/cpt_vs_tool/ # the installable package
|
|
90
|
+
│ ├── __init__.py # public API (from cpt_vs_tool import ...)
|
|
91
|
+
│ └── vs.py # all functions (CPT processing, Zhang et al. / Robertson models, layer-based regression)
|
|
92
|
+
├── tests/ # pytest suite + sample data (avn_1)
|
|
93
|
+
├── .github/workflows/ # publish.yml: build, test and publish to PyPI on a GitHub release
|
|
94
|
+
├── interpretation_tool/ # example: scpt_tool_v1.ipynb + sample data (avn_1)
|
|
95
|
+
├── lbr/ # example: layerbasedregression.ipynb + sample data
|
|
96
|
+
└── dev/ # model development (not needed to use the tools)
|
|
97
|
+
├── src_files/ # VSPDB query (vspdb_2_query.ipynb) and the CPT, travel time, groundwater and geology tables
|
|
98
|
+
├── groundwater/ # groundwater table depths from Ma et al. (2026) and USGS topography, with validation
|
|
99
|
+
├── data_observation/ # data_observation.ipynb + residual data (cpt_res_data_r3.csv, tt_res_data_r3.csv)
|
|
100
|
+
├── regression/ # model regression: v6_mle.ipynb (maximum likelihood) and bayesian_pymc.ipynb
|
|
101
|
+
├── results/ # results_comparison_gui.ipynb: compares the CPT-Vs models with the measured profiles
|
|
102
|
+
├── sl_validation/ # sl_validation.ipynb: all-in-one tool applied to the Perris and UCD validation sites
|
|
103
|
+
└── utilities/ # geology.ipynb: Wills et al. (2015) surficial geology / Vs30 query (wills_shp/ shapefile)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The tool notebooks import from the installed `cpt_vs_tool` package (see Installation), and all notebooks read their data through relative paths, so run them from inside their own folder. `pip install -r requirements.txt` is equivalent to `pip install -e ".[notebooks]"`; the `dev/` notebooks need additional packages (e.g. pymc, geopandas).
|
|
107
|
+
|
|
108
|
+
Run the tests with `pip install -e ".[test]"` and then `pytest`.
|
|
109
|
+
|
|
110
|
+
## Update Log
|
|
111
|
+
|
|
112
|
+
2026-05-19
|
|
113
|
+
- Correction Made to the Robertson 2012 Calculation in the all-in-one tool.
|
|
114
|
+
- Ergodic model Tool is now available with the most recent version of the model and the corrected Robertson 2012 Calculation.
|
|
115
|
+
|
|
116
|
+
2026-06-01
|
|
117
|
+
- Updated input parameters for the ergodic model to be inverse-filtered qt and fs (Boulanger and DeJong, 2018).
|
|
118
|
+
- Added Kc plot and shading for Ic > 2.6 for ergodic model.
|
|
119
|
+
- Updated name to be Zhang et al. model.
|
|
120
|
+
- Updated the cost function for the layer-based regression tool.
|
|
121
|
+
|
|
122
|
+
2026-06-22
|
|
123
|
+
- Updated input parameters to be qc for the Zhang et al. model (without pore pressure correction).
|
|
124
|
+
- Updated the model offset "a" to be geology specifc.
|
|
125
|
+
|
|
126
|
+
2026-08-25
|
|
127
|
+
- Updated the all-in-one-tool to the most recent version and added function for exporting the site specific Vs result.
|
|
128
|
+
|
|
129
|
+
2026-10-27
|
|
130
|
+
- Consolidated all functions into a single scpt_tool.py at the repository root; each model folder now contains one example notebook and its sample data.
|
|
131
|
+
- Layer-Based Regression now uses the same regression algorithm and cost function as the all-in-one tool.
|
|
132
|
+
|
|
133
|
+
2026-11-01
|
|
134
|
+
- Updated the Zhang et al. model coefficients, Kc and m(Ic) functions, and geology-specific "a" values.
|
|
135
|
+
|
|
136
|
+
2026-11-05
|
|
137
|
+
- Introduced `geology.ipynb` to query Wills et al. (2015) surficial geology units in `dev/utilities`.
|
|
138
|
+
|
|
139
|
+
2026-11-10
|
|
140
|
+
- Introduced `topo.ipynb` and `groundwater.ipynb` to query USGS topo elevation and Ma et al. 2026 groundwater data in `dev/utilities`.
|
|
141
|
+
- Packaged the tool for PyPI as `cpt-vs-tool` (`pip install cpt-vs-tool`): `scpt_tool.py` moved to `src/cpt_vs_tool/vs.py`, and the notebooks now use `from cpt_vs_tool import ...`.
|
|
142
|
+
|
|
143
|
+
## Citations
|
|
144
|
+
Zhang, ZS, SJ Brandenberg, JP Stewart (2026). Algorithm for interpreting velocity profiles from seismic Cone Penetration Test data, 13th National Conference on Earthquake Engineering, Portland, OR, EERI
|
|
145
|
+
|
|
146
|
+
Zhang, ZS, SJ Brandenberg, JP Stewart (2027). CPT-Based Vs Estimation with or without Travel Time Measurements, ASCE2027, Philadelphia, PA, ASCE
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# cpt_vs_tool
|
|
2
|
+
|
|
3
|
+
This tool is designed to automate the Vs interpretation process from SCPT. `interpretation_tool` provides the all-in-one tool for interpreting Vs profiles from Zhang et al. (2026), Robertson (2012) and the layer-based regression approach. And `lbr` interpret Vs profiles from the conventional layer-based regression approach using only the travel time data.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
pip install cpt-vs-tool
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
To run the example notebooks from a clone of this repository, install the package in editable mode with the notebook extras from the repository root:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
pip install -e ".[notebooks]"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
import numpy as np
|
|
21
|
+
import pandas as pd
|
|
22
|
+
from cpt_vs_tool import compute_profiles, plot_profiles, compute_VsZ, a_coeff
|
|
23
|
+
|
|
24
|
+
cpt = pd.read_csv("avn_1.csv")
|
|
25
|
+
tt = pd.read_csv("avn_1_tt.csv")
|
|
26
|
+
|
|
27
|
+
p = compute_profiles(
|
|
28
|
+
cpt["depth (m)"].to_numpy(), # CPT depth
|
|
29
|
+
cpt["qt (MPa)"].to_numpy(), # qt
|
|
30
|
+
cpt["fs (MPa)"].to_numpy(), # fs
|
|
31
|
+
dGWT=31.0, # groundwater
|
|
32
|
+
TT_depth=tt["depth (m)"].to_numpy(), # travel time depth
|
|
33
|
+
Meas_TT=tt["traveltime (ms)"].to_numpy(), # travel time measurement
|
|
34
|
+
geology="Qal1", # surficial geology
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
plot_profiles(p)
|
|
38
|
+
print(compute_VsZ(p))
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Pass `TT_depth=None, Meas_TT=None` when there is no travel time data; only Zhang et al. (geo) and Robertson (2012) are then computed. Use `LBR` for layer-based regression of travel time data alone.
|
|
42
|
+
|
|
43
|
+
## **User Guide**
|
|
44
|
+
|
|
45
|
+
1. Purely interpret the traveltime data into stepped Vs profiles from SCPT, please use the layer-based regression `lbr` tool.
|
|
46
|
+
2. Interpretation tool interpret Vs profile using Zhang et al. (2026) (geo) - only CPT data, Zhang et al. (2026) (site-specific) - CPT and travel time data, Robertson (2012) and lbr.
|
|
47
|
+
3. Regression and data files for the mand utility tools are included in the `dev/` folder.
|
|
48
|
+
|
|
49
|
+
## Repository Structure
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
cpt_vs_tool/
|
|
53
|
+
├── pyproject.toml # package metadata and dependencies (PyPI: cpt-vs-tool)
|
|
54
|
+
├── requirements.txt # editable install of the package + notebook extras
|
|
55
|
+
├── LICENSE # BSD-3-Clause
|
|
56
|
+
├── src/cpt_vs_tool/ # the installable package
|
|
57
|
+
│ ├── __init__.py # public API (from cpt_vs_tool import ...)
|
|
58
|
+
│ └── vs.py # all functions (CPT processing, Zhang et al. / Robertson models, layer-based regression)
|
|
59
|
+
├── tests/ # pytest suite + sample data (avn_1)
|
|
60
|
+
├── .github/workflows/ # publish.yml: build, test and publish to PyPI on a GitHub release
|
|
61
|
+
├── interpretation_tool/ # example: scpt_tool_v1.ipynb + sample data (avn_1)
|
|
62
|
+
├── lbr/ # example: layerbasedregression.ipynb + sample data
|
|
63
|
+
└── dev/ # model development (not needed to use the tools)
|
|
64
|
+
├── src_files/ # VSPDB query (vspdb_2_query.ipynb) and the CPT, travel time, groundwater and geology tables
|
|
65
|
+
├── groundwater/ # groundwater table depths from Ma et al. (2026) and USGS topography, with validation
|
|
66
|
+
├── data_observation/ # data_observation.ipynb + residual data (cpt_res_data_r3.csv, tt_res_data_r3.csv)
|
|
67
|
+
├── regression/ # model regression: v6_mle.ipynb (maximum likelihood) and bayesian_pymc.ipynb
|
|
68
|
+
├── results/ # results_comparison_gui.ipynb: compares the CPT-Vs models with the measured profiles
|
|
69
|
+
├── sl_validation/ # sl_validation.ipynb: all-in-one tool applied to the Perris and UCD validation sites
|
|
70
|
+
└── utilities/ # geology.ipynb: Wills et al. (2015) surficial geology / Vs30 query (wills_shp/ shapefile)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The tool notebooks import from the installed `cpt_vs_tool` package (see Installation), and all notebooks read their data through relative paths, so run them from inside their own folder. `pip install -r requirements.txt` is equivalent to `pip install -e ".[notebooks]"`; the `dev/` notebooks need additional packages (e.g. pymc, geopandas).
|
|
74
|
+
|
|
75
|
+
Run the tests with `pip install -e ".[test]"` and then `pytest`.
|
|
76
|
+
|
|
77
|
+
## Update Log
|
|
78
|
+
|
|
79
|
+
2026-05-19
|
|
80
|
+
- Correction Made to the Robertson 2012 Calculation in the all-in-one tool.
|
|
81
|
+
- Ergodic model Tool is now available with the most recent version of the model and the corrected Robertson 2012 Calculation.
|
|
82
|
+
|
|
83
|
+
2026-06-01
|
|
84
|
+
- Updated input parameters for the ergodic model to be inverse-filtered qt and fs (Boulanger and DeJong, 2018).
|
|
85
|
+
- Added Kc plot and shading for Ic > 2.6 for ergodic model.
|
|
86
|
+
- Updated name to be Zhang et al. model.
|
|
87
|
+
- Updated the cost function for the layer-based regression tool.
|
|
88
|
+
|
|
89
|
+
2026-06-22
|
|
90
|
+
- Updated input parameters to be qc for the Zhang et al. model (without pore pressure correction).
|
|
91
|
+
- Updated the model offset "a" to be geology specifc.
|
|
92
|
+
|
|
93
|
+
2026-08-25
|
|
94
|
+
- Updated the all-in-one-tool to the most recent version and added function for exporting the site specific Vs result.
|
|
95
|
+
|
|
96
|
+
2026-10-27
|
|
97
|
+
- Consolidated all functions into a single scpt_tool.py at the repository root; each model folder now contains one example notebook and its sample data.
|
|
98
|
+
- Layer-Based Regression now uses the same regression algorithm and cost function as the all-in-one tool.
|
|
99
|
+
|
|
100
|
+
2026-11-01
|
|
101
|
+
- Updated the Zhang et al. model coefficients, Kc and m(Ic) functions, and geology-specific "a" values.
|
|
102
|
+
|
|
103
|
+
2026-11-05
|
|
104
|
+
- Introduced `geology.ipynb` to query Wills et al. (2015) surficial geology units in `dev/utilities`.
|
|
105
|
+
|
|
106
|
+
2026-11-10
|
|
107
|
+
- Introduced `topo.ipynb` and `groundwater.ipynb` to query USGS topo elevation and Ma et al. 2026 groundwater data in `dev/utilities`.
|
|
108
|
+
- Packaged the tool for PyPI as `cpt-vs-tool` (`pip install cpt-vs-tool`): `scpt_tool.py` moved to `src/cpt_vs_tool/vs.py`, and the notebooks now use `from cpt_vs_tool import ...`.
|
|
109
|
+
|
|
110
|
+
## Citations
|
|
111
|
+
Zhang, ZS, SJ Brandenberg, JP Stewart (2026). Algorithm for interpreting velocity profiles from seismic Cone Penetration Test data, 13th National Conference on Earthquake Engineering, Portland, OR, EERI
|
|
112
|
+
|
|
113
|
+
Zhang, ZS, SJ Brandenberg, JP Stewart (2027). CPT-Based Vs Estimation with or without Travel Time Measurements, ASCE2027, Philadelphia, PA, ASCE
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling>=1.26"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "cpt-vs-tool"
|
|
7
|
+
version = "0.1.0b1"
|
|
8
|
+
description = "Shear wave velocity (Vs) interpretation from seismic CPT data: Zhang et al. CPT-Vs model, Robertson (2012) and layer-based regression."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "BSD-3-Clause"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.9"
|
|
13
|
+
authors = [
|
|
14
|
+
{ name = "Zhaoting S. Zhang" },
|
|
15
|
+
{ name = "Scott J. Brandenberg" },
|
|
16
|
+
{ name = "Jonathan P. Stewart" },
|
|
17
|
+
]
|
|
18
|
+
keywords = ["CPT", "SCPT", "shear wave velocity", "Vs", "geotechnical", "site characterization", "travel time"]
|
|
19
|
+
classifiers = [
|
|
20
|
+
"Development Status :: 4 - Beta",
|
|
21
|
+
"Intended Audience :: Science/Research",
|
|
22
|
+
"Operating System :: OS Independent",
|
|
23
|
+
"Programming Language :: Python :: 3",
|
|
24
|
+
"Topic :: Scientific/Engineering",
|
|
25
|
+
]
|
|
26
|
+
dependencies = [
|
|
27
|
+
"numpy",
|
|
28
|
+
"scipy",
|
|
29
|
+
"matplotlib",
|
|
30
|
+
"pwlf",
|
|
31
|
+
"ngl_tools",
|
|
32
|
+
# ngl_tools.smt imports scikit-learn but does not declare it as a dependency
|
|
33
|
+
"scikit-learn",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
[project.optional-dependencies]
|
|
37
|
+
# Extra packages needed to run the example notebooks in interpretation_tool/ and lbr/
|
|
38
|
+
notebooks = [
|
|
39
|
+
"pandas",
|
|
40
|
+
"ipywidgets",
|
|
41
|
+
"ipympl",
|
|
42
|
+
"jupyter",
|
|
43
|
+
]
|
|
44
|
+
test = ["pytest", "pandas"]
|
|
45
|
+
|
|
46
|
+
[project.urls]
|
|
47
|
+
Homepage = "https://github.com/stefan5kp/cpt_vs_tool"
|
|
48
|
+
Repository = "https://github.com/stefan5kp/cpt_vs_tool"
|
|
49
|
+
Issues = "https://github.com/stefan5kp/cpt_vs_tool/issues"
|
|
50
|
+
|
|
51
|
+
[tool.hatch.build.targets.wheel]
|
|
52
|
+
packages = ["src/cpt_vs_tool"]
|
|
53
|
+
|
|
54
|
+
[tool.hatch.build.targets.sdist]
|
|
55
|
+
# Keep the source distribution small: the package, tests and metadata only (no dev/ data or notebooks)
|
|
56
|
+
include = [
|
|
57
|
+
"src/cpt_vs_tool",
|
|
58
|
+
"tests",
|
|
59
|
+
"README.md",
|
|
60
|
+
"LICENSE",
|
|
61
|
+
"pyproject.toml",
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
[tool.pytest.ini_options]
|
|
65
|
+
testpaths = ["tests"]
|
|
66
|
+
filterwarnings = ["ignore:FigureCanvasAgg is non-interactive:UserWarning"]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Shear wave velocity (Vs) interpretation from seismic cone penetration test (SCPT) data.
|
|
2
|
+
|
|
3
|
+
Provides the Zhang et al. (2026) CPT-Vs model (geology-specific and site-specific),
|
|
4
|
+
Robertson (2012), and layer-based regression (LBR) of travel time data.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
8
|
+
|
|
9
|
+
from .vs import (
|
|
10
|
+
LBR,
|
|
11
|
+
VsZ_CPT,
|
|
12
|
+
VsZ_layered,
|
|
13
|
+
a_coeff,
|
|
14
|
+
b_coeff,
|
|
15
|
+
compute_profiles,
|
|
16
|
+
compute_VsZ,
|
|
17
|
+
gamma_t,
|
|
18
|
+
get_CPT,
|
|
19
|
+
get_TT,
|
|
20
|
+
interleave,
|
|
21
|
+
layer_average_velocity,
|
|
22
|
+
layer_travel_time,
|
|
23
|
+
optimize,
|
|
24
|
+
optimized_regression,
|
|
25
|
+
pair_layers,
|
|
26
|
+
plot_profiles,
|
|
27
|
+
predicted_DTT,
|
|
28
|
+
regression,
|
|
29
|
+
regression_full_manual,
|
|
30
|
+
robertson_2012,
|
|
31
|
+
site_specific,
|
|
32
|
+
zhang_vs,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
__version__ = version("cpt-vs-tool")
|
|
37
|
+
except PackageNotFoundError: # running from a source checkout that is not installed
|
|
38
|
+
__version__ = "0+unknown"
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
"LBR",
|
|
42
|
+
"VsZ_CPT",
|
|
43
|
+
"VsZ_layered",
|
|
44
|
+
"a_coeff",
|
|
45
|
+
"b_coeff",
|
|
46
|
+
"compute_profiles",
|
|
47
|
+
"compute_VsZ",
|
|
48
|
+
"gamma_t",
|
|
49
|
+
"get_CPT",
|
|
50
|
+
"get_TT",
|
|
51
|
+
"interleave",
|
|
52
|
+
"layer_average_velocity",
|
|
53
|
+
"layer_travel_time",
|
|
54
|
+
"optimize",
|
|
55
|
+
"optimized_regression",
|
|
56
|
+
"pair_layers",
|
|
57
|
+
"plot_profiles",
|
|
58
|
+
"predicted_DTT",
|
|
59
|
+
"regression",
|
|
60
|
+
"regression_full_manual",
|
|
61
|
+
"robertson_2012",
|
|
62
|
+
"site_specific",
|
|
63
|
+
"zhang_vs",
|
|
64
|
+
]
|