pyadps 0.1.1__tar.gz → 0.2.1b0__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.
- {pyadps-0.1.1 → pyadps-0.2.1b0}/PKG-INFO +5 -5
- {pyadps-0.1.1 → pyadps-0.2.1b0}/pyproject.toml +10 -10
- pyadps-0.2.1b0/src/pyadps/Home_Page.py +42 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/pages/01_Read_File.py +19 -188
- pyadps-0.2.1b0/src/pyadps/pages/02_View_Raw_Data.py +128 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/pages/03_Download_Raw_File.py +61 -149
- pyadps-0.2.1b0/src/pyadps/pages/04_QC_Test.py +334 -0
- pyadps-0.2.1b0/src/pyadps/pages/05_Profile_Test.py +575 -0
- pyadps-0.2.1b0/src/pyadps/pages/06_Velocity_Test.py +341 -0
- pyadps-0.2.1b0/src/pyadps/pages/07_Write_File.py +452 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/__init__.py +3 -3
- pyadps-0.2.1b0/src/pyadps/utils/autoprocess.py +282 -0
- pyadps-0.1.1/src/pyadps/utils/plotgen.py → pyadps-0.2.1b0/src/pyadps/utils/cutbin.py +14 -332
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/metadata/config.ini +4 -22
- pyadps-0.2.1b0/src/pyadps/utils/plotgen.py +229 -0
- pyadps-0.2.1b0/src/pyadps/utils/profile_test.py +187 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/pyreadrdi.py +17 -27
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/readrdi.py +18 -164
- pyadps-0.1.1/src/pyadps/utils/__pycache__/regrid.cpython-312.pyc → pyadps-0.2.1b0/src/pyadps/utils/regrid.py +0 -0
- pyadps-0.2.1b0/src/pyadps/utils/script.py +155 -0
- pyadps-0.2.1b0/src/pyadps/utils/signal_quality.py +135 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/velocity_test.py +31 -79
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/writenc.py +21 -155
- pyadps-0.1.1/src/pyadps/Home_Page.py +0 -48
- pyadps-0.1.1/src/pyadps/pages/02_View_Raw_Data.py +0 -164
- pyadps-0.1.1/src/pyadps/pages/04_Sensor_Health.py +0 -905
- pyadps-0.1.1/src/pyadps/pages/05_QC_Test.py +0 -476
- pyadps-0.1.1/src/pyadps/pages/06_Profile_Test.py +0 -971
- pyadps-0.1.1/src/pyadps/pages/07_Velocity_Test.py +0 -600
- pyadps-0.1.1/src/pyadps/pages/08_Write_File.py +0 -587
- pyadps-0.1.1/src/pyadps/pages/09_Auto_process.py +0 -64
- pyadps-0.1.1/src/pyadps/pages/__pycache__/__init__.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/__init__.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/autoprocess.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/cutbin.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/plotgen.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/profile_test.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/pyreadrdi.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/readrdi.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/script.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/sensor_health.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/signal_quality.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/velocity_test.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/__pycache__/writenc.cpython-312.pyc +0 -0
- pyadps-0.1.1/src/pyadps/utils/autoprocess.py +0 -548
- pyadps-0.1.1/src/pyadps/utils/metadata/demo.000 +0 -0
- pyadps-0.1.1/src/pyadps/utils/profile_test.py +0 -556
- pyadps-0.1.1/src/pyadps/utils/script.py +0 -205
- pyadps-0.1.1/src/pyadps/utils/sensor_health.py +0 -120
- pyadps-0.1.1/src/pyadps/utils/signal_quality.py +0 -455
- {pyadps-0.1.1 → pyadps-0.2.1b0}/LICENSE +0 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/README.md +0 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/__init__.py +0 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/__main__.py +0 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/pages/__init__.py +0 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/metadata/flmeta.json +0 -0
- {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/metadata/vlmeta.json +0 -0
@@ -1,8 +1,8 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.1
|
2
2
|
Name: pyadps
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.2.1b0
|
4
4
|
Summary: A Python package for ADCP data processing
|
5
|
-
Home-page: https://
|
5
|
+
Home-page: https://example.com
|
6
6
|
License: MIT
|
7
7
|
Keywords: adcp,data-processing,oceanography
|
8
8
|
Author: P. Amol
|
@@ -22,10 +22,10 @@ Requires-Dist: numpy (>=1.26.4)
|
|
22
22
|
Requires-Dist: pandas (>=2.2.2)
|
23
23
|
Requires-Dist: plotly (>=5.22.0)
|
24
24
|
Requires-Dist: plotly-resampler (>=0.10.0)
|
25
|
-
Requires-Dist: pygeomag (>=1.1.0,<2.0.0)
|
26
25
|
Requires-Dist: scipy (>=1.14.0)
|
27
26
|
Requires-Dist: streamlit (>=1.36.0)
|
28
|
-
|
27
|
+
Requires-Dist: wmm2020 (>=1.1.1)
|
28
|
+
Project-URL: Documentation, https://example.com/docs
|
29
29
|
Project-URL: Repository, https://github.com/p-amol/pyadps
|
30
30
|
Description-Content-Type: text/markdown
|
31
31
|
|
@@ -1,19 +1,19 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "pyadps"
|
3
|
-
version = "0.
|
3
|
+
version = "0.2.1-beta"
|
4
4
|
description = "A Python package for ADCP data processing"
|
5
5
|
authors = ["P. Amol <prakashamol@gmail.com>"]
|
6
6
|
readme = "README.md"
|
7
7
|
license = "MIT"
|
8
|
-
homepage = "https://
|
9
|
-
repository = "https://github.com/p-amol/pyadps"
|
10
|
-
documentation = "https://
|
8
|
+
homepage = "https://example.com" # You can add your homepage URL or GitHub URL here
|
9
|
+
repository = "https://github.com/p-amol/pyadps" # Replace with your repository link
|
10
|
+
documentation = "https://example.com/docs" # Optional documentation link
|
11
11
|
keywords = ["adcp", "data-processing", "oceanography"]
|
12
12
|
include = ["utils/metadata/*.json"]
|
13
13
|
classifiers = [
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
"Programming Language :: Python :: 3",
|
15
|
+
"License :: OSI Approved :: MIT License",
|
16
|
+
"Operating System :: OS Independent"
|
17
17
|
]
|
18
18
|
|
19
19
|
|
@@ -23,14 +23,13 @@ streamlit = ">=1.36.0"
|
|
23
23
|
numpy = ">=1.26.4"
|
24
24
|
matplotlib = ">=3.8.4"
|
25
25
|
scipy = ">=1.14.0"
|
26
|
+
wmm2020 = ">=1.1.1"
|
26
27
|
cmake = ">=3.30.2"
|
27
28
|
pandas = ">=2.2.2"
|
28
29
|
netCDF4 = ">=1.7.1"
|
29
30
|
plotly = ">=5.22.0"
|
30
31
|
plotly-resampler = ">=0.10.0"
|
31
32
|
meson = ">=1.4.1"
|
32
|
-
pygeomag = "^1.1.0"
|
33
|
-
|
34
33
|
|
35
34
|
[tool.poetry.extras]
|
36
35
|
tests = ["pytest"]
|
@@ -38,8 +37,9 @@ tests = ["pytest"]
|
|
38
37
|
[tool.poetry.scripts]
|
39
38
|
run-pyadps = "pyadps.__main__:main"
|
40
39
|
run-auto = "pyadps.utils.autoprocess:main"
|
41
|
-
run-script = "pyadps.utils.script:main"
|
42
40
|
|
43
41
|
[build-system]
|
44
42
|
requires = ["poetry-core>=1.0.0"]
|
45
43
|
build-backend = "poetry.core.masonry.api"
|
44
|
+
|
45
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import streamlit as st
|
2
|
+
|
3
|
+
|
4
|
+
def main():
|
5
|
+
st.set_page_config(
|
6
|
+
page_title="ADCP Data Processing Software",
|
7
|
+
page_icon=":world_map:️",
|
8
|
+
layout="wide",
|
9
|
+
initial_sidebar_state="auto",
|
10
|
+
menu_items={
|
11
|
+
"Get Help": "http://github.com/p-amol/adps",
|
12
|
+
"Report a bug": "http://github.com/adps/issues",
|
13
|
+
"About": "# Python ADCP Data Processing Software (PyADPS)",
|
14
|
+
},
|
15
|
+
)
|
16
|
+
|
17
|
+
"""
|
18
|
+
# **Python ADCP Data Processing Software (pyadps)**
|
19
|
+
`pyadps` is a software for processing Teledyne RDI Acoustic Doppler Current Profiler (ADCP) PD0 files. Currently the software can process the data from Workhorse ADCPs.
|
20
|
+
|
21
|
+
## Features
|
22
|
+
|
23
|
+
* Access RDI ADCP binary files using Python 3
|
24
|
+
* Convert RDI binary files to netcdf
|
25
|
+
* Process ADCP data
|
26
|
+
|
27
|
+
## Contribute
|
28
|
+
Issue Tracker: http://github.com/adps/issues
|
29
|
+
Source Code: http://github.com/p-amol/adps
|
30
|
+
|
31
|
+
## Support
|
32
|
+
If you are having issues, please let us know.
|
33
|
+
We have a mailing list located at: adps-python@google-groups.com
|
34
|
+
|
35
|
+
## License
|
36
|
+
The project is licensed under the MIT license.
|
37
|
+
|
38
|
+
"""
|
39
|
+
|
40
|
+
|
41
|
+
if __name__ == "__main__":
|
42
|
+
main()
|
@@ -1,15 +1,12 @@
|
|
1
1
|
import os
|
2
2
|
import tempfile
|
3
3
|
|
4
|
-
import numpy as np
|
5
4
|
import pandas as pd
|
6
5
|
import streamlit as st
|
7
6
|
import utils.readrdi as rd
|
7
|
+
import utils.writenc as wr
|
8
|
+
from streamlit.runtime.state import session_state
|
8
9
|
from utils.signal_quality import default_mask
|
9
|
-
from utils.readrdi import ReadFile
|
10
|
-
|
11
|
-
# To make the page wider if the user presses the reload button.
|
12
|
-
st.set_page_config(layout="wide")
|
13
10
|
|
14
11
|
"""
|
15
12
|
Streamlit page to load ADCP binary file and display File Header
|
@@ -113,7 +110,7 @@ if uploaded_file is not None:
|
|
113
110
|
correlation = ds.correlation.data
|
114
111
|
echo = ds.echo.data
|
115
112
|
pgood = ds.percentgood.data
|
116
|
-
beamdir = ds.fixedleader.system_configuration()[
|
113
|
+
beamdir = ds.fixedleader.system_configuration()['Beam Direction']
|
117
114
|
|
118
115
|
st.session_state.fname = uploaded_file.name
|
119
116
|
st.session_state.head = ds.fileheader
|
@@ -124,14 +121,6 @@ if uploaded_file is not None:
|
|
124
121
|
st.session_state.correlation = ds.correlation.data
|
125
122
|
st.session_state.pgood = ds.percentgood.data
|
126
123
|
st.session_state.beam_direction = beamdir
|
127
|
-
st.session_state.sound_speed = ds.variableleader.speed_of_sound.data
|
128
|
-
st.session_state.depth = ds.variableleader.depth_of_transducer.data
|
129
|
-
st.session_state.temperature = (
|
130
|
-
ds.variableleader.temperature.data * ds.variableleader.temperature.scale
|
131
|
-
)
|
132
|
-
st.session_state.salinity = (
|
133
|
-
ds.variableleader.salinity.data * ds.variableleader.salinity.scale
|
134
|
-
)
|
135
124
|
|
136
125
|
# st.session_state.flead = flead
|
137
126
|
# st.session_state.vlead = vlead
|
@@ -145,9 +134,6 @@ if uploaded_file is not None:
|
|
145
134
|
elif "flead" in st.session_state:
|
146
135
|
st.write("You selected `%s`" % st.session_state.fname)
|
147
136
|
else:
|
148
|
-
# reset the cache and resources if the user press reload button.
|
149
|
-
st.cache_data.clear()
|
150
|
-
st.cache_resource.clear()
|
151
137
|
st.stop()
|
152
138
|
|
153
139
|
########## TIME AXIS ##############
|
@@ -182,157 +168,10 @@ date_df = pd.DataFrame(
|
|
182
168
|
st.session_state.date = pd.to_datetime(date_df)
|
183
169
|
st.session_state.date1 = pd.to_datetime(date_df)
|
184
170
|
st.session_state.date2 = pd.to_datetime(date_df)
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
# ---------- Initialize all options -------------
|
191
|
-
# ------------------------
|
192
|
-
# Page: Download Raw File
|
193
|
-
# ------------------------
|
194
|
-
# Widgets
|
195
|
-
st.session_state.add_attributes_DRW = "No"
|
196
|
-
st.session_state.axis_option_DRW = "time"
|
197
|
-
st.session_state.rawnc_download_DRW = False
|
198
|
-
st.session_state.vleadnc_download_DRW = False
|
199
|
-
st.session_state.rawcsv_option_DRW = "Velocity"
|
200
|
-
st.session_state.rawcsv_beam_DRW = 1
|
201
|
-
st.session_state.rawcsv_download_DRW = False
|
202
|
-
|
203
|
-
# ------------------
|
204
|
-
# Page: Sensor Test
|
205
|
-
# ------------------
|
206
|
-
st.session_state.isSensorTest = False
|
207
|
-
st.session_state.isFirstSensorVisit = True
|
208
|
-
|
209
|
-
# -- Tab 1: Depth Correction
|
210
|
-
st.session_state.isDepthModified_ST = False
|
211
|
-
# Widgets
|
212
|
-
# Options: "Fixed Value", "File Upload"
|
213
|
-
st.session_state.depthoption_ST = "Fixed Value"
|
214
|
-
st.session_state.isFixedDepth_ST = False
|
215
|
-
st.session_state.fixeddepth_ST = 0
|
216
|
-
st.session_state.isUploadDepth_ST = False
|
217
|
-
|
218
|
-
# -- Tab 2: Salinity Correction
|
219
|
-
st.session_state.isSalinityModified_ST = False
|
220
|
-
# Widgets
|
221
|
-
st.session_state.salinityoption_ST = "Fixed Value"
|
222
|
-
st.session_state.isFixedSalinity_ST = False
|
223
|
-
st.session_state.fixedsalinity_ST = 35
|
224
|
-
st.session_state.isUploadSalinity_ST = False
|
225
|
-
|
226
|
-
# -- Tab 3: Temperature Correction
|
227
|
-
st.session_state.isTemperatureModified_ST = False
|
228
|
-
# Widgets
|
229
|
-
st.session_state.temperatureoption_ST = "Fixed Value"
|
230
|
-
st.session_state.isFixedTemperature_ST = False
|
231
|
-
st.session_state.fixedtemperature_ST = 0
|
232
|
-
st.session_state.isUploadTemperature_ST = False
|
233
|
-
|
234
|
-
# -- Tab 7: Pitch, Roll, Velocity Correction
|
235
|
-
st.session_state.isRollCheck_ST = False
|
236
|
-
st.session_state.isPitchCheck_ST = False
|
237
|
-
st.session_state.isVelocityModifiedSound_ST = False
|
238
|
-
# Widgets
|
239
|
-
st.session_state.roll_cutoff_ST = 359
|
240
|
-
st.session_state.pitch_cutoff_ST = 359
|
241
|
-
|
242
|
-
# ------------------
|
243
|
-
# Page: QC Test
|
244
|
-
# ------------------
|
245
|
-
# Global Test
|
246
|
-
st.session_state.isQCTest = False
|
247
|
-
st.session_state.isFirstQCVisit = True
|
248
|
-
|
249
|
-
# Tab 2: Apply QC
|
250
|
-
st.session_state.isQCCheck_QCT = False
|
251
|
-
# Widgets
|
252
|
-
st.session_state.ct_QCT = 64
|
253
|
-
st.session_state.et_QCT = 0
|
254
|
-
st.session_state.evt_QCT = 2000
|
255
|
-
st.session_state.ft_QCT = 50
|
256
|
-
st.session_state.is3beam_QCT = True
|
257
|
-
st.session_state.pgt_QCT = 0
|
258
|
-
|
259
|
-
# Data Modifications
|
260
|
-
st.session_state.isBeamModified_QCT = False
|
261
|
-
# Widgets
|
262
|
-
st.session_state.beam_direction_QCT = st.session_state.beam_direction
|
263
|
-
|
264
|
-
# ------------------
|
265
|
-
# Page: Profile Test
|
266
|
-
# ------------------
|
267
|
-
st.session_state.isProfileTest = False
|
268
|
-
st.session_state.isFirstProfileVisit = True
|
269
|
-
|
270
|
-
# Tab1: Trim Ends
|
271
|
-
st.session_state.isTrimEndsCheck_PT = False
|
272
|
-
# Widgets
|
273
|
-
st.session_state.start_ens_PT = 0
|
274
|
-
st.session_state.end_ens_PT = st.session_state.head.ensembles
|
275
|
-
|
276
|
-
# Tab2: Cutbins - Sidelobe
|
277
|
-
st.session_state.isCutBinSideLobeCheck_PT = False
|
278
|
-
st.session_state.extra_cells_PT = 0
|
279
|
-
st.session_state.water_depth_PT = 0
|
280
|
-
|
281
|
-
# Tab3: Cutbins - Manual
|
282
|
-
st.session_state.isCutBinManualCheck_PT = False
|
283
|
-
|
284
|
-
# Tab4: Regrid
|
285
|
-
st.session_state.isRegridCheck_PT = False
|
286
|
-
st.session_state.end_cell_option_PT = "Cell"
|
287
|
-
st.session_state.interpolate_PT = "nearest"
|
288
|
-
st.session_state.manualdepth_PT = 0
|
289
|
-
|
290
|
-
# ------------------
|
291
|
-
# Page: Velocity Test
|
292
|
-
# ------------------
|
293
|
-
# Global Test
|
294
|
-
st.session_state.isVelocityTest = False
|
295
|
-
# Check if visiting the page first time
|
296
|
-
st.session_state.isFirstVelocityVisit = True
|
297
|
-
# Local Tests:
|
298
|
-
# Tab1: Magnetic Declination
|
299
|
-
st.session_state.isMagnetCheck_VT = False
|
300
|
-
# OPTIONS: pygeomag, API, Manual
|
301
|
-
st.session_state.magnet_method_VT = "pygeomag"
|
302
|
-
st.session_state.magnet_lat_VT = 0
|
303
|
-
st.session_state.magnet_lon_VT = 0
|
304
|
-
st.session_state.magnet_year_VT = 2025
|
305
|
-
st.session_state.magnet_depth_VT = 0
|
306
|
-
st.session_state.magnet_user_input_VT = 0
|
307
|
-
|
308
|
-
# Tab2: Velocity Cutoff
|
309
|
-
st.session_state.isCutoffCheck_VT = False
|
310
|
-
st.session_state.maxuvel_VT = 250
|
311
|
-
st.session_state.maxvvel_VT = 250
|
312
|
-
st.session_state.maxwvel_VT = 15
|
313
|
-
|
314
|
-
# Tab3: Despike
|
315
|
-
st.session_state.isDespikeCheck_VT = False
|
316
|
-
st.session_state.despike_kernel_VT = 5
|
317
|
-
st.session_state.despike_cutoff_VT = 3
|
318
|
-
|
319
|
-
# Tab4: Flatline
|
320
|
-
st.session_state.isFlatlineCheck_VT = False
|
321
|
-
st.session_state.flatline_kernel_VT = 5
|
322
|
-
st.session_state.flatline_cutoff_VT = 3
|
323
|
-
|
324
|
-
# ------------------
|
325
|
-
# Page: Write File
|
326
|
-
# ------------------
|
327
|
-
st.session_state.isWriteFile = True
|
328
|
-
st.session_state.isAttributes = False
|
329
|
-
st.session_state.mask_data_WF = "Yes"
|
330
|
-
# FileTypes: NetCDF, CSV
|
331
|
-
st.session_state.file_type_WF = "NetCDF"
|
332
|
-
st.session_state.isProcessedNetcdfDownload_WF = True
|
333
|
-
st.session_state.isProcessedCSVDownload_WF = False
|
334
|
-
|
335
|
-
# MASK DATA
|
171
|
+
|
172
|
+
|
173
|
+
|
174
|
+
######### MASK DATA ##############
|
336
175
|
# The velocity data has missing values due to the cutoff
|
337
176
|
# criteria used before deployment. The `default_mask` uses
|
338
177
|
# the velocity to create a mask. This mask file is stored
|
@@ -341,17 +180,16 @@ st.session_state.isProcessedCSVDownload_WF = False
|
|
341
180
|
# WARNING: Never Change `st.session_state.orig_mask` in the code!
|
342
181
|
#
|
343
182
|
if "orig_mask" not in st.session_state:
|
344
|
-
|
345
|
-
|
183
|
+
st.session_state.orig_mask = default_mask(
|
184
|
+
st.session_state.flead, st.session_state.velocity
|
185
|
+
)
|
346
186
|
|
347
|
-
#
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
st.session_state.
|
352
|
-
st.session_state.
|
353
|
-
st.session_state.isProfilePageReturn = False
|
354
|
-
st.session_state.isVelocityPageReturn = False
|
187
|
+
# Checks if the following quality checks are carried out
|
188
|
+
st.session_state.isQCMask = False
|
189
|
+
st.session_state.isProfileMask = False
|
190
|
+
st.session_state.isGrid = False
|
191
|
+
st.session_state.isGridSave = False
|
192
|
+
st.session_state.isVelocityMask = False
|
355
193
|
|
356
194
|
########## FILE HEADER ###############
|
357
195
|
st.header("File Header", divider="blue")
|
@@ -428,18 +266,10 @@ if flead_check_button:
|
|
428
266
|
|
429
267
|
flead_button = st.button("Fixed Leader")
|
430
268
|
if flead_button:
|
431
|
-
# Pandas array should have all elements with same data type.
|
432
|
-
# Except Sl. no., which is np.uint64, rest are np.int64.
|
433
|
-
# Convert all datatype to uint64
|
434
|
-
fl_dict = st.session_state.flead.field().items()
|
435
|
-
new_dict = {}
|
436
|
-
for key, value in fl_dict:
|
437
|
-
new_dict[key] = value.astype(np.uint64)
|
438
|
-
|
439
269
|
df = pd.DataFrame(
|
440
270
|
{
|
441
|
-
"Fields":
|
442
|
-
"Values":
|
271
|
+
"Fields": st.session_state.flead.field().keys(),
|
272
|
+
"Values": st.session_state.flead.field().values(),
|
443
273
|
}
|
444
274
|
)
|
445
275
|
st.dataframe(df, use_container_width=True)
|
@@ -457,3 +287,4 @@ with right:
|
|
457
287
|
df = df.astype("str")
|
458
288
|
st.write((df.style.map(color_bool2)))
|
459
289
|
# st.dataframe(df)
|
290
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
import matplotlib.pyplot as plt
|
2
|
+
import numpy as np
|
3
|
+
import pandas as pd
|
4
|
+
import plotly.express as px
|
5
|
+
import plotly.graph_objects as go
|
6
|
+
import streamlit as st
|
7
|
+
from plotly_resampler import FigureResampler
|
8
|
+
|
9
|
+
if "flead" not in st.session_state:
|
10
|
+
st.write(":red[Please Select Data!]")
|
11
|
+
st.stop()
|
12
|
+
|
13
|
+
# Load data
|
14
|
+
fdata = st.session_state.flead.fleader
|
15
|
+
vdata = st.session_state.vlead.vleader
|
16
|
+
velocity = st.session_state.velocity
|
17
|
+
echo = st.session_state.echo
|
18
|
+
correlation = st.session_state.correlation
|
19
|
+
pgood = st.session_state.pgood
|
20
|
+
|
21
|
+
x = np.arange(0, st.session_state.head.ensembles, 1)
|
22
|
+
y = np.arange(0, fdata["Cells"][0], 1)
|
23
|
+
|
24
|
+
X, Y = np.meshgrid(x, y)
|
25
|
+
|
26
|
+
|
27
|
+
@st.cache_data
|
28
|
+
def fillplot_matplotlib(data):
|
29
|
+
fig, ax = plt.subplots()
|
30
|
+
cs = ax.contourf(X, Y, data)
|
31
|
+
fig.colorbar(cs)
|
32
|
+
st.pyplot(fig)
|
33
|
+
|
34
|
+
|
35
|
+
@st.cache_data
|
36
|
+
def fillplot_plotly(data, colorscale="balance", title="Data", xaxis="time"):
|
37
|
+
if xaxis == "time":
|
38
|
+
xdata = st.session_state.date
|
39
|
+
elif xaxis == "ensemble":
|
40
|
+
xdata = x
|
41
|
+
else:
|
42
|
+
xdata = x
|
43
|
+
fig = FigureResampler(go.Figure())
|
44
|
+
data1 = np.where(data == -32768, np.nan, data)
|
45
|
+
fig.add_trace(
|
46
|
+
go.Heatmap(
|
47
|
+
z=data1[:, 0:-1],
|
48
|
+
x=xdata,
|
49
|
+
y=y,
|
50
|
+
colorscale=colorscale,
|
51
|
+
hoverongaps=False,
|
52
|
+
)
|
53
|
+
)
|
54
|
+
fig.update_layout(
|
55
|
+
xaxis=dict(showline=True, mirror=True),
|
56
|
+
yaxis=dict(showline=True, mirror=True),
|
57
|
+
title_text=title,
|
58
|
+
)
|
59
|
+
st.plotly_chart(fig)
|
60
|
+
|
61
|
+
|
62
|
+
@st.cache_data
|
63
|
+
def lineplot(data, title, xaxis="time"):
|
64
|
+
if xaxis == "time":
|
65
|
+
df = pd.DataFrame({"date": st.session_state.date, title: data})
|
66
|
+
fig = px.line(df, x="date", y=title)
|
67
|
+
else:
|
68
|
+
df = pd.DataFrame({"ensemble": x, title: data})
|
69
|
+
fig = px.line(df, x="ensemble", y=title)
|
70
|
+
|
71
|
+
st.plotly_chart(fig)
|
72
|
+
|
73
|
+
|
74
|
+
# Introduction
|
75
|
+
st.header("View Raw Data", divider="orange")
|
76
|
+
st.write(
|
77
|
+
"""
|
78
|
+
Displays all variables available in the raw file. No processing has been carried out.
|
79
|
+
Data might be missing because of the quality-check criteria used before deployment.\n
|
80
|
+
Either `time` or `ensemble` axis can be chosen as the abscissa (x-axis).
|
81
|
+
The ordinate (y-axis) for the heatmap is `bins` as the depth correction is not applied.
|
82
|
+
"""
|
83
|
+
)
|
84
|
+
xbutton = st.radio("Select an x-axis to plot", ["time", "ensemble"], horizontal=True)
|
85
|
+
|
86
|
+
|
87
|
+
# Fixed Leader Plots
|
88
|
+
st.header("Fixed Leader", divider="blue")
|
89
|
+
fbutton = st.radio("Select a dynamic variable to plot:", fdata.keys(), horizontal=True)
|
90
|
+
lineplot(fdata[fbutton], fbutton, xaxis=str(xbutton))
|
91
|
+
|
92
|
+
# Variable Leader Plots
|
93
|
+
st.header("Variable Leader", divider="blue")
|
94
|
+
vbutton = st.radio("Select a dynamic variable to plot:", vdata.keys(), horizontal=True)
|
95
|
+
lineplot(vdata[vbutton], vbutton, xaxis=str(xbutton))
|
96
|
+
|
97
|
+
basic_options = [
|
98
|
+
"Pressure",
|
99
|
+
"Temperature",
|
100
|
+
"Salinity",
|
101
|
+
"Depth of Transducer",
|
102
|
+
"Heading",
|
103
|
+
"Pitch",
|
104
|
+
"Roll",
|
105
|
+
]
|
106
|
+
|
107
|
+
|
108
|
+
st.header("Velocity, Echo Intensity, Correlation & Percent Good", divider="blue")
|
109
|
+
|
110
|
+
|
111
|
+
def call_plot(varname, beam, xaxis="time"):
|
112
|
+
if varname == "Velocity":
|
113
|
+
fillplot_plotly(velocity[beam - 1, :, :], title=varname, xaxis=xaxis)
|
114
|
+
elif varname == "Echo":
|
115
|
+
fillplot_plotly(echo[beam - 1, :, :], title=varname, xaxis=xaxis)
|
116
|
+
elif varname == "Correlation":
|
117
|
+
fillplot_plotly(correlation[beam - 1, :, :], title=varname, xaxis=xaxis)
|
118
|
+
elif varname == "Percent Good":
|
119
|
+
fillplot_plotly(pgood[beam - 1, :, :], title=varname, xaxis=xaxis)
|
120
|
+
|
121
|
+
|
122
|
+
var_option = st.selectbox(
|
123
|
+
"Select a data type", ("Velocity", "Echo", "Correlation", "Percent Good")
|
124
|
+
)
|
125
|
+
beam = st.radio("Select beam", (1, 2, 3, 4), horizontal=True)
|
126
|
+
call_plot(var_option, beam, xaxis=str(xbutton))
|
127
|
+
|
128
|
+
|